%% xetex.def %% Copyright (C) 2005-2022 LaTeX3 Project, Jin-Hwan Cho, Shunsaku Hirata %% (with contributions from many others) %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3c or later is part of all distributions of LaTeX %% version 2005/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. %% %% The Current Maintainer of this work is the LaTeX3 Project. %% %% https://github.com/latex3/graphics-def/issues %% \ProvidesFile{xetex.def} [2022/09/22 v5.0n Graphics/color driver for xetex] \def\GPT@space{ } \def\c@lor@arg#1{% \dimen@#1\p@ \ifdim\dimen@<\z@\dimen@\maxdimen\fi \ifdim\dimen@>\p@ \PackageError{color}{Argument `#1' not in range [0,1]}\@ehd \fi} \def\color@gray#1#2{% \c@lor@arg{#2}% \edef#1{gray #2}% } \def\color@cmyk#1#2{\c@lor@@cmyk#2\@@#1} \def\c@lor@@cmyk#1,#2,#3,#4\@@#5{% \c@lor@arg{#4}% \c@lor@arg{#1}% \c@lor@arg{#2}% \c@lor@arg{#3}% \edef#5{cmyk #1 #2 #3 #4}% } \def\color@rgb#1#2{\c@lor@@rgb#2\@@#1} \def\c@lor@@rgb#1,#2,#3\@@#4{% \c@lor@arg{#1}% \c@lor@arg{#2}% \c@lor@arg{#3}% \edef#4{rgb #1 #2 #3}% } \def\color@RGB#1#2{\c@lor@@RGB#2\@@#1} \def\c@lor@@RGB#1,#2,#3\@@#4{% \c@lor@RGB@rgb{#1}\@tempa \c@lor@RGB@rgb{#2}\@tempb \c@lor@RGB@rgb{#3}\@tempc \c@lor@@rgb\@tempa,\@tempb,\@tempc\@@#4% } \def\c@lor@RGB@rgb#1#2{% \dimen@#1\p@ \divide\dimen@\@cclv \edef#2{\strip@pt\dimen@}} \def\color@hsb#1#2{\c@lor@@hsb#2\@@#1} \def\c@lor@@hsb#1,#2,#3\@@#4{% \c@lor@arg{#1}% \c@lor@arg{#2}% \c@lor@arg{#3}% \edef#4{hsb #1 #2 #3}% } \def\color@named#1#2{\c@lor@@named#2,,\@@#1} \def\c@lor@@named#1,#2,#3\@@#4{% \@ifundefined{col@#1}% {\PackageError{color}{Undefined color `#1'}\@ehd}% {\edef#4{ #1}}% } \def\c@lor@to@ps#1 #2\@@{\csname c@lor@ps@#1\endcsname#2 \@@} \def\c@lor@ps@#1 #2\@@{TeXDict begin #1 end} \def\c@lor@ps@rgb#1\@@{#1 setrgbcolor} \def\c@lor@ps@hsb#1\@@{#1 sethsbcolor} \def\c@lor@ps@cmyk#1\@@{#1 setcmykcolor} \def\c@lor@ps@gray#1\@@{#1 setgray} \def\current@color{ Black} \def\set@color{% \special{color push \current@color }\aftergroup\reset@color} \def\reset@color{\special{% color pop}} \def\set@page@color{\special{% background \current@color}} \def\define@color@named#1#2{% \expandafter\let\csname col@#1\endcsname\@nnil} % white is special cased as "no background color" by dvipdfmx \def\no@page@color{\special{background gray 1}} \@ifundefined{Gin@decode} {\let\Gin@decode\@empty} {} \@ifundefined{Gin@page} {\let\Gin@page\@empty} {} \@ifundefined{Gin@pagebox} {\def\Gin@pagebox{cropbox}} {} \@ifundefined{Gin@interpolate} {\csname newif\endcsname\ifGin@interpolate} {} \def\Gread@pdf#1{% \let\Gin@decode\@empty \Gin@interpolatefalse \Gread@@xetex\XeTeXpdffile } \def\Gread@bmp#1{% \let\Gin@page\@empty \let\Gin@pagebox\@empty \Gread@@xetex\XeTeXpicfile } \def\Gread@@xetex#1{% \IfFileExists{\Gin@base.bb}% {\Gread@eps{\Gin@base.bb}}% {\Gread@@xetex@aux#1}% } \def\Gread@@xetex@aux#1{% \edef\Gin@attr@hash{% \ifx\Gin@pagebox\@empty \else :\Gin@pagebox \fi \ifx\Gin@page\@empty \else :P\Gin@page \fi }% \edef\Gin@@name{\Gin@base\Gin@ext}% \@ifundefined{\Gin@@name\GPT@space height\Gin@attr@hash}% {% \setbox\@tempboxa=\hbox{% #1"\Gin@@name"\GPT@space \ifx\Gin@page\@empty\else page \Gin@page\fi \ifx\Gin@pagebox\@empty\else\expandafter\Gread@@xetex@box\Gin@pagebox\fi }% \def\Gin@llx{0}\let\Gin@lly\Gin@llx \Gin@defaultbp\Gin@urx{\wd\@tempboxa}% \Gin@defaultbp\Gin@ury{\ht\@tempboxa}% \expandafter\xdef\csname \Gin@@name\GPT@space height\Gin@attr@hash\endcsname {\the\ht\@tempboxa}% \expandafter\xdef\csname \Gin@@name\GPT@space width\Gin@attr@hash\endcsname {\the\wd\@tempboxa}% }{% \def\Gin@llx{0}\let\Gin@lly\Gin@llx \Gin@defaultbp\Gin@urx {\csname \Gin@@name\GPT@space width\Gin@attr@hash\endcsname}% \Gin@defaultbp\Gin@ury {\csname \Gin@@name\GPT@space height\Gin@attr@hash\endcsname}% }% } \def\Gread@@xetex@box#1box{#1} \def\GPT@setup@scale{% \def\@tempa{!}% \ifx\Gin@scaley\@tempa \let\Gin@scaley\Gin@scalex \else \ifx\Gin@scalex\@tempa\let\Gin@scalex\Gin@scaley\fi \fi } \def\Ginclude@pdf#1{% \GPT@setup@scale \Gin@log{% % }% \hbox{% \Gscale@box{\Gin@scalex}[\Gin@scaley]{% \@ifundefined{Gin@vllx}{% \GPT@viewportfalse % without viewport/trim clipping does not make sense % for pdfTeX \Gin@clipfalse }{}% \ifGin@clip \if!\Gin@vllx\Gin@vlly\Gin@vurx\Gin@vury!% \else \let\GPT@clipend\GPT@DoClipEnd \setbox\@tempboxa\hbox\bgroup \fi \fi \ifGPT@viewport \ifdim\Gin@vlly\p@=\z@ \else \lower\Gin@vlly bp\hbox\bgroup \fi \ifdim\Gin@vllx\p@=\z@ \else \hskip-\Gin@vllx bp\relax \fi \fi \XeTeXpdffile"#1" % \ifx\Gin@page\@empty\else page \Gin@page\fi \ifx\Gin@pagebox\@empty\else\expandafter\Gread@@xetex@box\Gin@pagebox\fi \ifGPT@viewport \ifdim\Gin@vlly\p@=\z@ \else \egroup \fi \GPT@clipend \fi }% }% } \newif\ifGPT@viewport \GPT@viewporttrue \let\GPT@clipend\relax \def\GPT@DoClipEnd{% \egroup \dp\@tempboxa\z@ % \Gin@urx and \Gin@ury already contain the correct values, % so both cases viewport and trim can be handled together: \dimen@\Gin@urx\p@ \advance\dimen@ -\Gin@llx\p@ \wd\@tempboxa\strip@pt\dimen@ bp\relax \dimen@\Gin@ury\p@ \advance\dimen@ -\Gin@lly\p@ \ht\@tempboxa\strip@pt\dimen@ bp\relax \GPT@clipbox\@tempboxa \box\@tempboxa } \def\GPT@clipbox#1{% \setbox#1=\hbox{% \Gin@defaultbp\WIDTH{\wd#1}% \Gin@defaultbp\DEPTH{\dp#1}% \@tempdima\ht#1% \advance\@tempdima\dp#1% \Gin@defaultbp\TOTALHEIGHT{\@tempdima}% \special{x:gsave}% \special{% pdf:literal 0 -\DEPTH\GPT@space \WIDTH\GPT@space \TOTALHEIGHT\GPT@space re W n }% \rlap{\box#1}% \special{x:grestore}% \hskip\wd#1% }% } \def\Ginclude@bmp#1{% \Gin@log{<#1>}% \bgroup \def\@tempa{!}% \special{pdf:image\GPT@space bbox\GPT@space\Gin@llx\GPT@space\Gin@lly\GPT@space\Gin@urx\GPT@space\Gin@ury\GPT@space clip\GPT@space\ifGin@clip 1\else 0\fi\GPT@space \ifx\Gin@scalex\@tempa\else width\GPT@space\the\Gin@req@width\GPT@space\fi \ifx\Gin@scaley\@tempa\else height\GPT@space\the\Gin@req@height\GPT@space\fi (#1)\GPT@space \ifnum0% \ifx\Gin@decode\@empty\else 1\fi \ifGin@interpolate 1\fi >0 % <<% \ifx\Gin@decode\@empty\else /Decode[\Gin@decode]\fi \ifGin@interpolate /Interpolate true\fi >>% \fi }% \egroup } \newif\if@trim@vport \def\Ginclude@eps#1{% \Gin@log{<#1>}% \bgroup \ifx\Undefined\Gin@vllx\else\@trim@vporttrue\fi \def\@tempa{!}% \dimen@\Gin@urx\p@ \advance\dimen@ -\Gin@llx\p@ \if@trim@vport \advance\dimen@ \Gin@vllx\p@ \fi \edef\Gin@urx{\strip@pt\dimen@}% \dimen@\Gin@ury\p@ \advance\dimen@ -\Gin@lly\p@ \if@trim@vport \advance\dimen@ \Gin@vlly\p@ \fi \edef\Gin@ury{\strip@pt\dimen@}% \dimen@\Gin@req@width \dimen@ii.1bp% \divide\dimen@\dimen@ii \@tempdima\Gin@req@height \divide\@tempdima\dimen@ii \special{PSfile="#1"\GPT@space \if@trim@vport llx=\Gin@vllx\GPT@space lly=\Gin@vlly\GPT@space \fi urx=\Gin@urx\GPT@space ury=\Gin@ury\GPT@space \ifx\Gin@scalex\@tempa\else rwi=\number\dimen@\GPT@space\fi \ifx\Gin@scaley\@tempa\else rhi=\number\@tempdima\GPT@space\fi \ifGin@clip clip\fi}% \egroup} % % In the above \Ginclude@eps, llx, lly, urx, and ury are translated to match % the -dEPSCrop option for Ghostscript to convert eps to pdf. % In the case of eps files created by MetaPost, the files are included % directly without the help of Ghostscript. That is, we have to translate % the origin accordingly if we use \Ginclude@eps for eps files created by % MetaPost. In TeX Live 2015, the translation of the origin was the default. % After TeX Live 2016, however, the translation of the origin is enabled only % if the --mvorigin option is given for xdvipdfmx % This may be a bit inconvenient, especially as % xdvipdfmx is usually called as a pipe. Therefore we introduce a new suffix % .mps(or .MPS) to support inclusion of eps files created by MetaPost without % the option --mvorigin. % \def\Ginclude@mps#1{% \Gin@log{<#1>}% \bgroup \def\@tempa{!}% \dimen@\Gin@req@width \dimen@ii.1bp% \divide\dimen@\dimen@ii \@tempdima\Gin@req@height \divide\@tempdima\dimen@ii \special{PSfile="#1"\GPT@space llx=\Gin@llx\GPT@space lly=\Gin@lly\GPT@space urx=\Gin@urx\GPT@space ury=\Gin@ury\GPT@space \ifx\Gin@scalex\@tempa\else rwi=\number\dimen@\GPT@space\fi \ifx\Gin@scaley\@tempa\else rhi=\number\@tempdima\GPT@space\fi \ifGin@clip clip\fi}% \egroup} % \def\Grot@start{% \special{pdf:btrans rotate \Grot@angle}} \def\Grot@end{\special{pdf:etrans}} % 4.13 add support for ptex vertical writing mode % inspired by pxtatescale package (Hironobu Yamashita) \ifx\kanjiskip\@undefined \def\Gscale@start{% \special{pdf:btrans}% \special{x:scale \Gscale@x\GPT@space\Gscale@y}% } \else \edef\Gscale@start{% \special{pdf:btrans}% \special{x:scale \expandafter\noexpand\csname iftdir\endcsname \noexpand\Gscale@y\noexpand\GPT@space\noexpand\Gscale@x \expandafter\noexpand\csname else\endcsname \noexpand\Gscale@x\noexpand\GPT@space\noexpand\Gscale@y \expandafter\noexpand\csname fi\endcsname}} \fi % \def\Gscale@end{\special{pdf:etrans}} \def\Gin@PS@raw#1{\special{ps: #1}} \def\Gin@PS@restored#1{\special{" #1}} \def\Gin@PS@literal@header#1{\AtBeginDvi{\special{! #1}}} \def\Gin@PS@file@header#1{\AtBeginDvi{\special{header=#1}}} \def\Gin@extensions{% order here is like pdftex.def, except for PS .pdf,.PDF,.ai,.AI,% .png,.PNG,.jpg,.JPG,.jpeg,.JPEG,.jp2,.JP2,.jpf,.JPF,.bmp,.BMP,% .ps,.PS,.eps,.EPS,.mps,.MPS} % \@namedef{Gin@rule@.pdf}#1{{pdf}{.xbb}{#1}} \@namedef{Gin@rule@.PDF}#1{{pdf}{.xbb}{#1}} % \@namedef{Gin@rule@.ai}#1{{pdf}{.xbb}{#1}} \@namedef{Gin@rule@.AI}#1{{pdf}{.xbb}{#1}} % \@namedef{Gin@rule@.jp2}#1{{bmp}{.xbb}{#1}} \@namedef{Gin@rule@.JP2}#1{{bmp}{.xbb}{#1}} % \@namedef{Gin@rule@.jpf}#1{{bmp}{.xbb}{#1}} \@namedef{Gin@rule@.JPF}#1{{bmp}{.xbb}{#1}} % \@namedef{Gin@rule@.png}#1{{bmp}{.xbb}{#1}} \@namedef{Gin@rule@.PNG}#1{{bmp}{.xbb}{#1}} % \@namedef{Gin@rule@.jpg}#1{{bmp}{.xbb}{#1}} \@namedef{Gin@rule@.JPG}#1{{bmp}{.xbb}{#1}} % \@namedef{Gin@rule@.jpeg}#1{{bmp}{.xbb}{#1}} \@namedef{Gin@rule@.JPEG}#1{{bmp}{.xbb}{#1}} % \@namedef{Gin@rule@.jp2}#1{{bmp}{.xbb}{#1}} \@namedef{Gin@rule@.JP2}#1{{bmp}{.xbb}{#1}} % \@namedef{Gin@rule@.jpf}#1{{bmp}{.xbb}{#1}} \@namedef{Gin@rule@.JPF}#1{{bmp}{.xbb}{#1}} % \@namedef{Gin@rule@.bmp}#1{{bmp}{.xbb}{#1}} \@namedef{Gin@rule@.BMP}#1{{bmp}{.xbb}{#1}} % \@namedef{Gin@rule@.ps}#1{{eps}{.ps}{#1}} \@namedef{Gin@rule@.PS}#1{{eps}{.ps}{#1}} % \@namedef{Gin@rule@.eps}#1{{eps}{.eps}{#1}} \@namedef{Gin@rule@.EPS}#1{{eps}{.eps}{#1}} % \@namedef{Gin@rule@.mps}#1{{mps}{.mps}{#1}} \@namedef{Gin@rule@.MPS}#1{{mps}{.mps}{#1}} % \@namedef{Gin@rule@*}#1{{eps}{\Gin@ext}{#1}} \@ifundefined{ifGin@setpagesize} {\expandafter\let\csname ifGin@setpagesize\expandafter\endcsname \csname iftrue\endcsname} {} \@ifundefined{stockwidth}{\newdimen\stockwidth}{} \@ifundefined{stockheight}{\newdimen\stockheight}{} \ifGin@setpagesize \ifx\paperwidth\@undefined\else \AtBeginDocument{% % If a package has changed \mag, assume it knows what it is doing % and leave page size alone \ifnum\mag=\@m \ifdim\stockwidth>0pt\relax \ifdim\stockheight>0pt\relax \setlength{\pdfpagewidth}{\stockwidth}% \setlength{\pdfpageheight}{\stockheight}% \else \ifdim\paperwidth>0pt\relax \ifdim\paperheight>0pt\relax \setlength{\pdfpagewidth}{\paperwidth}% \setlength{\pdfpageheight}{\paperheight}% \fi \fi \fi \else \ifdim\stockwidth=0pt\relax \ifdim\paperwidth>0pt\relax \ifdim\paperheight>0pt\relax \setlength{\pdfpagewidth}{\paperwidth}% \setlength{\pdfpageheight}{\paperheight}% \fi \fi \fi \fi \fi } \fi \fi \endinput % Conversion functions so the internal representation stays unchanged \let\init@current@color\current@color \def\convert@color#1{% \ifx#1\init@current@color \expandafter\convert@color@init \else \expandafter\convert@@color \fi #1% } \def\convert@color@init#1{0 g 0 G} \def\convert@@color#1{% \expandafter\expandafter\expandafter\convert@@@color#1\stop } \def\convert@@@color#1 #2\stop{% \csname convert@color@#1\endcsname{#2}% } \def\convert@color@cmyk#1{#1 k #1 K} \def\convert@color@gray#1{#1 g #1 G} \def\convert@color@rgb#1{#1 rg #1 RG} \def\convert@color@#1{% \expandafter\expandafter\expandafter\convert@@color \expandafter\expandafter\expandafter{\csname col@#1\endcsname}% } % Deal with named colors \def\define@color@named#1#2{\expandafter\edef\csname col@#1\endcsname{#2}} % Change the specials to use the stack \ifdefined\main@pdfcolorstack\else \chardef\main@pdfcolorstack=1 % \ifx\AtBeginDvi\undefined \long\def\@firstofone#1{#1}% \expandafter\@firstofone \else \expandafter\AtBeginDvi \fi {\special{pdfcolorstackinit \the\main@pdfcolorstack\space page direct (0 g 0 G)}} \fi \def\@pdfcolorstack{\the\main@pdfcolorstack\space} \def\set@color{% \special{pdfcolorstack \@pdfcolorstack push (\convert@color\current@color)}% \aftergroup \reset@color } \def\reset@color{% \special{pdfcolorstack \@pdfcolorstack pop}% } % Reinsert stack color to over-ride built-in reinsertion of pdf:bc color \def\Grot@end{\special{pdf:etrans}\special{pdfcolorstack \@pdfcolorstack current}} \let\Gscale@end\Grot@end \def\GPT@clipbox#1{% \setbox#1=\hbox{% \Gin@defaultbp\WIDTH{\wd#1}% \Gin@defaultbp\DEPTH{\dp#1}% \@tempdima\ht#1% \advance\@tempdima\dp#1% \Gin@defaultbp\TOTALHEIGHT{\@tempdima}% \special{x:gsave}% \special{% pdf:literal 0 -\DEPTH\GPT@space \WIDTH\GPT@space \TOTALHEIGHT\GPT@space re W n }% \rlap{\box#1}% \special{x:grestore}% \special{pdfcolorstack \@pdfcolorstack current}% \hskip\wd#1% }% }