%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%%
%\iffalse
%
% (c) Copyright 2014-2015 Apostolos Syropoulos 
% This program can be redistributed and/or modified under the 
% terms of the LaTeX Project Public License Distributed from 
% http://www.latex-project.org/lppl.txt; either
% version 1.3c of the License, or any later version.
%  
% This work has the LPPL maintenance status `maintained'.
%
% Please report errors or suggestions for improvement to
%
%    Apostolos Syropoulos  (asyropoulos@yahoo.com)
%
%\fi
% \CheckSum{106}
% \iffalse This is a Metacomment
%
%<xespotcolor, >\ProvidesFile{xesporcolor.sty}
%
%<xespotcolor, > [2015/03/21 v1.2 Package `xespotcolor.sty' (bug fix release)]
%
%    \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
\GetFileInfo{xspotcolor.drv}
\usepackage{xltxtra}
\usepackage{fullpage}
\begin{document}
\setmainfont[Mapping=tex-text,Script=Greek]{Arno Pro}
\setmonofont{UM Typewriter}
\setsansfont[Mapping=tex-text]{GFS Neohellenic}
   \DocInput{xespotcolor.dtx}
\end{document}
%</driver>
%    \end{macrocode}
% \fi
%\MakeShortVerb{\|}
%\StopEventually{}
%\title{The \textsf{xespotcolor} package:\\ Spot Colors for \XeLaTeX\ \&\ \LaTeX}
%\author{Apostolos Syropoulos\\
%        Xanthi, Greece\\
%        \texttt{asyropoulos@yahoo.com}}
% \date{2015/03/21}
%\maketitle
% \begin{abstract}
% A spot color is one that is printed with its own ink. Typically, printers use spot colors
% in the production of books or other printed material. The \textsf{spotcolor} package
% by Jens Elstner is a first attempt to introduce the use of spot colors with pdfLaTeX.
% The \textsf{xespotcolor} package is a reimplementation of this package so to be usable with 
% \XeLaTeX\ and \LaTeX+\texttt{dvipdfmx}. As such, it has the same user interface and the same capabilities.
%\end{abstract}
%
%\section{Introduction}
%
% Using spot colors with \XeLaTeX\ is very important since most printers use spot colors in the
% production of books and magazines. The \textsf{spotcolor} package makes it possible to use
% spot colors with pdf\LaTeX\ but it cannot be used with \XeLaTeX\ or \LaTeX. In what follows I first
% describe how to translate certain pdf\TeX\ code snippets into \XeTeX\ or \TeX+\texttt{dvipdfmx} 
% and then I present the code of the package. Thus one can view this text as a short tutorial on how to port 
% pdf\TeX\ code to \XeTeX\ or \TeX+\texttt{dvipdfmx} as well as a description of the functionality of the 
% \textsf{xespotcolor} package. Since the package is a port of a pdf\TeX\ package, it has the same functionality 
% as the original package. 
%
%
% \section{Porting pdf\TeX\ code to \XeTeX\ or \TeX+\texttt{dvipdfmx}}
%
% Translating pdf\TeX\ code, which adds PDF code to the output file, to \XeTeX\ or \TeX+\texttt{dvipdfmx} is not a 
% straightforward exercise  since pdf\TeX\ provides primitive commands that directly access and modify the structure of 
% the resulting PDF file. In the case of \XeTeX\ and \TeX\ one has to use |\special| commands that pass code to the driver. 
% In this particular case, I had to translate code snippets like the following one:
% \begin{center}
%  |1. \newcount\theCNTa                        |\\
%  |2. \newcount\theCNTb                        |\\
%  |3. \def\obj{ 0 R}%                          |\\
%  |4. \pdfobj{Raw PDF code 1}%                 |\\
%  |5. \theCNTa=\the\pdflastobj%                |\\
%  |6. \pdfobj{Raw PDF code \the\theCNTa \obj}% |\\  
%  |7. \theCNTb=\the\pdflastobj%                |\\
%  |8. \pdfrefobj\theCNTa%                      |\\
%  |9. \pdfrefobj\theCNTb%                      |\\
% \end{center}
% Here pdf\TeX\ creates two PDF objects, where the second contains a reference to the first one. The two counters
% defined in lines 1 and 2 are used to reference these two objects. The macro on line 3 is used to create code
% that references an object. The commands on lines 5 and 7 assign the object reference numbers and these numbers are
% used by the |\pdfrefobj| primitive. After some experimentation and some… Googling, I have found out that the following 
% \XeTeX\ code is a reasonable translation of the previous code snipper:
% \begin{center}
%  |\newcount\CNT                       |\\
%  |\newtoks\TOK                        |\\
%  |\TOK={@TOK \the\CNT}%               |\\
%  |\edef\A{\the\TOK Raw PDF code 1}%   |\\
%  |\edef\B{Raw PDF code \the\TOK}%     |\\  
%  |\special{pdf:obj \A}%               |\\
%  |\special{pdf:obj @TOKB\the\CNT \B}% |\\
%  |\advance\CNT by1%                   |\\
% \end{center}
% The two |\edef|initions are used to do the work done by |\pdfobj|. Note that here there I introduce only 
% one unique object and the first two lines define a counter and a token variable. The token variable uses
% the counter to create a unique identifier, which is passed to the driver. This way the driver will 
% create a number of different objects, if required to do so. The last two commands pass the raw PDF
% code and the unique identifier to the driver.
%
% The original package contains a definition identical to the following one:
% \begin{center}
% |\def\R#1{%                                                           |\\
% |   \edef\act{\noexpand\pdfpageresources={\the\pdfpageresources\space |\\
% |          /ColorSpace<<#1>>}}                                        |\\
% |   \act}                                                             |\\
% \end{center}
% The net effect of this command is to add a specific color space to the page resources of all subsequent pages.
% Unfortunately, when the following code is executed, it adds the particular color space to the current page only: 
% \begin{center}
%  |\def\R#1{%                                              |\\
%  |    \special{pdf:put @resources <</ColorSpace <<#1>>>>}}|\\
% \end{center} 
% In order to add the color space to all subsequent pages, I had to use the |\AddEverypageHook| command of
% package \textsf{everypage}. This command modifies the contents of the ship-out box by adding to it its argument. 
% And this is done for every single page. Also, one should note how the page resources are augmented by the two
% systems. In the case of \XeTeX\ we have to create a PDF dictionary that is merged with the current page resources,
% while in the case of pdf\TeX\ one just ``appends'' what is supposed to be included in the page resources dictionary.
% Let me now proceed with the description of the source code of the package.
%
% \section{The Source Code and Package Usage}
% The first part of the code is the identification part.
%    \begin{macrocode}
%<*xespotcolor>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{xespotcolor}
          [2015/03/21 v.1.2, Package for adding Spot Color support to LaTeX/XeLaTeX.]
%    \end{macrocode}
% The package needs three packages in order to operate properly: \textsf{graphics}, \textsf{color}, and \textsf{everypage}.
% The first two packages must be loaded with a driver/engine option, since auto-detection does not work in this case.
% Since the package can be used with either \LaTeX\ or \XeLaTeX\ and the \texttt{dvipdfmx}/\texttt{xdvipdfmx} driver, respectively,
% it is necessary to load these packages with the proper options. Akira Kakuto, who actually discovered that the package can be used 
% with \LaTeX, suggested the following code to properly load these packages:
%    \begin{macrocode}
\RequirePackage{ifxetex}
\ifxetex
   \RequirePackage[xetex]{graphics}
   \RequirePackage[xetex]{color}
\else
   \RequirePackage[dvipdfmx]{graphics}
   \RequirePackage{color}
\fi
\RequirePackage{everypage}
%    \end{macrocode}
% The original package defines two ``Boolean'' variables that are set when the package is loaded with the \texttt{hks} and/or 
% the \texttt{pantone} options, respectively. When these variables are set to true, then the package pre-loads color values in the 
% corresponding color space (i.e., ``hks'' and ``pantone''). These color values are stored in two separate source files.
% These files are part of the original package distribution.
%    \begin{macrocode}
\newif\ifhks\hksfalse
\newif\ifpantone\pantonefalse
\DeclareOption{hks}{\hkstrue}		
\DeclareOption{pantone}{\pantonetrue}	
\ProcessOptions
%    \end{macrocode}
%
% The |\NewSpotColorSpace| command should be used to define a new color space for spot colors. The new color space can be
% any imaginable word! This color space is the place where a new spot color will live. The  \texttt{hks} and 
% the \texttt{pantone} options create two color spaces where the corresponding colors live.
%    \begin{macrocode}
\def\NewSpotColorSpace#1{%
  \expandafter\newtoks\csname #1\endcsname%
  \csname #1\endcsname{}%
}
%    \end{macrocode}
% The |\AddSpotColor| macro should be used to introduce a new spot color. Thus it is one of the first commands on should play 
% with when using this package. This command takes four parameters---the name of a new color 
% space, which has been declared with |\NewSpotColorSpace|, the name of a new color, a name which will be used internally, and a 
% CMYK representation of the new color. For example, here is a typical use of this macro:
% \begin{center}
%|\AddSpotColor{NEWCS}{NEWCOLOR}{Name\SpotSpace in\SpotSpace PDF}{0.5 1.0 0.51 0}|
% \end{center}
% Macro |\SpotSpace| is used to introduce blanks in names. According to the PDF standard a blank is denoted by the
% character sequence |#20| and this is the reason why |\SpotSpace| is defined as follows:
%    \begin{macrocode}
\catcode`\#=12%
\def\SpotSpace{#20}
\catcode`\#=6%
%    \end{macrocode}
%The macro |\csgrab| is quite unsual---it takes two arguments and creates a sequence of them.
%    \begin{macrocode}
\gdef\csgrab#1#2{#2\expandafter{\the#2 #1}}%
%    \end{macrocode}
%Note that this command should never be used by an ordinary package user.
%
% The following variables are used in the definition of macro |\AddSpotColor|. Their functionality has been
% described in the previous section.
%    \begin{macrocode}
\newcount\colorprofilecnt
\newtoks\mycolorprofilename
%    \end{macrocode}
% Macro |\AddSpotColor| first defines a new color profile by assigning a value to |\mycolorprofilename|. The name
% consists of the word |@mycolorprofile| followed by an integer. This name is used in the construction of the
% corresponding PDF object.
%    \begin{macrocode}
\def\AddSpotColor#1#2#3#4{%
  \mycolorprofilename={@mycolorprofile\the\colorprofilecnt}%
%    \end{macrocode}
% The following two macros expand to PDF instructions that define the spot color. The PDF instructions are copied verbatim from 
% the original \textsf{spotcolor} package. 
%    \begin{macrocode}
  \edef\mycolorprofile{\the\mycolorprofilename 
          <</C0[0 0 0 0]/FunctionType 2/C1[#4]/Domain[0 1]/N 1>>}%
  \edef\mycolor{[/Separation/#3 /DeviceCMYK \the\mycolorprofilename]}%
%    \end{macrocode}
% The next two lines have been copied verbatim from the original macro definition.
%    \begin{macrocode}
  \edef\tempcs{/#2 \mycolor}%
  \expandafter\csgrab\expandafter{\tempcs}{\csname #1\endcsname}%
%    \end{macrocode}
% In the last part of the macro definition, the driver is instructed to build two objects which should contain the definition of
% the new spot color. Note that here the macro specifies explicitly the object reference for the second object.
%    \begin{macrocode}  
  \special{pdf:obj \mycolorprofile}% 
  \special{pdf:obj @myowncolor\the\colorprofilecnt \mycolor}%
%    \end{macrocode}
% Since all names must be distinct the macro increments the value of the |\colorprofilecnt| counter by one.
%    \begin{macrocode}
  \advance\colorprofilecnt by1%
}
%    \end{macrocode}
%
% Command |\SetPageColorResource| is used by command |\SetPageColorSpace| to set the color space.
% The |\special| command below sets the page resources only for the current page. Since the color
% space should be visible to every subsequent page, I have opted to use command |\AddEverypageHook| of the 
% \textsf{everypage} package. 
%    \begin{macrocode}
\def\SetPageColorResource#1{%
  \AddEverypageHook{\special{pdf:put @resources <</ColorSpace <<#1>>>>}}%
}%
\def\SetPageColorSpace#1{%
	\expandafter\SetPageColorResource\expandafter{\the\csname #1\endcsname}%
}%
%    \end{macrocode}
% If a user wants to set a spot color as the default color, she should use the |\SpotColor| command:
%    \begin{macrocode}
\def\SpotColor#1#2{%
	\special{pdf:literal /#1 cs /#1 CS #2 sc #2 SC}%
        \aftergroup\reset@color%
}%
%    \end{macrocode}
% The commands |\color@spotcolor| and |\c@lor@@spotcolor| are ``low-level'' commands and should never be used by
% anyone. These commands are used to define new spot colors. They are automatically
% executed everytime a someone uses a command that defines a new spot color:
% \begin{center}
% |\definecolor{Spots}{spotcolor}{SPCOLOR,1.0}|
% \end{center}
% Note that the second argument must always be |spotcolor|. In addition, this command is meaningful only when
% one has defined a few things using command like the following ones:
%\begin{center}
%\begin{tabular}{l}
%|\NewSpotColorSpace{SPCOLORSPACE}|\\
%|\AddSpotColor{SPCOLORSPACE}{SPCOLOR}{Some\SpotSpace Name}{0.5 1.0 0.51 0}|\\
%|\SetPageColorSpace{SPCOLORSPACE}|\\
%\end{tabular}
%\end{center}
% The code that follows has been taken and subsequently modified from \texttt{xetex.def},
% which  is {\em not yet} part of the Standard LaTeX ``Graphics Bundle.'' Note that these command work only
% with \texttt{xdvipdfm-x} driver revision 36553 and later. 
%    \begin{macrocode}
\def\color@spotcolor#1#2{\c@lor@@spotcolor#2\@@#1}
\def\c@lor@@spotcolor#1,#2\@@#3{%
  \c@lor@arg{#2}%
  \edef#3{spot #1 #2}%
}
%    \end{macrocode}
% If pantone or hks option specified then load corresponding color tables
%    \begin{macrocode}
\ifhks\input{spotcolorhks}\fi
\ifpantone\input{spotcolorpantone}\fi
%</xespotcolor>
%    \end{macrocode}
% \Finale
