summaryrefslogtreecommitdiff
path: root/macros/luatex/optex/output.opm
blob: a81e5e8c0a560fcfafb1412d94c4db0b540be42e (plain)
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
%% This is part of OpTeX project, see http://petr.olsak.net/optex

\_codedecl \nopagenumbers {Output routine <2020-03-15>} % preloaded in format

   \_doc -----------------------------
   `\_optexouput` is default output routine. You can create another...
   \_cod -----------------------------

\_output={\_optexoutput}
\_def \_optexoutput{\_begoutput \_shipout\_completepage \_endoutput}

   \_doc -----------------------------
   If you need another functionality implemented in output routine, you can
   decalre `\addto\_begoutput{...}` or `\addto\_endoutput`. The settings
   here is local in the `\output` group.

   The `\_prepoffsets` can set `\hoffset` differently for left or right
   page, it is re-defined by `\margins`, see \ref[margins] for more datail.

   The `\_regmark` tokens list includes accumulated `#2` from `\regmacro`,
   see section \ref[maketoc]. Logos and another macros are re-defined
   here (locally) for their usage in headlines or footlines.
   \endtt 
   \_cod -----------------------------

\_def \_begoutput{\_incr\_gpageno 
   \_immediate\_wref\_Xpage{{\the\gpageno}{\_folio}}%
   \_prepoffsets \_the\_regmark} % 
\_def \_endoutput{\_advancepageno
   {\_globaldefs=1 \_the\_nextpages \_nextpages={}}%
   \_ifnum\_outputpenalty>-20000 \_else\_dosupereject\_fi
}
\_def \_prepoffsets {}

   \_doc -----------------------------
   `\_gpageno` counts pages from one in whole document
   \_cod -----------------------------

\_newcount\_gpageno
\_public \gpageno ;

   \_doc -----------------------------
   The `\_completepge` is similar what plain \TeX/ does in its oupput routine.
   New is only `\_backgroundbox`. It is `\vbox` with zero height with its
   contents (from `\pgbackground`) llaped down. It is shifted directly to the 
   left-upper corner of the paper. 

   The `\_ensureblack` sets the typesetting of its parameter locally to `\Black`
   color. We needn't do this if colors are never used in the document. So,
   default value of the `\_ensureblack` macro is empty. But first usage of 
   color macros in the document re-defines `\_ensureblack`.  
   \_cod -----------------------------

\_def\_completepage{\_vbox{%
     \_istoksempty \_pgbackground 
        \_iffalse \_ensureblack{\_backgroundbox{\_the\_pgbackground}}\_nointerlineskip \_fi
     \_ensureblack{\_makeheadline}%
     \_vbox to\_vsize {\_boxmaxdepth=\_maxdepth \_pagecontents}% \pagebody in plainTeX
     \_ensureblack{\_makefootline}}%
}
\_def \_ensureblack #1{#1} % will be re-defined by color macros
\_def \_backgroundbox #1{\_moveleft\_hoffset\_vbox to0pt{\_kern-\voffset #1\_vss}}

   \_doc -----------------------------
   `\_makeheadline` creates `\vbox to0pt` with its contents (the `\headline`) 
   shifted by `\headlinedist` up. 
   \_cod -----------------------------

\_def\_makeheadline {\_istoksempty \_headline \_iffalse 
   \_vbox to0pt{\_vss 
                \_baselineskip=\_headlinedist \_lineskiplimit=-\maxdimen
                \_line{\_the\_headline}\_hbox{}}\_nointerlineskip 
   \_fi
}

   \_doc -----------------------------
   The `\_makefootline` appends the `\footline` to the page-body box. The
   \_cod -----------------------------

\_def\_makefootline{\_istoksempty \_footline \_iffalse 
      \_baselineskip=\_footlinedist 
      \_lineskiplimit=-\maxdimen \_line{\_the\_footline}
   \_fi
}

   \_doc -----------------------------
   The `\_pagecontents` is similar as in plain \TeX/. The only differnece is
   that `\_pagedest` is inserted at the top of `\_pagecontents` and 
   `\_ensureblack` is applied to `\_topins` and `\_footins` material.
   \_cod -----------------------------

\_def\_pagecontents{\_pagedest % destination of the page 
  \_ifvoid\_topins \_else \_ensureblack{\_unvbox\_topins}\_fi
  \_dimen0=\dp255 \_unvbox255 % open up \box255
  \_ifvoid\_footins \_else % footnote info is present
    \_vskip\_skip\_footins
    \_ensureblack{\_footnoterule \_unvbox\_footins}\fi
  \_ifraggedbottom \kern-\_dimen0 \_vfil \_fi
}
\_def \_pagedest {{\_def\_destheight{25pt}\_dest[pg:\_the\_gpageno]}}
\_def \_footnoterule {\kern-3pt \hrule width 2truein \kern 2.6pt } 

   \_doc -----------------------------
   The macros used in the context of the output routine
   from plain \TeX/ is defined here.
   \_cod -----------------------------

\_countdef\_pageno=0 \_pageno=1 % first page is number 1
\_def \_folio {\_ifnum\_pageno<0 \_romannumeral-\_pageno \_else \_number\_pageno \_fi}
\_def \_nopagenumbers {\_footline={}}
\_def \_advancepageno {%
   \_ifnum\_pageno<0 \_global\_advance\_pageno by-1 \_else \_incr\_pageno \_fi 
} % increase |pageno|
\_newifi\_ifraggedbottom
\_def \_raggedbottom {\_topskip=10pt plus60pt \_raggedbottomtrue}
\_def \_normalbottom {\_topskip=10pt \_raggedbottomfalse} % undoes \raggedbottom
\_public
   \pageno \folio \nopagenumbers \advancepageno \raggedbottom \normalbottom ;

   \_doc -----------------------------
   Macros for footnotes are the same as in plain \TeX. There is only one
   difference: `\_vfootnote` is implemented as `\_opfootnote` with empty
   parameter `#1`. This parameter should do a local settings inside
   `\_footins` group and it does it when `\fnote` macro is used.
   \_cod -----------------------------

\_newinsert\_footins
\_def \_footnote #1{\_let\_osf=\_empty % parameter #2 (the text) is read later
   \_ifhmode \_edef\_osf{\_spacefactor\_the\_spacefactor}\/\_fi
  #1\_osf\_vfootnote{#1}}
\_def\_vfootnote{\_opfootnote{}}
\_def \_opfootnote #1#2{\_insert\_footins\_bgroup
  \_interlinepenalty=\_interfootnotelinepenalty
  \_leftskip=0pt \_rightskip=0pt \_spaceskip=0pt \_xspaceskip=0pt \_relax 
  #1\_relax % local settings used by \fnote macro
  \_splittopskip=\_ht\_strutbox % top baseline for broken footnotes
  \_splitmaxdepth=\_dp\_strutbox \_floatingpenalty=20000
  \_textindent{#2}\_footstrut
  \_isnextchar \_bgroup {\_bgroup \_aftergroup\_vfootA \_let\_next=}{\_vfootB}%
}
\_def\_vfootA{\_strut\_egroup}
\_def\_vfootB #1{#1\_vfootA}
\_def \_footstrut {\_vbox to\_splittopskip{}}
\_skip\_footins=\_bigskipamount % space added when footnote is present
\_count\_footins=1000 % footnote magnification factor (1 to 1)
\_dimen\_footins=8in % maximum footnotes per page
\_public
   \footins \footnote \vfootnote \footstrut ;

   \_doc -----------------------------
   The `\_topins` macros are the same as in plain \TeX/.
   \_cod -----------------------------

\_newinsert\_topins
\_newifi\_ifupage \_newifi\_ifumid
\_def \_topinsert {\_umidfalse \_upagefalse \_oins}
\_def \_midinsert {\_umidtrue \_oins}
\_def \_pageinsert {\_umidfalse \_upagetrue \_oins}
\_skip\_topins=\_zoskip % no space added when a topinsert is present
\_count\_topins=1000 % magnification factor (1 to 1)
\_dimen\_topins=\_maxdimen % no limit per page
\_def \_oins {\_par \_begingroup\_setbox0=\_vbox\_bgroup} % start a \_vbox
\_def \_endinsert {\_par\_egroup % finish the \_vbox
  \_ifumid \_dimen0=\_ht0 \_advance\_dimen0 by\_dp0 \_advance\_dimen0 by\_baselineskip
    \_advance\_dimen0 by\_pagetotal \_advance\_dimen0 by-\_pageshrink
    \_ifdim\_dimen0>\_pagegoal \_umidfalse \_upagefalse \_fi \_fi
  \_ifumid \_bigskip \_box0 \_bigbreak
  \_else \_insert \_topins {\_penalty100 % floating insertion
    \_splittopskip=0pt
    \_splitmaxdepth=\_maxdimen \_floatingpenalty=0
    \_ifupage \_dimen0=\_dp0
    \_vbox to\_vsize {\_unvbox0 \_kern-\_dimen0}% depth is zero
    \_else \_box0 \_nobreak \_bigskip \_fi}\_fi\_endgroup}

\_public
    \topins \topinsert \midinsert \pageinsert \endinsert ;

   \_doc -----------------------------
   The `\draft` macro is an example of usage `\_pgbackground` to create 
   water color marks.
   \_cod -----------------------------

\_def \_draft {\_pgbackground={\_draftbox{\_draftfont DRAFT}}%
   \_fontdef\_draftfont{\_setfontsize{at10pt}\_bf}%
   \_global\_let\_draftfont=\_draftfont
}
\_def \_draftbox #1{\_setbox0=\_hbox{#1}%
   \_kern.5\_vsize \_kern4.5\_wd0 
   \_hbox to0pt{\_kern.5\_hsize \_kern-1\_wd0
   \_pdfsave \_pdfrotate{55}\_pdfscale{10}{10}%
   \_hbox to0pt{\_localcolor\LightGrey \_box0\_hss}%
   \_pdfrestore
   \_hss}%
}
\_public \draft ;

\_endcode % -------------------------------------


The output routine `\_optexoutput` is similar as in plain TeX. It does:

\begitexm
* `\begoutput` which does:
  \begitems
  * increments `\gpageno`, 
  * prints `\_Xpage{<gpageno>}{<pageno>}` to the `.ref` file (if `\openref` is active), sets `\hoffset` and 
  * calculates `\hoffset`,
  * sets local meaning of macros for headlines/footlines (see `\_regmacro`).
  \enditems
* `\shipout\_completepage, which is `\vbox` of --
  \begitems
  * backrground box, if `\pgbackround` is non-empty,
  * headline box, if `\headline` is nonempty,
  * \vbox to\vsize of `\pagecontents` which cosnists of --
    \begitems
    * `\_pagedest`, the page destination `pg:<gpageno>` for hyperlinks is created here, 
    * `\_topins` box if non-empty (from `\topinsers`),
    * `\box255` with completed vertical material from main vertical mode,
    * `\_footnoterule` and `\_footins` box if nonempty (from `\fnote`, `\footnote`),
    \enditems
  * footline box, if `\footline` is nonempty
  \enditems 
* `\endoutput` which does:
  \begitems
  * increments `\pageno` using `\_advancepageno`
  * runs `\_dosupereject` if needed.
  \enditems
\enditems