% out.tex copyright 1992/3 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[chap:output] Output Every page is formatted according to a `page grid' consisting of three elements: \Enumerate \item the page head, this is everything that's over the running text; \item the page foot, this is everything that is below the running text; \item the running text. \TeX\ acts as if text is on a long scroll, and the running text part of a page is simply a portion cut off from this scroll.\> Either or both of the head and foot of the page can be empty, but usually one of the two contains a page number. \OutExample \OptionsMacro:ManPageSize=raggedbottom:10pt topskip:12pt height:page=5cm width:page=6cm Stop \DefinePageGrid:TestPage macro:ManPageSize pagerule textband:start text textband:stop pagerule band:start PageCounter band:stop Stop \TestPage This page does not contain much special.\EjectPage This page is hardly better. \OutExampleStop This example illustrates how you first define a page grid by \refcs{DefinePageGrid}, and then activate it by calling its name. That last action is in fact not necessary: each definition of a page grid automatically installs that grid as the current one. \Section Page dimensions Most of the time it is easiest to specify the total height of a page, that is, including head and bottom, but sometimes it is more convenient to specify the height of the text, and let the head and foot simply go over and under that. In the first case you can give the command \refcs{Height} with two parameters: \Ver>\Height:Page=23.5cm<Rev or inside a page grid definition the option \refopt{height}\n{:page=...}. In the second case you can give the command \Ver>\Height:Text=19.55cm<Rev or inside a page grid definition the option \opt{height:text=...}. In page grid definitions there is the additional option \opt{height:lines=23}. The \cs{Height} command cannot be used in a page grid definition. \Section Positioning the page on the paper If your printer driver is up to specs (and you have not done any creative macro writing) it should have the upper left corner of the text landing at $2.54$cm from the top and left side of the paper. If the result is not to your liking, you can shift the page by \Ver>\Distance:hoffset= ... \Distance:voffset= ...<Rev These offset parameters are zero ordinarily, and they indicate the extra shift added to the customary $2.54$cm in horizontal and vertical direction. \Section Page head, foot, text Somewhere in the page grid the option \refopt{text} has to appear. This option has to be inside a \refopt{textband}: \Ver> textband:start text textband:stop<Rev This is not a case of overspecification, because inside a textband the text option can appear more than once. In this manner a multicolumn page grid can be specified. \def\sometext{Just a bit of words, words. } \edef\sometext{\sometext\sometext\sometext} \edef\sometext{\sometext\sometext\sometext\sometext} \OutExample \DefinePageGrid:TestPage macro:ManPageSize pagerule textband:start text hwhite:10pt text textband:stop pagerule band:start PageCounter band:stop Stop \FlushRight:no \sometext \OutExampleStop Next to the option \opt{textband} there is \refopt{band}. Both are ways of creating a page wide band. The option \opt{band} is used for all material that is not a text column, for instance footers, as in the above examples. The option \opt{band} can have one unusual parameter: \n{invisible}. This makes the band act as if it has zero height or width, depending on whether it is below or above the text, respectively. \OutExample \DefinePageGrid:TestPage macro:ManPageSize pagerule textband:start text hwhite:10pt text textband:stop pagerule band:invisible block:start Style:bold PageCounter Spaces:2 stickout:left band:stop Stop \FlushRight:no \sometext \OutExampleStop \SubSection More about text bands The text band is that part of the page that has the text in it. You can also put other material in it, such as rules or white space. \OutExample \DefinePageGrid:TestPage macro:ManPageSize pagerule textband:start vrule white:3pt text white:3pt vrule textband:stop pagerule band:start white:fillup PageCounter band:stop Stop \TestPage This page contains some text, a bit more text, and even more than that. In all still just a few lines.\EjectPage This page contains more text, still more text, and still more. \OutExampleStop In the previous example the width of the page was specified. If we only give the width of the text, the page width is calculated dynamically. \OutExample \DefinePageGrid:TestPage macro:ManPageSize textband:start vrule white:3pt text white:3pt vrule textband:stop pagerule band:start white:fillup PageCounter band:stop Stop \noindent This page contains some text, a bit more text, and even more than that. In all still just a few lines.\EjectPage This page contains more text, still more text, and still more. \OutExampleStop Note how the \refopt{pagerule} and \opt{band} objects stretch with the page. \SubSection Topskip In between the page head and the text is some white space, the topskip, with special properties. The topskip is defined from the bottom of the head to the bottom of the first line of the text. If the height of this first line varies from page to page the topskip acts as a buffer, keeping the bottom-to-bottom distance constant. Topskip is set by the option \refopt{topskip}, for example \Ver> topskip:25pt<Rev but if this option is left out, the page grid uses the value of \cs{topskip} that was current at the time of the definition. Unfortunately there is no way to change this value after the definition. \Section[sec:page-counter] The page number The page number behaves as if it had been defined by \Ver>\NewCounter:Page \CounterRepresentation:Page=1<Rev Thus you can use any command from section~\ref[sec:counters] on it. For instance, you can have page numbers in roman numerals by specifying \Ver>\CounterRepresentation:Page=I<Rev The page number is typically used as the option \refopt{PageCounter}, but for some applications the corresponding command \refcs{PageCounter} can be used. If you process a \Lollipop\ document you see that everytime a page is generated, an item such as \ver>[8,7]> is written on the log file or the screen. Most of the time the two numbers will be the same, as in \ver>[8,8]>, but they will differ if you have tinkered with the page number. The first number is the `sheet counter': it counts how many pages you have produced so far. The second number is the value of \cs{PageCounter} for the page that was written out. Take a look at the log file for this manual for an example. \Section[sec:page:tests] Page tests The page grid definition can set/query several properties of the page. The following tests have been provided (see section~\ref[sec:tests] for tests): \Ver>\DefineTest:IsRightPage \DefineTest:IsLeftPage \DefineTest:FirstPage \DefineTest:LastPage \DefineTest:FlushBottom<Rev \Itemize\item The tests for left/right pages are done by testing whether the page number of odd or even. \item The first/last page tests can be used either for the whole document, or for a file that's loaded as an \cs{InputFile}. \item The first page test doesn't work at present. \> \OutExample \DefinePageGrid:TestPage macro:ManPageSize pagerule textband:start text textband:stop pagerule band:start ifIsLeftPage else hwhite:fillup fi PageCounter band:stop Stop \SetCounter:Page=12 This is a left hand page. \EjectPage This page is on the right side of a spread. \OutExampleStop \Section[sec:head/foot] Running heads / footers Above it was explained how pages can be given a head and foot part. Quite often you want changing information in such parts, for instance the head of a left page often contains the number or title of section that was current when that page started; the head of a right page often contains the number or title of the section that was current when that page ended. In \Lollipop\ all constructs that have a title or a counter can have that information referenced in page grids. \Description\item \refcs{FirstPlaced}:SectionTitle Take the title of the first section that started on this page, or the last one that started before this page if no section started on this page.\item \refcs{LastPlaced}:SubSectionCounter Take the title of the last subsection that started on this page, or the last one that started before this page if no subsection started on this pgae.\item \refcs{PreviousPlaced}:SectionCounter Take the counter value of the last section that started before this page.\> \OutExample \DefinePageGrid:TestPage macro:ManPageSize pagerule textband:start text textband:stop pagerule band:start Style:italic FirstPlaced:HeadTitle white:fillup PageCounter band:stop Stop \DefineHeading:TestHeading Style:bold line:start TestHeadingCounter Spaces:2 title line:stop Stop \TestHeading A first section\par And some text.\EjectPage This page contains text. \TestHeading A second Section\par And more text. \OutExampleStop The commands \cs{FirstPlaced} and \cs{PreviousPlaced} are typically used on left pages; \cs{LastPlaced} is more common on right pages. You can test on what sort of page you are; see section~\ref[sec:page:tests]. \OutExample \DefinePageGrid:TestPage macro:ManPageSize pagerule textband:start text textband:stop pagerule band:start Style:italic ifIsLeftPage FirstPlaced:HeadTitle white:fillup fi PageCounter ifIsRightPage white:fillup LastPlaced:HeadTitle fi band:stop Stop \SetCounter:Page=10 \DefineHeading:TestHeading Style:bold line:start TestHeadingCounter Spaces:2 title line:stop Stop \TestHeading A first section\par And some text. \TestHeading Second section\par More text.\EjectPage \TestHeading Third section\par Is on the right page. \TestHeading Fourth section\par Concludes this page. \OutExampleStop \Section Alternating page grids In \Lollipop\ it is very easy to switch page grids with the option \refopt{NextPageGrid}: you simply specify \Ver> NextPageGrid:otherpage<Rev as one of the options in the definition. If no next grid is indicated, the same page grid keeps being used continuously until another page grid is activated explicitly. \OutExample \DefinePageGrid:LTestPage macro:ManPageSize pagerule textband:start text textband:stop pagerule band:start Style:italic PageCounter white:fillup FirstPlaced:HeadTitle band:stop NextPageGrid:RTestPage Stop \DefinePageGrid:RTestPage macro:ManPageSize pagerule textband:start text textband:stop pagerule band:start Style:italic LastPlaced:HeadTitle white:fillup PageCounter band:stop NextPageGrid:LTestPage Stop \SetCounter:Page=42 \DefineHeading:TestHeading Style:bold line:start TestHeadingCounter Spaces:2 title line:stop Stop \LTestPage \TestHeading A first section\par And some text. \TestHeading Second section\par More text.\EjectPage \TestHeading Third section\par Is on the right page. \TestHeading Fourth section\par Concludes this page. \OutExampleStop Another very useful application of this mechanism is to have a special definition for the opening page of a chapter. This manual uses a one-shot page grid \cs{EmptyPage} to remove the header and footer on the title page. It installs \cs{LeftPage} as the next grid. \Section Additional User Control \SubSection Elementary manipulation There are a few commands for simple page manipulation: \Description\item \refcs{EjectPage} The current page is filled up with white space, and a new page is started.\item \refcs{ToRecto} As \cs{EjectPage} but if the next page is a left page (meaning that the page number is even) then the page number is increased by one, so that the next page is a right hand page.\item \refcs{ToVerso} As \cs{ToRecto}, except that the next page is a left page. \> Additionally, \refcs{NoPages} lets all formatting and updating of values be performed, but no pages are written to the dvi file; \refcs{PagesOut} reverts the effect of previous command. Note that \cs{NoPages} does not incur any savings in time: full processing of the document is performed. When a page is finished it rests in box \refcs{WholePage}. Then a call is made to \refcs{CurrentShipout}, which is by default \ver>\shipout\box\WholePage>. However, you are free to define it otherwise. If your \cs{CurrentShipout} does not actually ship out pages, you may want to set \refcs{CountSheetsno} to prevent the effective page counter from being updated. Redefining \cs{CurrentShipout} usually goes together with \refcs{SuspendOutput} and \refcs{ResumeOutput}. These commands temporarily save the page number and the current state of the page, including the current definition of \cs{CurrentOutput}. (This is necessary because a number of parameters concerned are changed by global assignments.) See the definition of \cs{OutputExample} in the appendix of this manual for an elaborate example. If you want to see te output routines in action, specify \Ver>\Trace:out<Rev In addition \Ver>\Trace:mark<Rev tells you what information is being saved for running head and foot lines. \endinput % 2014/04/12 Made `output' capitalized. % 92/11/20 Left right output examples % 93/01/17 New description of \CurrentShipout