1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
% 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 reseting 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
|