% struct.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 The structure of Lollipop Lollipop provides tools for realizing the style or layout of a document. Some of these tools are macros ready to be used by the end user; they concern for instance selection of fonts. Others, the `generic constructs', are for the style designer so that she can use them to program the macros for the user. \Section[sec:doc-start-stop] Lollipop Files Any Lollipop document has to have a \cs{Start} and \cs{Stop} command. Before the \cs{Start} there can be style definition commands, but no text. For a number of reasons it is advisable to put as much of the style definition before the \cs{Start} command as possible. You can do that easily by loading the style as an input file, or by first dumping it as a format (see section~\ref[sec:style-dump]). \ImpNote Before the \cs{Start} command, \cs{everypar} contains an error message. The start command installs the default value for \cs{everypar}. \ImpNoteStop Both the start and the stop file load the \file{.aux} auxiliary file. None of this should concern you, really. Expert users who want to have certain actions performed at the start of the document may want to use \refcs{StartCommand} to specify what they wish done. See section~\ref[sec:adapt-distance] for an example. \Section Generic Constructs \label[generic:construct]\label[option:macro] There are five `generic constructs': headings, lists, text blocks, page grids, and external items. For each construct type there is a defining command, for instance \cs{DefineHeading} which is followed a list of `options', terminated by the word `Stop'. Options (possibly with values) have to be separated by a space or a line end; the keyword \opt{Stop} has to be followed by a space or a line end. Options may have zero, one or two values; if there are values, then the first one is separated from the option by a colon, the second is separated from the first by an equals sign. \Ver>\DefineFoo:Bar optiona optionb optionc:value optiond:valuea=valueb optione optionf Stop<Rev As a result of this definition, a command \cs{Bar} is created. If the \con{Foo} construct was a \con{List} or \con{TextBlock}, an additional command \cs{BarStop} is created. This command can then be used in the ordinary way, for instance after \ver>\DefineHeading:Foo> you can type \Ver>\Foo The title<Rev and after \ver>\DefineList:Foo> you can type \Ver>\Foo \item One item \item And another \FooStop<Rev \ImpNote Actually, this `Stop' business can be customized for other languages. The file \file{tools} has the following lines: \Ver> \def\stop@command@suffix{Stop} \def\stop@command{\@command\stop@command@suffix}<Rev \ImpNoteStop \Section Options Options are mostly used to specify how a construct will look. Some options, for instance \opt{title}, indicate material that will appear on the page. Other options are interpreted as commands, for instance \opt{IndentAfter:yes} in the definition of a heading indicates that the first paragrah after such a heading will indent. In addition to keywords that only exist as options, commands can be used as options. Also, single characters are accepted as options. For instance a definition of a subsection heading can contain: \Ver>\DefineHeading:SubSection [...] SectionCounter . SubSectionCounter [...] Stop<Rev (Here and later the \n{[...]} will denote arbitrary omitted text.) This definition contains the commands \cs{SectionCounter} and \cs{SubSectionCounter} and the \n{.} character. If a number of options appears together in a number of constructs it is convenient to have an abbreviation for them. This can be done with the command \refcs{OptionsMacro} as follows. The options that appear together are given a common name \Ver>\OptionsMacro:baz=optiona optionb:value optionc Stop<Rev (be sure to leave no spaces around the equals sign) and this name is then used as \Ver> macro:baz<Rev in the option list wherever the options are needed. This is for instance a good way of specifying identical white space around all sorts of constructs without duplicating the typing each time. However, it is only for your convenience: it doesn't save any \TeX\ resources or processing time. \Section[sec:error-msg] Popular error messages. Not! Lollipop is a macro package on top of an existing program, \TeX. Therefore it is inevitable that you will get \TeX\ error messages every once in a while. Some of these may confuse you. Here are a few of the errors that I~keep making. \SubSection Missing \cs{endcsname} inserted If you forget the second parameter in a \cs{Distance} or \cs{SetCounter} command, writing for instance \Ver>\Distance:TheWidth<Rev instead of \Ver>\Distance:TheWidth=15pt<Rev \TeX\ will scan forward, and it can easily bump into something that is highly unexpected given the context. If this is a \cs{def} or \cs{Define...} command, a `missing \cs{endcsname}' results. If a blank line follows the incomplete declaration, the following section applies. \SubSection Paragraph ended before something was complete \TeX\ has found a blank line (or a~\cs{par} command) where this was not expected. See for instance the previous section. \SubSection Missing number You have used something that you thought was the name of a control sequence, but it wasn't. Example: \Ver>\Distance:parskip=parundent<Rev Since \cs{parundent} is undefined, \Lollipop\ thought you were writing something like \Ver>\Distance:parskip=5pt<Rev And yes, the message refers to `number' even though what is missing is a distance. \ImpNote \iSection Defining Generic Constructs The \cs{Define...} commands are not defined explicitly, instead they are generated by a call such as \Ver> \@GenericConstruct{Heading}<Rev Full definition: \Ver>\def\@GenericConstruct#1{<Rev to be used as \ver>\@GenericConstruct{Foo}>; \Ver> \append@to@list{@gencons}{\\#1;}<Rev book keeping of existing generic constructs; \Ver> \csarg\newtoks{#1@defaults} \csn #1@defaults\ecs{}<Rev default commands to be executed whenever an instance of this construct is defined; \Ver> \csarg\def{add@#1@default}##1% {\append@to@list{#1@defaults}{##1}}<Rev the command \cs{add@Foo@default} to add defaults for this construct; \Ver> \Install@Noops{#1}<Rev possibility to generate error msgs for the use of an option that is not allowed for this type of construct; \Ver> \csarg\def{Define#1}:##1 {<Rev instances of this construct will be defined by a statement like \ver>\DefineFoo:Bar>; \Ver> \def\@name{##1}\def\@class{#1} \Tmessage[def]{Defining a #1: ##1}<Rev \ver>DefineFoo:Bar> leads to \cs{@name} begin \n{Bar}, \cs{@class} being \n{Foo}; \Ver> \the\generic@defaults \csarg\the{#1@defaults}<Rev unpack token lists of generic and specific default actions; \Ver> \Get@Items}<Rev start recursive processing of list of options. This ends the definition of \cs{DefineFoo}; the definition of \cs{@GenericConstruct} ends with \Ver> \csarg\def{@#1Option}##1% {\csarg\def{#1@##1}####1####2}<Rev which defines the \cs{@FooOption} macro; see~\ref[imp:option]. \Ver> }<Rev \iSection Items Processing Processing the list of items is recursive; at the end some concluding actions have to be taken, mostly the actual definition of the construct. First we have to filter out empty arguments, which can be caused by the use of option macros (\ref[option:macro], \ref[imp:option:macro]). \Ver>\def\Get@Items#1 {\if\EmptyList{#1}\let\get@next@item\Get@Items \else\def\get@next@item{\@Get@Items#1 }\fi \get@next@item}<Rev Next, check if the argument is \opt{Stop} (defined by \ver>\NewDummy{Stop}>, \ref[imp:new:dummy]), in which case you have reached the end of a generic definition, and can start performing the final rites. Otherwise, dissect this option item and go on with the rest of the options. \Ver> \def\@Get@Items#1 {\let\get@next@item=\Get@Items \csarg\ifx{#1}\Stop \the\generic@stop@defaults \let\get@next@item=\relax \else \Item@or@Macro#1::. \fi \get@next@item}<Rev The \n{::.} concluding \cs{Item@or@Macro} accomodates one, possibly empty, argument. \iSection Options\label[imp:option]\label[imp:option:macro] Options can either be specific, defined as \Ver>\@FooOption{Bar}{ [...] }<Rev in which case the option \opt{Bar} can only be used inside a call to \cs{DefineFoo}, or they can be generic, defined as \Ver>\@GenericOption{Bar}{ [...] }<Rev For both definitions, the definition text can use up to two parameters. Parameters are given to the options as \Ver> optiona:par1 optionb:par1=par2<Rev Specific options are defined by the line \Ver> \csarg\def{@#1Option}##1% {\csarg\def{#1@##1}####1####2}<Rev in \cs{@DefineGenericConstruct}; a call \Ver>\@FooOption{Bar}{ ... }<Rev expands to \Ver>\def\Foo@Bar#1#2{ ... }<Rev Generic options are defined by the following command: \Ver>\def\@GenericOption#1{ \append@to@list{@GenericOptions}{\\#1;} \csarg\def{Option@#1}##1##2}<Rev A call \Ver>\@GenericOption{Bar}{ ... }<Rev expands to \Ver>\def\Option@Bar#1#2{ ... }<Rev \ImpNoteStop \endinput