% 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 . % % \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\DefineHeading:Foo> you can type \Ver>\Foo The title\DefineList:Foo> you can type \Ver>\Foo \item One item \item And another \FooStop \def\stop@command@suffix{Stop} \def\stop@command{\@command\stop@command@suffix}\DefineHeading:SubSection [...] SectionCounter . SubSectionCounter [...] Stop\OptionsMacro:baz=optiona optionb:value optionc Stop macro:baz\Distance:TheWidth\Distance:TheWidth=15pt\Distance:parskip=parundent\Distance:parskip=5pt \@GenericConstruct{Heading}\def\@GenericConstruct#1{\@GenericConstruct{Foo}>; \Ver> \append@to@list{@gencons}{\\#1;} \csarg\newtoks{#1@defaults} \csn #1@defaults\ecs{} \csarg\def{add@#1@default}##1% {\append@to@list{#1@defaults}{##1}} \Install@Noops{#1} \csarg\def{Define#1}:##1 {\DefineFoo:Bar>; \Ver> \def\@name{##1}\def\@class{#1} \Tmessage[def]{Defining a #1: ##1}DefineFoo:Bar> leads to \cs{@name} begin \n{Bar}, \cs{@class} being \n{Foo}; \Ver> \the\generic@defaults \csarg\the{#1@defaults} \Get@Items} \csarg\def{@#1Option}##1% {\csarg\def{#1@##1}####1####2} }\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}\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}\@FooOption{Bar}{ [...] }\@GenericOption{Bar}{ [...] } optiona:par1 optionb:par1=par2 \csarg\def{@#1Option}##1% {\csarg\def{#1@##1}####1####2}\@FooOption{Bar}{ ... }\def\Foo@Bar#1#2{ ... }\def\@GenericOption#1{ \append@to@list{@GenericOptions}{\\#1;} \csarg\def{Option@#1}##1##2}\@GenericOption{Bar}{ ... }\def\Option@Bar#1#2{ ... }