summaryrefslogtreecommitdiff
path: root/macros/lollipop/doc/manual/opt.tex
blob: 1d0b5d79594b8fbe1bacb943f51e6a14b7e932d3 (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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
% opt.tex copyright 1992 Victor Eijkhout
%              copyright 2014--2016 Vafa Khalighi
%
%
%    This program is free software: you can redistribute it and/or modify
%    it under the terms of the GNU General Public License as published by
%    the Free Software Foundation, either version 3 of the License, or
%    (at your option) any later version.
%
%    This program is distributed in the hope that it will be useful,
%    but WITHOUT ANY WARRANTY; without even the implied warranty of
%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%    GNU General Public License for more details.
%
%    You should have received a copy of the GNU General Public License
%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
%
%
\Chapter Options

This chapter discusses the various options that are common to all
\Lollipop\ constructs.

\Section Titles

Any construct can have a title, although of course it is most useful
for headings. 
A construct has a title if the option \refopt{title} appears. 
Example:
\Ver>
\DefineHeading:Section [...]
    Style:bold title
    [...] Stop<Rev

will define a \cs{Section} macro that has a title. 
The macro is then used as
\Ver>
\Section The title of this section

Some text in this section.<Rev
that is, the title is delimited by an empty line.

The title is actually available as a macro \refcs{FooTitle}, so that you
can write a macro, for instance
\Ver>
\def\ComplicatedTitle{ .. \hrule ... 
    \vrule ... \vbox \bgroup ...
    \FooTitle ...
    }<Rev
and use this macro instead of the \opt{title} option
\Ver>\DefineBar:Foo ...
    ComplicatedTitle
    ... Stop<Rev
However, since the option \opt{title} now doesn't appear anymore, it
becomes necessary to specify explicitly that there is a title.
This can be done with the \refopt{HasTitle} option. For instance,
you define
\Ver>\DefineBar:Foo ...
    HasTitle
    ComplicatedTitle
    ... Stop<Rev
where \cs{ComplicatedTitle} is a macro that formats the title.

\SubSection Short titles

The option \opt{HasTitle} can have a parameter \n{short}, denoting that
the title is not delimited by an empty line (or \cs{par}) but by the
line end. For an example see section~\ref[sec:address].

\Section[sec:opt:counter] Counters

There are three ways for Lollipop to figure out that a generic
construct has a counter. First of all, in
\Ver>\DefineFoo:Bar [...]
    BarCounter [...]<Rev
the \cs{BarCounter} will be defined automatically.

Additionally there is the option \refopt{counter}, which can be used
to declare the representation of the option, for instance
\opt{counter:i} allocated a counter that is printed in lowercase roman
numerals. For the available representations,
see~\ref[sec:counter:repr].

Finally, if the counter is only used in a macro, the
option \refopt{HasCounter} will cause the counter to be created anyhow.
This is analogous to the \opt{HasTitle} option.

\SubSection Counter synonyms

Every once in a while you may want different constructs to use the same
counter. For instance, if your book has definitions, theorems, lemmas,
corollaries and notations, it may confuse the reader if they all have
their own counter. The numbering would seem to jump all over the place.

A `counter synonym' can be declared in \Lollipop\ by a slight abuse of
the \opt{counter} option.
\Example
\DefineTextBlock:Theorem counter:1 begingroup Style:bold
 literal:Theorem Spaces:1 TheoremCounter Spaces:2 endgroup
 text Stop
\DefineTextBlock:Corollary counter:Theorem begingroup Style:italic
 literal:Corollary Spaces:1 CorollaryCounter Spaces:2 endgroup
 text Stop
\DefineTextBlock:Definition counter:Theorem begingroup Style:roman
 literal:Definition Spaces:1 DefinitionCounter Spaces:2 endgroup
 text Stop
\Definition We define a {\it Foo} to be an arbitrary object\>
\Theorem Foos have arbitrary properties\>
\Corollary Foos are extremely valuable\>
\Corollary Foos are extremely worthless\>
\Theorem Foos don't exist\>
\ExampleStop

You can only declare a counter to be synonym for something that has
already been created. In the above example you cannot define the
\cs{Theorem} after the \cs{Corollary}.

\ImpNote
At the start of defining the construct, \cs{BarCounter} is defined to
be an option:
\Ver>\add@generic@default{\has@counterno
    \def\counter@repr{1}
    \csarg\def{\gen@option@name{\@name Counter}}{%
        \@add@toks{\@name Counter}\global\has@counteryes}}<Rev

Then,
\Ver>\add@generic@stop@default{\ifhas@counter
    \xp\expandafter\xp\install@counter
           \xp\counter@repr\@space\fi}<Rev


The counter is stepped, and the new value is stored in a mark item,
in \cs{outer@start@commands}:

\Ver>
    \ifhas@counter 
       \nxp\StepCounter:\expandafter\@name\@space
       % This sets the \current@label by default
       \ifhas@marks \edef\nxp\cs@e
              {\nxp\nxp\nxp\refresh@mark@item
                {\@name Counter}{\CSname{\@name Counter}}}%
            \nxp\cs@e      
       \fi
       \fi<Rev
\ImpNoteStop

\Section Chunks of text

Especially in headings, short chunks of text may need a special
treatment. For instance, the number may have to be filled to a certain
width, or a line may have to be drawn of the exact length of the
title. Lollipop have various general options (so they can also be used
in other contexts than headings) for handling pieces of text.

\SubSection[sec:opt:block] The \opt{block} option\label[opt:block]

The \refopt{block} option takes up a piece of text and fits it on one
line. It can measure the text, or set the size. Also there are a number
of ways of placing a block.

Basic usage:
\Ver>    block:start [...] block:stop<Rev
This takes the enclosed text, and reproduces it. This is mostly
interesting in combination with \opt{textcolumn},
see~\ref[sec:opt:textcolumn].
\Ver>    block:hang [...] block:stop<Rev
The resulting block is dropped until its top touches the baseline.
For uniformity of appearance, the resulting width of the block can be
specified:
\Ver>    block:start [...] fillupto:20pt<Rev
The name of a \cs{Distance} parameter can be used here.

\Example
\DefineHeading:TestHeading
 line:start block:hang PointSize:8 SetFont 
                  TestHeadingCounter fillupto:20pt
            block:hang PointSize:14 SetFont title block:stop
 line:stop Stop
\TestHeading Top Aligning the Title

\endExample

The block is usually in between the margins of the text, but it can be
made to stick out into the margin, by closing it with the option
\refopt{stickout}.  For the left margin this done as
 \Ver>    block:start [...] stickout:left<Rev
and for the right margin
 \Ver>    block:start [...] stickout:right<Rev
The size of the box can be specified, for instance as
 \Ver>    block:start [...] stickout:left=20pt<Rev
For a left box the material in it is pushed to the left edge, for a
right sticking box it is shifted to the right.

\SubSection[sec:blockwidth] Block Measuring

All blocks are immediately measured when they are placed. This makes it
possible for instance to underline a title exactly. After a block has
been placed, its width is available as \refcs{BlockWidth}.
 \Example
\def\rulespecs{height 1pt width \BlockWidth\relax}
\DefineHeading:TestHeading Style:bold
 line:start block:start TestHeadingCounter . Spaces:2 stickout:left
            block:start title block:stop line:stop
 vwhite:2pt hrule rulespecs vwhite:10pt Stop
\TestHeading The Title Is Underlined

The text follows.
\ExampleStop
Observe how a control sequence \cs{rulespecs} is used to sneak the
height and width of the rule into the definition. This is necessary
because control sequences are not allowed in a construct definition.

\SubSection[sec:opt:line] The \opt{line} option

The option \refopt{line} is used to create a single strip of text that
fits exactly in between the margins of the page. Most of the time, titles
will be in a line. 

\Example
\DefineHeading:TestHeading
    line:start block:start TestHeadingCounter Spaces:1.5 stickout:left
               title line:stop Stop
\TestHeading A Title

\endExample

Another example was above. Here is another use of a line:

\Example
\DefineHeading:TestHeading
    line:start TestHeadingCounter fillup title line:stop Stop
\TestHeading The title

\endExample

\SubSection[sec:opt:textcolumn] The \opt{textcolumn} option

In the examples above all titles fit on one line comfortably. If this
is not the case, the title can be put in a \refopt{textcolumn} which can
span several lines.

\Example
\DefineHeading:TestHeading
    line:start block:start TestHeadingCounter Spaces:2 block:stop
               textcolumn:topline title textcolumn:stop
    line:stop Stop
\TestHeading A very very very very very very very very very very very
very very very very very very very very very very very very very
very very very very very very very very long title

\endExample

This option is mostly interesting in combination with others such as
\opt{block} and \opt{line}. As is apparent from the above example: a
block placed in the same line as a text column will detract from the
latter's width. 

(In fact it is the other way around: \Lollipop\ sets
the line with a text column of width zero to determine the remaining
space. Then the line is set again. This may give problems if you
manipulate parameters inside the line, because the line is in effect
typeset twice. Also make sure not to have other \cs{vbox}-es in the
line than the text column.)

\SubSection[sec:opt:traps] Traps

It is a bad idea to have material in headings and such that is not
inside a block, textcolumn, or line. For instance:

\Example
\DefineHeading:TestHeading
    block:start TestHeadingCounter Spaces:2 block:stop
    title Stop
\TestHeading Where does the title go?

\endExample

\Section[sec:opt:label] Labels

References to any counter will always be correct, no matter if that
counter has changed after retypesetting the document, if symbolic
references are used. Referencing is explained in detail in
chapter~\ref[chap:referencing].

The way a symbolic reference is formatted can be altered from the
default (just give the counter) by using the \refopt{label} option.
\Ver>\DefineHeading:TestSection
 line:start Style:italic TestSectionCounter Spaces:2 title line:stop
 label:start ( TestSectionCounter ) label:stop Stop<Rev
See further section~\ref[sec:shape:reference].


\Section[sec:opt:penalties] Break before / after

The options \refopt{breakbefore} and \refopt{breakafter} control how
eager \TeX\ will be to break the page before or after a construct. These
options take one value, a so-called `penalty' value, meaning that the
higher the value you specify, the higher the penalty is, and
therefore the less likely it is that the page will be broken there.

Numerical values are typically in the tens or hundreds; any value
of \n{10$\,$000} or more means that there will never be a break at
that point; a value of \n{-10$\,$000} or less means a guaranteed
break. If you don't want to remember these rules, values of \n{yes}
and \n{no} mean a guaranteed break, and no break respectively.

\WizNote
A further exceptional value is \n{breakbefore/after:0}, this will
cause no penalty to be placed. The reason for this is highly \TeX
nical.
\>

\Section[sec:opt:indent] Indentation

The option \refopt{indentafter} controls the behaviour of the first
paragraph after a generic construct., \refopt{indentinside},
\refopt{indentfirst}.

\Section Rules

There is an option \refopt{hrule}. You should not write
\Ver>\def\rulemacro{\hrule height [...] }
\DefineHeading [...] rulemacro [...] Stop<Rev
because then \Lollipop\ cannot prevent page breaks around the rule.
Instead write 
\Ver>\def\rulespecs{ height [...] }
\DefineHeading [...] hrule rulespecs [...] Stop<Rev
so that the option \opt{hrule} is used. See
section~\ref[sec:blockwidth] for an example.

\Section Embedded constructs

Most generic constructs will be vertically separated from the
surrounding text. However, in rare cases (and for unusual applications)
it be desired to have a construct that is part of a paragraph. For this
the option \refopt{embedded} exists.

This option has the following values.
\Ver>    embedded:no<Rev
This is the default.
\Ver>    embedded:left<Rev
The construct continues an already started paragraph, but after the
construct a vertical break follows.
\Ver>    embedded:right<Rev
After the construct a paragraph can continue, but the construct is
separated vertically from preceding text.
\Ver>    embedded:yes<Rev
The construct is both left and right embedded.

Embedding a construct has an interesting application to generating
indexes. (See chapter~\ref[chap:external-files] for general information
about external files.) This can be done by having embedded headings
that write their title to the index file.

\Example
\DefineExternalFile:tIndex=tix
\DefineHeading:NewWord embedded:yes 
 block:start Style:bold title block:stop
 external:tIndex title external:stop Stop
\def\introword#1{\NewWord #1\par}
In this sentence two \introword{flubrious} words are
\introword{stinselsed}.
\ExampleStop

Cute, ain't it?

A word of warning though. Headings and such generate \TeX\ `marks'
which take up main memory. You only need these if you are going
to be referring to that object with \cs{LastPlaced} or such; see
section~\ref[sec:head/foot]. Embedded headings used as above
usually don't need these marks, so you can prevent \TeX\ overflow by
putting the option \opt{nomarks} in their definition.

\Section Obscure options

\SubSection Arguments

In case you want to interface to other macro packages, you may want to
let a construct generate a call to the other package. For this, the
\Lollipop\ macro should be able to produce sequences such as
\ver>\begin{itemize}>. The problem here is the braces. The option
\refcs{arg} produces a braced expression.

For instance
\Ver>\DefineTextBlock:LaTeXlist begin arg:{itemize} text
    end arg:{itemize} Stop<Rev
makes it possible to use call \LaTeX\ macros from \Lollipop.

\SubSection[sec:implicit:close] Implicit closing

The control sequence \refcs{>} closes the current group, and \refcs{>]}
closes all currently open groups. Every once in a while this is too
drastic. Hence there is an option \refopt{noimplicitclose} that can be
used to prevent a construct from being closed implicitly. Using \cs{>]}
inside such a construct will close all enclosed constructs.

See the definition of \cs{EExample} in this manual for an example.

\Section[sec:opt:test] Testing

There is an option \opt{test}.

\endinput

% 92/11/10 \BlockWidth discussed in 'block' section
% 92/11/15 counter:othercounter discussed
% 92/11/21 option 'arg'