Footnotes in a multi-column layout^{∗}

Frank Mittelbach Electronic Data Systems (Deutschland) GmbH Eisenstraße 56 N15 D-6090 Rüsselsheim

December 15, 1994

1 Preface to version 1.1

The new release is a basically unchanged version of the original. I upgraded the macros so that they work with L^{A}TEX 2ε and used some of the additional flexibility introduced therein. For example, the command

\preparefootins is now automat-
ically called at \begin{document},

thus allowing the user to adjust the \textheight in the preamble.

It is not surprisingly that I was forced to change some of the macros because they dig deep into L^{A}TEX’s output routines. Fortunately this is something normally not necessary when upgrading other L^{A}TEX 2.09 styles to L^{A}TEX 2ε packages.

I also upgraded the documentation to conform to the L^{A}TEX 2ε terminology, e.g., this is a package since document classes will not know about it. However it is very likely that i have missed some necessary corrections.

2 Introduction

The placement of footnotes in a multicolumn layout always bothered me.

The approach taken by L^{A}TEX (i.e., placing the footnotes separately under each column) might be all right if nearly no footnotes are present. But it looks clumsy when both columns contain footnotes, especially when they occupy different amounts of space.

In the multi-column package [5], I used page-wide footnotes at the bottom of the page, but again the result doesn’t look very pleasant since short footnotes produce undesired gaps of white space. Of course, the main goal of this package was a balancing algorithm for columns which would allow switching between different numbers of columns on the same page. With this feature, the natural place for footnotes seems to be the bottom of the page^{1} but looking at some of the results it seems best to avoid footnotes in such a layout entirely.

Another possibility is to turn footnotes into endnotes, i.e., printing them at the end of every chapter or the end of

∗The L^{A}TEX package ftnright which is described in this article has the version number v1.1b dated 1994/02/28. The documentation was last revised on 1994/02/28.

1. You can not use column footnotes at the bottom, since the number of columns can differ on one page.

the entire document. But I assume everyone who has ever read a book using such a layout will agree with me, that it is a pain to search back and forth, so that the reader is tempted to ignore the endnotes entirely.

When I wrote the article about “Future extensions of TEX” [6] I was again dissatisfied with the outcome of the footnotes, and since this article should show certain aspects of high quality typesetting, I decided to give the footnote problem a try and modified the L^{A}TEX output routine for this purpose. The layout I used was inspired by the yearbook of the Gutenberg Gesellschaft Mainz [2]. Later on, I found that it is also recommended by Jan White [9]. On the layout of footnotes I also consulted books by Jan Tschichold [8] and Manfred Simoneit [7], books, I would recommend to everyone being able to read German texts.

2.1 Description of the new layout

The result of this effort is presented in this paper and the reader can judge for himself whether it was successful or not.^{2} The main idea for this layout is to assemble the footnotes of all columns on a page and place them all together at the bottom of the right column. Allowing for enough space between footnotes and text, and in addition, setting the footnotes in smaller type^{3} I decided that one could omit the footnote separator rule which is used in most publications prepared with TEX.^{4} Furthermore, I decided to place the footnote markers^{5} at the baseline instead of raising them as superscripts.^{6}

All in all, I think this generates a neat layout, and surprisingly enough, the necessary changes to the L^{A}TEX output routine are nevertheless astonishingly simple.

2.2 The use of the package

This package might be used together with any other package for L^{A}TEX which does not change the three internals changed by ftnright.sty.^{7} In most cases, it is best to use this package as the very last package in the preamble to make sure that its settings are not overwritten by other packages.

It is unfortunate that the current L^{A}TEX has nearly no provisions to make such changes without overwriting the

2. Please note, that this option only changed the placement of footnotes. Since this article also makes use of the doc package [1], that assigns tiny numbers to code lines sprincled throughout the text, the resulting design is not perfect. This package is now a standard part of L^{A}TEX 2ε.

3. The standard layout in TUGboat uses the same size for footnotes and text, giving the footnotes, in my opinion, much too much prominence.

4. People who prefer the rule can add it by redefining the command \footnoterule [3, p. 156]. Please, note, that this command should occupy no space, so that a negative space should be used to compensate for the width of the rule used.

5. The tiny numbers or symbols, e.g., the ‘5’ in front of this footnote.

6. Of course, this is only done for the mark preceeding the footnote text and not the one used within the main text where a raised number or symbol set in smaller type will help to keep the flow of thoughts, uninterrupted.

7. These are the macros \@startcolumn,

                                            \@makecol and \@outputdblcol as we will

see below. Of course, the package will take only effect with a document class using a twocolumn layout (like ltugboat) or when the user additionally specifies twocolumn as a document class option in the \documentclass command.

internal routines. In the L^{A}TEX3 implementation, we will certainly add some hooks that will make such changes more easy.

3 The documentation driver

The first bit of code contains the documentation driver file for TEX, i.e., the file that will produce the documentation you are currently reading. It will be extracted from this file by the docstrip program. If you don’t want to make any changes to the presentation you can alternatively process the .dtx file directly with L^{A}TEX 2ε to obtain the documentation.

1 ⟨∗driver⟩

2 \documentclass[twocolumn]{ltxdoc}

3

4 \usepackage{ftnright}

5

6 \newcommand{\TUB}{{\sl TUGboat\/}}
7 \renewcommand\DescribeMacro[1]{\fbox
8  {\PrintDescribeMacro{#1}}}
9 \renewcommand\DescribeEnv[1]{\fbox
10  {\PrintDescribeEnv{#1}}}
11 \renewcommand\PrintMacroName[1]{}

12

13 \setlength{\parindent}{1em}
14 \setlength{\parskip}
15  {2pt plus1pt minus1pt}
16 \setlength{\headsep}{20pt}
17 \setlength{\columnsep}{1.5pc}
18 \renewcommand{\bottomfraction}{.4}

19

20 \flushbottom
21 \CodelineIndex
22 \RecordChanges      % produce history
23 \EnableCrossrefs

24

25 \setcounter{IndexColumns}{2}
26 \IndexPrologue{\section{Index}
27 All numbers denote code lines where
28 the corresponding entry is used,

29 underlined entries point to the
30 definition.}

31

32 \begin{document}
33 \DocInput{ftnright.dtx}
34 \end{document}

35 ⟨/driver⟩

4 The Implementation

As usual, we start by identifying the current version of this package file in the transcript file.^{8}

36 ⟨∗package⟩

37 \wlog{Package: `\filename'
38 \fileversion\space <\filedate> (FMi)}
39 \wlog{English Documentation
40  \@spaces <\docdate> (FMi)}

We also announce the file to L^{A}TEX 2ε, so that it shows up in \listfiles etc.

41 \ProvidesPackage{ftnright}[\filedate\space
42  LaTeX2e package \fileversion]

To implement the layout described, above we have to distinguish between the left and the right column on a page. For this purpose L^{A}TEX maintains the

switch \if@firstcolumn. When as-

sembling material for the left (i.e., the first) column, footnotes should take up no space, since they are held over for the second column. In the second column these footnotes are combined with the ones found there and placed a suitable distance from the main text at the bottom of this column.

8. Nico Poppelier suggested omitting the \typeout statements in the production version of the files to avoid showing all that unnecessary information to the user. While I accept his criticism as valid, I decided that this information should at least be placed into the transcript file to make it easier to detect problems arising from the use of older versions. The command \wlog is a Plain TEX command that will write its argument to the transcript file.

This means that we have to change certain parameters for the insertion \footins when we construct the second column. The right place to do this is in the L^{A}TEX macro \@outputdblcol which we are going to change later on. What settings for the insertion parameters are appropriate? For setting the first column \count\footins and \skip\footins should both be zero since footnotes are held over while for the second column \count\footins should be 1000 and the \skip\footins has to be set to the desired separation between main text and footnotes.^{9}

We will allow one column of footnotes (i.e., the right column) at most, so that \dimen\footins has to equal \textheight. In principle, it would be possible to allow for even more footnotes, but this would complicate matters enormously.^{10}

Since a document usually starts with a left column, we have to set \count and \skip\footins on top-level to zero. For this purpose, we define a macro \preparefootins which will first save the current value of \skip\footins in a safe place. This saved value will be used later for the second column. In this way, it is possible for the user or a designer of a document class to adjust this parameter without fiddling with the code of this package file.

43 \def\preparefootins{%
44 \global\rcol@footinsskip\skip\footins
45 \global\skip\footins\z@
46 \global\count\footins\z@

We will also assign \textheight to \dimen\footins to allow the user to change this parameter in the preamble.

47 \global\dimen\footins\textheight}

It is necessary to make the assignments above \global because we are going to use this macro in the output routine which has an implicit grouping level to keep the changes made by it local.

Of course, we have to allocate the skip register that we used above:

                                       48 \newskip\rcol@footinsskip

Now we have all the necessary tools available to tackle \@outputdblcol. We have to remember that when

                                    \if@firstcolumn equals \iftrue, we

are currently starting to build the second column, i.e., that the first column is already assembled. Therefore, the macro will start with the following code:

                                       49 \def\@outputdblcol{\if@firstcolumn
                                       50 \global\@firstcolumnfalse

After changing the switch, we save the first column (which was placed by preceeding macros in \@outputbox) in the box register \@leftcolumn. Since we are inside the output routine, all those assignments have to be \global to take any effect.

                                       51 \global\setbox\@leftcolumn\box\@outputbox

Then, we make the footnotes visible to the page generation algorithm by set-

                                    ting \count\footins to 1000 (\@m is

an abbreviation for this number) and

9. A value of 1000 means that there is a oneto-one relationship between the real size of the footnote and the size finally occupied by the footnote on the current page.

10. It is not possible to make \dimen\footins larger than \textheight directly, because this would result in a full left column (with text) and more than one column of footnotes. Instead, one has to make footnotes visible to the page generation algorithm again at the moment when a full column of footnotes is assembled, but we still have some space left in the first column. It is a nice enhancement, and, I suppose, it is of some value for preparing publications in certain disciplines, so here is the challenge …

\skip\footins to its saved value (i.e.,

\rcol@footinsskip).
52 \global\count\footins\@m
53 \global\skip\footins\rcol@footinsskip

We also have to reinsert all footnotes left over from the first column to make sure that they are reconsidered by the page generation algorithm of TEX using the new values for \count and \skip \footins. But this will be done later

in the macro \@startcolumn.

If we have just finished the right column, i.e., when \if@firstcolumn equals \iffalse, we will reset the \footins parameters as explained above using the utitlity macro

\preparefootins.
54 \else \preparefootins

Then, we compose both columns in \@outputbox, combine them with all page-wide floats for this page

(\@combinedblfloats), attach header

and footer, and ship out the result (\@outputpage). Finally we look to see whether it is possible to generate following pages consisting only of page-wide floats.^{11}

55 \global\@firstcolumntrue
56 \setbox\@outputbox\vbox{\hbox to\textwidth
57  {\hbox to\columnwidth
58  {\box\@leftcolumn\hss}%
59  \hfil\vrule\@width\columnseprule\hfil
60  \hbox to\columnwidth
61  {\box\@outputbox\hss}}}%
62 \@combinedblfloats\@outputpage
63 \begingroup
64 \@dblfloatplacement\@startdblcolumn
65 \@whilesw\if@fcolmade\fi
66  {\@outputpage\@startdblcolumn}%
67 \endgroup
68 \fi}

There is a fundamental flaw in L^{A}TEX’s output routine for float columns and float pages: split footnotes, i.e., footnotes which are only partly typeset on the preceding page are not resolved. They are held over until L^{A}TEX starts a page (or column) containing text besides floats again. For our current layout, this would mean, that if L^{A}TEX decided to make the right column of a page a float column, footnotes from the left column would appear on a later page. A real cure for this problem would be to rewrite two-thirds of L^{A}TEX’s output routine, so I am leaving this open for the interested reader.

But the problem shows up even if only one float is contributed to the right column since L^{A}TEX assumes that the whole column is usable, whereas some of it might actually be already devoted to footnotes from the left column. So we have to change the output routine at least in the part that contributes floats to the next column. The macro involved is called \@startcolumn. The first thing we do is to check and see whether any deferred floats exists.

69 \def\@startcolumn{%
70 \ifx\@deferlist\@empty

If not, we set the switch \if@fcolmade to false which says that we did not succeed in making a float column.

Then, we set \@colroom to \@colht.

The register \@colht holds the amount of space that is available for floats, text, and footnotes in one column, i.e., it equals \textheight minus the space devoted to page-wide floats. \@colroom is a similar register which holds the value \@colht minus space for column floats that are already contributed to the current column. Of

11. This part is copied directly from the original L^{A}TEX macro. Details about the used macros, their interfaces and meanings can be found in the L^{A}TEX 2ε source code [4].

course, both values should be equal when we start a new column.

71 \global\@fcolmadefalse
72 \global\@colroom\@colht
73 \else

If there are floats waiting for a change to be processed, the situation is more difficult. In this case, we have to reduce

both \@colht and \@colroom by the

amount of space that will be needed for the footnotes from the left column. So we must check whether such footnotes are present. As we have not reinserted them in \@outputdblcol, we can check

the \footins box.
74 \ifvoid\footins\else

If there are some, we measure the space that will be occupied by them. This measurement is not really exact. If we have a full column of footnotes, it will be too high, but this does matter since we need it only for an upper bound on the free space available for floats.

75  \ftn@amount\ht\footins
76  \advance\ftn@amount\dp\footins
77  \advance\ftn@amount\skip\footins
78 \fi

We then reduce the \@colht by this amount and again assign \@colroom the value of \@colht. If no footnotes are present, we substract zero, so there is no harm in doing this operation all the time.

79 \global\advance\@colht-\ftn@amount
80 \global\@colroom\@colht

Now, we call another internal L^{A}TEX macro that will try to contribute floats to the next column. It will use the register \@colht when trying to build up a float column, which is the reason for reducing this register. If it succeeds, it will set the switch \if@fcolmade to true, otherwise, to false. If no float column is possible, it will try to place some or all of the deferred floats to the top or the bottom of the next column, thereby, using and reducing the value of the register \@colroom.

                                       81 \@xstartcol

Afterwards, we have to restore the cor-

                                    rect values for \@colht and \@colroom

again, but this time, they may differ, so that we have to \advance both registers separately by \ftn@amount.

                                       82 \global\advance\@colht\ftn@amount
                                       83 \global\advance\@colroom\ftn@amount
                                       84 \fi

Now, after doing the things depending on the status of the \@deferlist, we have to incorporate the left over footnotes in the new column. First we check whether a float column was produced by \@xstartcol or not.

                                       85 \if@fcolmade

If so, we do something awful. To make use of the \@makecol macro, which attaches footnotes to \box 255 and places the result in the box register \@outputbox, we have to assign \@outputbox (i.e., the result of

                                    \@xstartcol) to \box 255.^{12}
                                       86 \setbox\@cclv\box\@outputbox
                                       87 \@makecol
                                       88 \else

If no float column was produced, we reinsert the held over footnotes so that they can be reconsidered by the page generation algorithm of TEX. But it is necessary to ensure that this operation is done only when footnotes are actually present.^{13}

12. In German, we call this “from the back through the chest into the eyes”.

13. Otherwise, we might get an undesired extra vertical space coming from \skip\footins, even if there are no footnotes on the page.

89 \ifvoid\footins\else
90  \insert\footins{\unvbox\footins}\fi
91 \fi}

Of course, we also have to allocate the dimen register. It will be automatically initialized to zero.

92 \newdimen\ftn@amount

The macro \@xtsartcol was removed in L^{A}TEX 2ε but we introduce it here again for the moment.

93 \def\@xstartcol{%
94 \@tryfcolumn \@deferlist
95 \if@fcolmade
96 \else
97  \begingroup
98  \let \@tempb \@deferlist
99  \global \let \@deferlist \@empty
100  \let \@elt \@scolelt
101  \@tempb
102  \endgroup
103 \fi

104 }

The other internal macro that we have to change is \@makecol, a macro that is called whenever one column of material is assembled and column floats and footnotes have to be added. Again, we have to distinguish between actions for the first and the second column.

105 \def\@makecol{\if@firstcolumn

For the first column, we leave the footnotes in their box and simply save the contents of box 255 in the \box register

\@outputbox.
106 \setbox\@outputbox\box\@cclv

But if the user errously forgot to specify a twocolumn layout, we will always typeset the first column, so that the footnotes are never printed. Therefore we better check for this special case and output the footnotes on a separate page in an emergency.^{14}

                                       107 \if@twocolumn \else
                                       108  \ifvoid\footins \else
                                       109  \@latexerr{ftnright package
                                       110  used in one-column mode}%
                                       111 {The ftnright package was designed to
                                       112  work with LaTeX's standard^^Jtwocolumn
                                       113  option. It does *not* work with the
                                       114  multicol package.^^JSo please specify
                                       115  `twocolum' in the
                                       116  \noexpand\documentclass command.}%
                                       117  \shipout\box\footins \fi\fi
                                       118 \else

When we construct the second column, we must first check whether footnotes are actually present. If not, we perform the same actions as before.

                                       119 \ifvoid\footins
                                       120  \setbox\@outputbox\box\@cclv
                                       121 \else

But, if footnotes are present, it may be possible that the whole column consists of footnotes, i.e., \box 255 is empty. In this case, there is no use in placing any glue (\skip\footins) in front,^{15} so we have to check for this possibility.

                                       122  \setbox\@outputbox\vbox
                                       123  {\ifvoid\@cclv \else
                                       124  \unvbox\@cclv
                                       125  \vskip\skip\footins\fi

But in any case, we place the \footnoterule in front of the footnotes even if this macro is not used by this package.^{16} This ends the

14. Otherwise, the footnotes are held over for ever, preventing TEX from finishing the document successfully. Instead, TEX will produce infinity many empty pages at the end of the document, trying in vain to output the held over footnotes. This problem was found by Rainer Schöpf when we prepared the paper for the Cork conference.

15. In fact, it would be a mistake since this glue was not taken into account when the footnotes where assembled, so it would produce an overfull box.

16. This decision if certainly open to criticism, since there is nothing to separate. On

if-statement testing whether footnotes are present or not. It also ends the code which differs depending on the column number.

126  \footnoterule\unvbox\footins}\fi
127 \fi

Now the column floats are added at the top and the bottom, and the \@outputbox is adjusted to the full column height so that the glue inside will stretch in certain situations.^{17} Again, this code is copied verbatim from the original source, so I won’t dwell on details.^{18}^{19}

128 \xdef\@freelist{\@freelist\@midlist}%
129 \global \let \@midlist \@empty
130 \@combinefloats
131 \ifvbox\@kludgeins
132  \@makespecialcolbox
133 \else
134 \setbox\@outputbox\vbox to\@colht
135  {\boxmaxdepth\maxdepth
136  \@texttop
137  \@tempdima\dp\@outputbox
138  \unvbox\@outputbox
139  \vskip-\@tempdima
140  \@textbottom}%
141 \fi
142 \global\maxdepth\@maxdepth}

Now we can tackle the remaining small changes to the standard layout. I decided to use a smaller size for footnotes but with a slightly larger leading than usual. This means that we have to redefine the \footnotesize macro which depends on options like 11pt etc. Fortunately, there is a simple way to find out the main size of the document: the macro \@ptsize contains 0, 1, or 2 standing for 10, 11, or 12 points document text size.^{20}

143 \ifcase \@ptsize
144 \renewcommand\footnotesize{%
145 \@setfontsize\footnotesize\@viiipt{9.9}%
146 \abovedisplayskip 6\p@\@plus2\p@\@minus4\p@

147 \abovedisplayshortskip \z@ \@plus\p@
148 \belowdisplayshortskip
149  3\p@\@plus\p@\@minus2\p@
150 \def\@listi{\leftmargin\leftmargini
151  \topsep 3\p@ \@plus\p@ \@minus\p@
152  \parsep 2\p@ \@plus\p@ \@minus\p@
153  \itemsep \parsep}%
154 \belowdisplayskip \abovedisplayskip

155 }

156 \or
157 \renewcommand\footnotesize{%
158 \@setfontsize\footnotesize\@ixpt{11.1}%
159 \abovedisplayskip 8\p@\@plus2\p@\@minus4\p@

the other hand, a rule or some other ornament in front of the footnotes is part of the design which should be used concistently throughout a document. As a last argument in favor of the rule, consider the situation where L^{A}TEX decided to place only floats and footnotes into the right hand column. In this case a separator again seems adequate. In this situation one can even argue that it is necessary to put

in the \skip\footins.

17. It is an interesting question as to whether the current layout works well with bottom floats or not. Actually, I would prefer to place the footnotes below the bottom floats instead of above, as it is done here. At least when the floats are part of the document and not puzzles thrown in. But I was too lazy to implement it because I seldom use floats. If somebody implements this layout (some parts of this macro have to be changed) I would be interested in seeing the code and some sample results.

18. I only changed \dimen128 into \@tempdima which is, besides being faster and shorter, only a cosmetic change. The use of this hardwired dimen register seems to indicate that this part of L^{A}TEX was written very early and left unchanged since then: an interesting fact for software archeologists.

19. For the L^{A}TEX 2ε upgrade I had to add the support for the \enlargethispage command—let’s hope I did it in the correct way.

20. In the new release I used the definitions from the class option files size1?.clo and modified them slightly. In the previous release there was no correction for the list parameters etc., thus giving you incorrect spacing if somebody used display lists in footnotes.

160 \abovedisplayshortskip \z@ \@plus\p@
161 \belowdisplayshortskip
162  4\p@ \@plus2\p@ \@minus2\p@
163 \def\@listi{\leftmargin\leftmargini
164  \topsep 4\p@ \@plus2\p@\@minus2\p@
165  \parsep 2\p@ \@plus\p@ \@minus\p@
166  \itemsep \parsep}%
167 \belowdisplayskip \abovedisplayskip

168 }

169 \or
170 \renewcommand\footnotesize{%
171 \@setfontsize\footnotesize\@xpt{12.3}%
172 \abovedisplayskip10\p@\@plus2\p@\@minus5\p@
173 \abovedisplayshortskip \z@ \@plus3\p@
174 \belowdisplayshortskip
175  6\p@ \@plus3\p@ \@minus3\p@
176 \def\@listi{\leftmargin\leftmargini
177  \topsep 6\p@ \@plus2\p@ \@minus2\p@
178  \parsep 3\p@ \@plus2\p@ \@minus\p@
179  \itemsep \parsep}%
180 \belowdisplayskip \abovedisplayskip

181 }

182 \fi

Setting footnotes in smaller type and separating them with sufficiant space from the main text allow us to omit the \footnoterule normally used.

183 \let\footnoterule\@empty

Individual footnotes are separated from each other by a more or less baseline skip of the text size. This can be specified with the following code:

184 \AtBeginDocument
185 {\global\footnotesep\ht\strutbox}

The use of the L^{A}TEX 2ε hook

 \AtBeginDocument is a big help

since it allows us to defer everything that might depend on user setting inside the preamble to the \begin{document} environment start.

And finally, a small but nice change, to the mark at the beginning of the footnote text. We will place it at the baseline instead of raising it as a superscript. Additionally, it will get a dot as punctuation.

                                       186 \long\def\@makefntext#1{\parindent 1em
                                       187 \noindent\hbox to 2em{}%
                                       188 \llap{$\@thefnmark.\;\;$}#1}

5 Initialisation

We  defined  the  macro

                                    \preparefootins above, but we

also have to use it to prepare typesetting the first column. As a default for the separation of footnotes and text on the second column, we use the following:

                                       189 \setlength{\skip\footins}
                                       190  {10pt plus 5pt minus 3pt}
                                       191 \AtBeginDocument{\preparefootins}

192 ⟨/package⟩

Of course, this value can be changed, on by the user as described in the introduction.

References

[1] M. Goossens, F. Mittelbach and A. Samarin. The L^{A}TEX Companion. Addison-Wesley, Reading, Massachusetts, 1994.

[2] Hans-Joachim Koppitz, editor. Gutenberg Jahrbuch. Gutenberg-Gesellschaft, Mainz.

[3] Leslie Lamport. L^{A}TEX: A Document Preparation System. Addison-Wesley, Reading, Massachusetts, 1986.

[4] L^{A}TEX3 project. L^{A}TEX 2εdistribution, 1994. Souces for L^{A}TEX 2ε the successor to L^{A}TEX 2.09.

[5] Frank Mittelbach An environment for multi-column output. TUGboat, 10(3):407–415, November 1989.

[6] Frank Mittelbach E-TEX: Guidelines to future TEX extensions. In Lincoln K. Durst, editor, TUGboat, 11(3): 1990 TUG Annual Meeting Proceedings, pages 337–345, September 1990.

[7] Manfred Siemoneit. Typographisches Gestalten. Polygraph Verlag, Frankfurt am Main, second edition, 1989.

[8] Jan Tschichold. Ausgewählte Aufsätze über Fragen der Gestalt des Buches. Birkhäuser Verlag, Basel, 1987. Second printing.

[9] Jan White. Graphic Design for the Electronic Age. Watson Guptill, Xerox Press, New York, 1988.

Puzzle:

Given a simple TEX document containing only straight text, is it possible for the editor, after deleting one sentence, to end up with a document producing an extra page? We assume that the deleted text contains no TEX macros and that the document was prepared with a standard macro package like the one used for TUGboat production.

The answer will be given in the next issue.