%% \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 % %\ProvidesFile{xesporcolor.sty} % % [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} % % \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 <>>>}}|\\ % \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 <>}% \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 <>>>}}% }% \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 % % \end{macrocode} % \Finale