%% luatex.def %% Copyright (C) 2000-2015 David Carlisle, Sebastian Rahtz, %% Hans Hagen, Heiko Oberdiek and %% Martin Schr\"oder %% Copyright (C) 2016-2018 LaTeX3 project and Heiko Oberdiek %% Copyright (C) 2018-2024 LaTeX3 project %% %% 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{luatex.def} [2024/04/13 v1.2e Graphics/color driver for luatex] \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{#2 g #2 G}% } \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{#1 #2 #3 #4 k #1 #2 #3 #4 K}% } \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{#1 #2 #3 rg #1 #2 #3 RG}% } \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@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{\csname col@#1\endcsname}}% } \chardef\main@pdfcolorstack=0 % \@ifundefined{@pdfcolorstack} {\def\@pdfcolorstack{\main@pdfcolorstack}}{} \def\current@color{0 g 0 G} \def\set@color{% \pdfextension colorstack\@pdfcolorstack push{\current@color}% \aftergroup\reset@color} \def\reset@color{\pdfextension colorstack\@pdfcolorstack pop\relax} \newif\ifGPT@pagecolor \def\set@page@color{% \global\GPT@pagecolortrue \global\let\current@page@color\current@color \@ifundefined{GPT@outputbox}{% % \newbox is outer in plain \csname newbox\endcsname\GPT@outputbox }{}% \@ifundefined{GPTorg@shipout}{% \global\let\GPTorg@shipout\shipout \gdef\shipout{% \edef\GPT@saved@grouplevel{\number\currentgrouplevel}% \afterassignment\GPT@shipout \global\setbox\GPT@outputbox=% }% \gdef\GPT@shipout{% \ifnum\GPT@saved@grouplevel=\currentgrouplevel \else \expandafter\aftergroup \fi \GPT@@shipout }% \gdef\GPT@@shipout{% \ifvoid\GPT@outputbox\relax \PackageInfo{luatex.def}{Ignoring void output box}% \else \setbox\GPT@outputbox=\vbox{% \GPT@pageliteral \box\GPT@outputbox }% \GPTorg@shipout\box\GPT@outputbox\relax \fi }% \gdef\GPT@pageliteral{% \ifGPT@pagecolor \pdfextension literal page{% q % gsave \current@page@color\GPT@space n % newpath 0 0 \strip@pt\pagewidth\GPT@space \strip@pt\pageheight\GPT@space re % rectangle % there is no need to convert to bp f % fill Q% grestore }% \fi }% }{}% } \def\define@color@named#1#2{% \expandafter\edef\csname col@#1\endcsname{#2}} \def\no@page@color{% \global\GPT@pagecolorfalse } \def\@tempa{LaTeX2e}% \ifx\fmtname\@tempa \expandafter\@firstofone \else \expandafter\@gobble \fi {% \@ifl@t@r\fmtversion{2020/10/01} {% \def\set@page@color{% \global\GPT@pagecolortrue \global\let\current@page@color\current@color \IfHookEmptyTF{shipout/background}{\AddToHook{shipout/background}{\relax}}{}% }% \g@addto@macro\@kernel@before@shipout@background {% \ifGPT@pagecolor \put(-\hoffset,-\pageheight+\voffset)% {% \let\current@color\current@page@color \set@color \rule{\pagewidth}{\pageheight}% }% \fi }% }{}% } \AtBeginDocument{% \def\KV@Gin@bbllx{% \PackageError{luatex.def}{% Options `bblly', `bblly', `bburx', `bbury',\MessageBreak `natheight' and `natwidth' are not\MessageBreak supported by luatex driver:\MessageBreak use `viewport' instead% }\@ehc }% \let\KV@Gin@bblly\KV@Gin@bbllx \let\KV@Gin@bburx\KV@Gin@bbllx \let\KV@Gin@bbury\KV@Gin@bbllx \let\KV@Gin@natwidth\KV@Gin@bbllx \let\KV@Gin@natheight\KV@Gin@bbllx \def\KV@Gin@bb{% \PackageInfo{luatex.def}% {Option `bb' equivalent to `viewport' with the luatex driver}% \KV@Gin@viewport }% \let\Gin@iii\Gin@iii@vp } %%% this definition will be added to graphics.sty \def\Gin@iii@vp[#1,#2][#3,#4]#5{% \begingroup \let\Gin@viewport@code\Gin@viewport \Gin@defaultbp\Gin@vllx{#1}% \Gin@defaultbp\Gin@vlly{#2}% \Gin@defaultbp\Gin@vurx{#3}% \Gin@defaultbp\Gin@vury{#4}% \Ginclude@graphics{#5}% \endgroup} %%% this definition needs moving from graphicx.sty to graphics.sty \def\Gin@viewport{% \let\Gin@ollx\Gin@llx \let\Gin@olly\Gin@lly \let\Gin@ourx\Gin@urx \let\Gin@oury\Gin@ury \dimen@\Gin@llx\p@\advance\dimen@ \Gin@vurx\p@ \edef\Gin@urx{\strip@pt\dimen@}% \dimen@\Gin@lly\p@\advance\dimen@ \Gin@vury\p@ \edef\Gin@ury{\strip@pt\dimen@}% \dimen@\Gin@llx\p@\advance\dimen@ \Gin@vllx\p@ \edef\Gin@llx{\strip@pt\dimen@}% \dimen@\Gin@lly\p@\advance\dimen@ \Gin@vlly\p@ \edef\Gin@lly{\strip@pt\dimen@}} %%% end of temp addition \def\Gread@pdftex#1{% % Use low level test here not \IfFileExists to match \Gread@pdftex in % pdftex.def and \Gread@eps test in graphics. % (IfFileExists might be modified by packages and % #1 has already been "processed" by \input@path.) \openin\@inputcheck"#1" % \ifeof\@inputcheck \closein\@inputcheck \expandafter\@secondoftwo \else \expandafter\@firstoftwo \fi {\Gread@@pdftex{#1}}% {% \def\Gin@llx{0}% \let\Gin@lly\Gin@llx \def\Gin@urx{72}% \let\Gin@ury\Gin@urx \ifGin@draft \else \PackageError{luatex.def}{File `#1' not found: using draft setting}% \@ehc \Gin@drafttrue \fi }% } \let\Gin@attr@hash\@empty \@ifundefined{Gin@decode} {\let\Gin@decode\@empty} {} \@ifundefined{Gin@log} {\let\Gin@log\wlog} {} \@ifundefined{Gin@page} {\let\Gin@page\@empty} {} \@ifundefined{Gin@pagebox} {\def\Gin@pagebox{cropbox}} {} \def\GPT@cropbox{cropbox} \@ifundefined{Gin@interpolate} {\csname newif\endcsname\ifGin@interpolate} {} \def\Gread@@pdftex#1{% \edef\Gin@attr@hash{% \ifx\Gin@pagebox\@empty \else :\Gin@pagebox \fi \ifx\Gin@page\@empty \else :P\Gin@page \fi \ifx\Gin@decode\@empty\else :D[\Gin@decode]% \fi \ifGin@interpolate :I% \fi }% \@ifundefined{#1 image\Gin@attr@hash}% {% \saveimageresource \ifnum0% \ifx\Gin@decode\@empty\else 1\fi \ifGin@interpolate 1\fi >0 % attr{% \ifx\Gin@decode\@empty\else/Decode[\Gin@decode]\fi \ifGin@interpolate/Interpolate true\fi }% \fi \ifx\Gin@page\@empty\else page \Gin@page\fi \Gin@pagebox {#1}% \setbox\@tempboxa=\hbox{\useimageresource\lastsavedimageresourceindex}% \def\Gin@llx{0}\let\Gin@lly\Gin@llx \Gin@defaultbp\Gin@urx{\wd\@tempboxa}% \Gin@defaultbp\Gin@ury{\ht\@tempboxa}% \expandafter\xdef\csname #1 image\Gin@attr@hash\endcsname {\useimageresource\the\lastsavedimageresourceindex}% \expandafter\xdef\csname #1 height\Gin@attr@hash\endcsname {\the\ht\@tempboxa}% \expandafter\xdef\csname #1 width\Gin@attr@hash\endcsname {\the\wd\@tempboxa}% \Gin@log{% <#1, % id=\the\lastsavedimageresourceindex, % \ifx\Gin@page\@empty\else page=\Gin@page , \fi \ifx\Gin@pagebox\@empty\else\ifx\Gin@pagebox\GPT@cropbox\else pagebox=\Gin@pagebox , \fi\fi \ifx\Gin@decode\@empty\else decode=[\Gin@decode], \fi \ifGin@interpolate interpolate=true, \fi \the\wd\@tempboxa\GPT@space x \the\ht\@tempboxa >% }% }{% \def\Gin@llx{0}\let\Gin@lly\Gin@llx \Gin@defaultbp\Gin@urx{\csname #1 width\Gin@attr@hash\endcsname}% \Gin@defaultbp\Gin@ury{\csname #1 height\Gin@attr@hash\endcsname}% }% } \def\Gread@png#1{% \let\Gin@page\@empty \Gread@pdftex{#1}% } \let\Gread@jpg\Gread@png \expandafter\let\csname Gread@jbig2\endcsname\Gread@png \def\Gread@pdf#1{% \let\Gin@decode\@empty \Gin@interpolatefalse \Gread@pdftex{#1}% } \let\Gread@mps\Gread@eps \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@pdftex#1{% \GPT@setup@scale \Gin@log{% <use #1% \ifx\Gin@page\@empty\else, page \Gin@page\fi >% }% \PackageInfo{luatex.def}{% #1 \ifx\Gin@page\@empty\else, page\Gin@page\fi \GPT@space used\on@line.\MessageBreak Requested size: % \the\Gin@req@width\GPT@space x \the\Gin@req@height \ifx\documentclass\@undefined\else\expandafter\@gobble\fi }% \Ginclude@@pdftex{\@nameuse{#1 image\Gin@attr@hash}}% } \def\Ginclude@mps#1{% \GPT@setup@scale \Ginclude@@pdftex{\convertMPtoPDF{#1}{1}{1}}% } \def\Ginclude@@pdftex#1{% \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 #1% \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 \saveboxresource\@tempboxa \useboxresource\lastsavedboxresourceindex } \let\Ginclude@png\Ginclude@pdftex \let\Ginclude@jpg\Ginclude@pdftex \let\Ginclude@pdf\Ginclude@pdftex \expandafter\let\csname Ginclude@jbig2\endcsname\Ginclude@pdftex \def\GPT@MatrixIdentity{1 0 0 1} \def\GPT@Zero{0} \def\GPT@Minus{-} \def\GPT@NormalizeNumber#1{% \edef#1{#1}% \edef#1{\expandafter\zap@space#1 \@empty}% \edef#1{\expandafter\GPT@ZapPlus#1+\@nil}% \edef#1{\expandafter\GPT@ZapMinusMinus#1--\@nil}% \expandafter\GPT@Split#1..\@nil \ifx\GPT@frac\@empty \else \edef\GPT@frac{% \expandafter\GPT@Reverse\expandafter{\expandafter}\GPT@frac\@nil }% \edef\GPT@frac{% \expandafter\GPT@ZapLeadingZeros\GPT@frac\@empty }% \ifx\GPT@frac\@empty \else \edef\GPT@frac{% \expandafter\GPT@Reverse\expandafter{\expandafter}\GPT@frac\@nil }% \fi \fi \edef\GPT@sign{\expandafter\@car\GPT@int\@empty\@nil}% \ifx\GPT@sign\GPT@Minus \edef\GPT@int{\expandafter\@cdr\GPT@int\@nil}% \else \def\GPT@sign{}% \fi \edef\GPT@int{% \expandafter\GPT@ZapLeadingZeros\GPT@int\@empty }% \edef\GPT@temp{\GPT@int\GPT@frac}% \ifx\GPT@temp\@empty \def#1{0}% \else \edef#1{% \GPT@sign \GPT@int \ifx\GPT@frac\@empty \else .\GPT@frac \fi }% \fi } \def\GPT@ZapPlus#1+#2\@nil{% #1% \ifx\@empty#2\@empty \expandafter\@gobble \else \expandafter\@firstofone \fi {% \GPT@ZapPlus#2\@nil }% } \def\GPT@ZapMinusMinus#1--#2\@nil{% #1% \ifx\@empty#2\@empty \expandafter\@gobble \else \expandafter\@firstofone \fi {% \GPT@ZapMinusMinus#2\@nil }% } \def\GPT@Split#1.#2.#3\@nil{% \def\GPT@int{#1}% \ifx\@empty#2\@empty \let\GPT@frac\@empty \else \def\GPT@frac{#2}% \fi } \def\GPT@Reverse#1#2#3\@nil{% \ifx\@empty#3\@empty #2#1% \expandafter\@gobble \else \expandafter\@firstofone \fi {% \GPT@Reverse{#2#1}#3\@nil }% } \def\GPT@ZapLeadingZeros#1{% \ifx0#1% \expandafter\GPT@ZapLeadingZeros \else #1% \fi } \def\Grot@start{% \GPT@NormalizeNumber\Grot@sin \GPT@NormalizeNumber\Grot@cos \edef\GPT@temp{% \Grot@cos\GPT@space\Grot@sin\GPT@space \if-\Grot@sin \else \ifx\Grot@sin\GPT@Zero \GPT@Zero \else -\Grot@sin \fi \fi \GPT@space\Grot@cos }% \ifx\GPT@temp\GPT@MatrixIdentity \def\Grot@end{}% \else \pdfextension save\relax \pdfextension setmatrix{\GPT@temp}% % Slightly hacky, but set width of box 0 to 0pt otherwise % the CTM gets restored in the wrong place \wd\z@\z@ \fi } \def\Grot@end{\pdfextension restore\relax} \def\Gscale@start{% \GPT@NormalizeNumber\Gscale@x \GPT@NormalizeNumber\Gscale@y \edef\GPT@temp{% \Gscale@x\GPT@space0 0 \Gscale@y }% \ifx\GPT@temp\GPT@MatrixIdentity \def\Gscale@end{}% \else \pdfextension save\relax \pdfextension setmatrix{\GPT@temp}% \fi } \def\Gscale@end{\pdfextension restore\relax} \@ifundefined{ifGin@setpagesize} {\expandafter\let\csname ifGin@setpagesize\expandafter\endcsname \csname iftrue\endcsname} {} \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 \@ifundefined{stockwidth}{% \@ifundefined{paperwidth}{% }{% \ifdim\paperwidth>0pt\relax \ifdim\paperheight>0pt\relax \pagewidth=\paperwidth \pageheight=\paperheight \fi \fi }% }{% \ifdim\stockwidth>0pt\relax \ifdim\stockheight>0pt\relax \setlength{\pagewidth}{\stockwidth}% \setlength{\pageheight}{\stockheight}% \else \ifdim\paperwidth>0pt\relax \ifdim\paperheight>0pt\relax \setlength{\pagewidth}{\paperwidth}% \setlength{\pageheight}{\paperheight}% \fi \fi \fi \else \ifdim\stockwidth=0pt\relax \ifdim\paperwidth>0pt\relax \ifdim\paperheight>0pt\relax \setlength{\pagewidth}{\paperwidth}% \setlength{\pageheight}{\paperheight}% \fi \fi \fi \fi }% \fi } \fi \fi \def\Gin@extensions{% .pdf,.png,.jpg,.mps,.jpeg,.jbig2,.jb2,% .PDF,.PNG,.JPG,.JPEG,.JBIG2,.JB2% } \@namedef{Gin@rule@.jpg}#1{{jpg}{.jpg}{#1}} \@namedef{Gin@rule@.jpeg}#1{{jpg}{.jpeg}{#1}} \@namedef{Gin@rule@.JPG}#1{{jpg}{.JPG}{#1}} \@namedef{Gin@rule@.JPEG}#1{{jpg}{.JPEG}{#1}} \@namedef{Gin@rule@.jb2}#1{{jbig2}{.jb2}{#1}}% \@namedef{Gin@rule@.jbig2}#1{{jbig2}{.jbig2}{#1}}% \@namedef{Gin@rule@.png}#1{{png}{.png}{#1}} \@namedef{Gin@rule@.PNG}#1{{png}{.PNG}{#1}} \@namedef{Gin@rule@.mps}#1{{mps}{.mps}{#1}} \@namedef{Gin@rule@.pdf}#1{{pdf}{.pdf}{#1}} \@namedef{Gin@rule@.PDF}#1{{pdf}{.PDF}{#1}} \@namedef{Gin@rule@.eps}#1{{eps}{.eps}{#1}} % MPS conversion \def\GPT@LoadSuppPdf{% \@ifundefined{convertMPtoPDF}{% \edef\@tempa{% \catcode`\noexpand\<\the\catcode`\<\relax \catcode`\noexpand\>\the\catcode`\>\relax \catcode`\noexpand\=\the\catcode`\=\relax }% \@makeother\<\@makeother\>\@makeother\=% % supp-pdf.mkii tests against \undefined: % just in case someone has defined it ... \let\GPT@orig@undefined\undefined \let\undefined\@undefined \InputIfFileExists{supp-pdf.mkii}{}{}% \let\undefined\GPT@orig@undefined \@tempa }{% % supp-pdf is probably already loaded. }% % If supp-pdf is not available, \convertMPtoPDF generates % an error message. \providecommand inside the third argument % of \InputIfFileExists will not work: % * \InputIfFileExists has problems with parameters (#1). % * Implementation of \providecommand is insufficient in miniltx.tex \@ifundefined{convertMPtoPDF}{% % 2016/05/21 v0.01c use \newcommand here not \newcommand* graphics/4472 \newcommand{\convertMPtoPDF}[3]{% \PackageError{luatex.def}{% Cannot convert ##1 from MPS to PDF. The support file `supp-pdf.mkii' (supp-pdf.tex) is missing% }{% The graphics driver for pdfTeX needs `supp-pdf.mkii' (or `supp-pdf.tex' and/or `supp-mis.tex') to convert MetaPost output files to PDF. These files are part of ConTeXt and can also be found here:% \GPT@space\GPT@space CTAN:macros/pdftex/graphics/. You'll get more errors if you'll continue now.% }% }% }{}% \let\GPT@LoadSuppPdf\relax } \AtBeginDocument{% \GPT@LoadSuppPdf } % Load package epstopdf if % a) LaTeX is running (plain TeX users are on their own), % b) and \DoNotLoadEpstopdf either does not exist or is not \relax, % c) and neither pst-pdf nor pdftricks is loaded (by \begin{document}). % % In other words, by default .eps files will be automatically % converted to .pdf files when outputting pdf. This can be wrong! % If the .pdf is the source, rather than the .eps, you should put % \newcommand{\DoNotLoadEpstopdf}{} % before even the \documentclass line of your document. % % Earlier versions did not load epstopdf if shell escape was disabled. % Now load, for better error reporting and to allow inclusion of pre-existing % converted files: see gh/38 % % More information about the epstopdf run will be in the .log file; % see http://ctan.org/pkg/epstopdf-pkg for more info about the % epstopdf package itself. In turn, it calls the epstopdf script % (http://ctan.org/pkg/epstopdf). % % For the first discussion and background on this, see the thread on latex-l: % http://thread.gmane.org/gmane.comp.tex.latex.latex3/1465 % \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname DoNotLoadEpstopdf\endcsname\relax \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname AtEndOfPackage\endcsname\relax \else \AtEndOfPackage{% \AtBeginDocument{% \ifx\includegraphics\@undefined\else \@ifpackageloaded{pst-pdf}{}{% \@ifpackageloaded{pdftricks}{}{% \@ifpackageloaded{graphics}{% \edef\Gin@extensions{\Gin@extensions,.eps}% \RequirePackage{epstopdf-base}[2009/07/12]% }{} }% pdftricks not loaded }% pst-pdf not loaded \fi }% AtBeginDocument block }% AtEndofPackage block \fi % AtEndofPackage not defined \fi % DoNotLoadEpstopdf not defined \endinput