% This is macro package used by OpTeX, see http://petr.olsak.net/optex \_codedecl \tikzpicture {TikZ for OpTeX <2023-03-04>} \_namespace{pgf} \_catcode`\@=11 \_let\_optexforeach=\foreach \_doc This package is \OpTeX/'s compatibility layer for PGF/TikZ. When users do `\load[tikz]` they expect `tikz.tex` to be loaded, but this file gets loaded instead. It does load `tikz.tex`, but also does fixups. We want to change some definitions in `pgfutil-plain.def` and `pgfsys-luatex.def`. We need to do that in right times, so we manually emulate some files from PGF to ensure we do things in the correct order. \_cod %tikz.tex % pgf.tex % pgfrcs.tex % pgfutil-common.tex % pgfutil-common-lists.tex % pgfutil-plain.tex % pgfrcs.code.tex % pgfcore.tex % pgfsys.tex % pgfsrcs.tex % pgfsys.code.tex % driver % pgfcore.code.tex % pgffor.tex % pgfrcs.tex % pgfkeys.code.tex % pgffor.code.tex % tikz.code.tex \def\pgfrcsincluded{} \input pgfutil-common.tex \_doc We load macros from `pgfutil-plain.def` because they are most similar to macros we actually need. But there are several differences. We don't want to load the output routine hack realized by `\input atbegshi.sty\relax \AtBeginShipout{...}` in `pgfutil-plain.def`. This is the reason why we re-define `\input` temporarily. \_cod \def\input#1\relax{} \def\AtBeginShipout#1{} \_input pgfutil-plain.def \let\input=\_input \let\AtBeginShipout=\_undefined \let\end=\_end \_doc More changes should be done for macros loaded from `pgfutil-plain.def`. These changes follows. \_cod % Writing to auxiliary files, customized \_let\pgfutil@aux@read@hook=\_relax \_def\pgfutil@writetoaux#1{} % Driver detection, customized \def\pgfsysdriver{pgfsys-luatex.def} % Font stuff, \_typosize to fixed sizes used, math fonts are scaled too \def\pgfutil@font@tiny{\_typosize[5/]} \def\pgfutil@font@scriptsize{\_typosize[7/]} \def\pgfutil@font@footnotesize{\_typosize[8/]} \def\pgfutil@font@small{\_typosize[9/]} \def\pgfutil@font@normalsize{\_typosize[10/]} \def\pgfutil@font@large{\_typosize[12/]} \def\pgfutil@font@Large{\_typosize[14.4/]} \def\pgfutil@font@huge{\_typosize[20.74/]} \def\pgfutil@font@Huge{\_typosize[24.88/]} \def\pgfutil@font@normalfont{\_rm} \def\pgfutil@font@itshape{\_it} \def\pgfutil@font@bfseries{\_bf} \def\pgfutil@selectfont{\_rm} \_doc PGF's `\pgfutil@everybye` hooks into `\end`, but normally \OpTeX/ uses the prefixed `\_end`. Here we make it hook into `\_byehook` which should hopefully be preserved by all \OpTeX/ macro writers. \_cod \_addto\_byehook{\_the\pgfutil@everybye} \_doc Make PGF/TikZ use our PDF resource management. Our functions expect split key and value. \_cod \_def\.kvsplit#1{\_ea\.kvsplitA\_expanded{#1}\_end} \_def\.kvsplitA#1/#2 #3\_end{{#2}{#3}} \_def\pgfutil@addpdfresource@extgs{\_addpageresource{ExtGState}\.kvsplit} \_def\pgfutil@addpdfresource@colorspaces{\_addpageresource{ColorSpace}\.kvsplit} \_def\pgfutil@addpdfresource@patterns{\_addpageresource{Pattern}\.kvsplit} \_let\pgfutil@setuppdfresources=\_relax \_let\pgf@sys@pdf@check@resources=\_relax \_def\pgf@sys@pdf@possible@resources{\_pageresources} \_input pgfrcs.code.tex \ProvidesPackageRCS{pgf.tex} \_input pgfcore.tex \usepgfmodule{shapes,plot} \_input pgffor.tex \_input tikz.code.tex \_doc More changes should be done for macros loaded from `pgfsys-luatex.def`. These changes follows. There is a general disagreement about the use/meaning of `\hoffset` and `\voffset` -- \LaTeX/, the \LaTeX/ `crop` package\fnote{\url{https://www.ctan.org/pkg/crop}}, TikZ, and \OpTeX/ all try to use the values differently. Unfortunately this means a broken behaviour observed by end users in \OpTeX/\fnote{\url{https://github.com/pgf-tikz/pgf/issues/983}}. The problem at hand is that PGF nowadays sets the page origin to include `\hoffset` and `\voffset`. We instead set it to the origin (i.e. the point $(0, 0)$). \_cod \_def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfpointorigin} \_refdecl{% \_def\.Xpgfsysmark#1#2#3{\_sdef{pgf@sys@pdf@mark@pos@#1}{\pgfqpoint{#2sp}{#3sp}}}% } \_def\pgfsys@markposition#1{% \_openref \_savepos \_edef\.tmp{#1}% \_ea\_wref\_ea\.Xpgfsysmark\_ea{\_ea{\.tmp}{\_the\_lastxpos}{\_the\_lastypos}}% } \_doc I decide to keep \OpTeX's `\foreach` outside the Tikz environment. The Tikz's `\foreach` is activated only inside its environment. If you want to use Tikz's `\foreach` outside too then you can say `\let\foreach=\_pgf_foreach`. \_cod \addto \tikz@startup@env {\let\foreach=\pgffor@foreach} \_let\.foreach=\pgffor@foreach % \_pgf_foreach is \pgffor@foreach \_let\foreach=\_optexforeach % \foreach is OpTeX's \foreach \_let\.usetikzlibrary=\usetikzlibrary \_def\usetikzlibrary#1{\_let\foreach=\.foreach \.usetikzlibrary{#1}\let\foreach=\_optexforeach } % don't worry about resetting catcodes - we are at the end of \opinput'ed file \_endnamespace \_endcode History: 2023-03-04 \_tikz_foreach used during \usetikzlibrary (bug fix). 2022-03-18 Tikz's \foreach only in its environment. 2022-03-05 resources management re-implemented. 2021-07-15 released