Content uploaded by Petr Sojka
Author content
All content in this area was uploaded by Petr Sojka on Jan 30, 2013
Content may be subject to copyright.
Hyphenation on Demand
Petr Sojka
Faculty of Informatics
Masaryk University Brno
Botanick´a 68a, 602 00 Brno
Czech Republic
sojka@informatics.muni.cz
Abstract
The need to fully automate the batch typesetting process increases with the use
of T
E
X as the engine for high-volume and on-the-fly typeset documents which, in
turn, leads to the need for programmable hyphenation and line-breaking of the
highest quality.
An overview of approaches for building custom hyphenation patterns is pro-
vided, along with examples. A methodology of the process is given, combining
different approaches: one based on morphology and hand-made patterns, and
one based on word lists and the program PATGEN. The method aims at modular,
easily maintainable, efficient, and portable hyphenation. The bag of tricks used
in the process to develop custom hyphenation is described.
Motivation
In principle, whether to hyphenate or not is a style
question and CSS [Cascading Style Sheets] should
develop properties to control hyphenation. In
practice, however, for most languages there
is no algorithm or dictionary that gives
all (and only) correct word breaks, so
some help from the author may
occasionally be needed.
— (Bos, 1999)
Separation of content and presentation in today’s
open information managment style in the sense of
SGML/XML (Goldfarb, 1990; Megginson, 1998) is
a challenge for T
E
X as a batch typesetting tool.
The attempts to bring T
E
X’s engine to untangle pre-
sentation problems in the
WWW arena are numer-
ous (Sutor and D´ıaz, 1998; Skoup´y, 1998).
One bottleneck in the high-volume quality pub-
lishing is the proofreading stage — line-breaking and
hyphenation handling that need to be fine tuned to
the layout of particular publication. Tight dead-
lines in paper-based document production and high-
volume electronic publishing put additional demands
for better automation of the typesetting process.
The need for multiple presentations of the same data
(e.g., for paper and screen) adds another dimension
to the problem. Problems with hyphenation are of-
ten one of the most difficult. As most T
E
X users are
perfectionists, fixing and tuning hyphenation for ev-
ery presentation is a tedious, time-consuming task.
We have already dealt with several issues re-
lated to hyphenation in T
E
X (Sojka and
ˇ
Seveˇcek,
1995; Sojka, 1995). On the basis of our being in-
volved in typesetting tens of thousands of T
E
X pages
of multilingual documents (mostly dictionaries), we
want to point out several methods suitable for the
development of hyphenation patterns.
Pattern generation
There is no place in the world that is
linguistically homogeneous, despite the
claims of the nationalists around the world.
— (Plaice, 1998)
Liang (1983), in his thesis written under Knuth’s su-
pervision, developed a general method to solve the
hyphenation problem that was adopted in T
E
X82
(Knuth, 1986a, App. H). He wrote the PATGEN pro-
gram (Liang and Breitenlohner, 1999), which takes
• a list of already hyphenated words (if any),
• a set of patterns (if any) that describes “rules”,
• a list of parameters for the pattern generation
process,
• a character code translation file (added in PAT-
GEN 2.1; for details see Haralambous (1994),
and generates
• an enriched set of patterns that “covers” all hy-
phenation points in the given input word list,
• a word list hyphenated with the enriched set of
patterns (optional).
TUGboat, Volume 20 (1999), No. 3 — Proceedings of the 1999 Annual Meeting 241
Petr Sojka
The patterns are loaded into T
E
X’s memory
and stored in a data structure (cf. Knuth, 1986b,
parts 40 – 43), which is also efficient for retrieval —
a variant of trie memory (cf. Knuth, 1998, pp. 492 –
512). This data structure allows hyphenation pat-
tern searching in linear time with respect to the pat-
tern length. The algorithm using a trie that “out-
puts” possible hyphenation positions may be viewed
as finite automaton with output (Mealy automaton
or transducer).
Pattern deve lopment
...problems [with hyphenation] have more or less
disappeared, and I’ve learnt that this is only because,
nowadays, every hyphenation in the newspaper
is manually checked by human proof-readers.
— (Jarnefors, 1995)
Studying patterns that are available for various lan-
guages shows that PATGEN has only been used for
about half of the hyphenation pattern files on
CTAN
(cf. Table 1 in Sojka and
ˇ
Seveˇcek, 1995).
There are two approaches to hyphenation pat-
tern development, depending on user preferences.
Single authors using T
E
X as an authoring tool want
to minimize system changes and want T
E
Xtobe-
have as a fixed point so that re-typesetting of old
articles is easily done, thanks to backwards compat-
ibility. For such users, one set of patterns that is
fixed once and for all might be sufficient.
On the other hand, for publishers and corpo-
rate users with high-volume output, it is more ef-
ficient to make a long-term investment into devel-
opment of hyphenation patterns for particular pur-
poses. I remember one T
E
X user saying that my sug-
gestion to enhance standard hyphenation patterns
with custom-made ones to allow better hyphenation
of chemical formulæ would save his employer thou-
sands of pounds per year. Of course, with this ap-
proach, one has to archive full sources for every pub-
lication, together with hyphenation patterns and ex-
ceptions.
One of the possible reasons PATGEN has not been
used more extensively may be the high investment
needed to create hyphenated lists of words, or bet-
ter, a morphological database of a given language.
Pattern bootstrapping and iterative
development
The road to wisdom?
Well it’s plain and simple to express:
Err and err and err again
but less and less and less.
— (Hein, 1966)
When developing new patterns, it is good to start
with the following bootstrapping technique with it-
eration, which should avoid the tedious task of man-
ually marking hyphenation points in huge lists of
words:
1. Write down the most obvious initial patterns,
if any, and/or collect “the closest” ones (e.g.,
consonant-vowel rules).
2. Extract a small word list for the given language.
3. Hyphenate current word list with current set
patterns.
4. Check all hyphenated words and correct them;
in the case of errors return to step 3.
5. Collect a bigger word list.
6. Use the previously generated set of patterns to
hyphenate the words in this bigger list.
7. Check hyphenated words, and if there are no
errors, move to step 9.
8. Correct word list and return to step 6.
9. Generate final patterns with PATGEN with pa-
rameters fitted for the particular purpose (tuned
for space or efficiency).
10. Merge/combine new patterns with other mod-
ules of patterns to fit the particular publishing
project.
To find an initial set of patterns, some basic
rules of hyphenation in the specific language should
be known. Language can be grouped into one of two
categories: those that derive hyphenation points ac-
cording to etymology and those that derive hyphen-
ation according to pronunciation — “syllable-based”
hyphenation. For the first group of languages, one
should start with patterns for most frequent end-
ings and suffixes and prefixes. For syllable-based
hyphenation, patterns based on sequences of conso-
nants and vowels might be used (cf. Chicago Manual
of Style, 1993, Section 6.44, and Haralambous, 1999)
as first approximation of hyphenation patterns.
As using T
E
X itself for hyphenation of word lists
and development of patterns may be preferred to
other possibilities, we will start with this portable
solution, using hyphenation of phonetic transcrip-
tions as an example of a syllable-based “language”.
Let’s start with some plain T
E
X code to define
consonant-vowel (
CV) patterns:
% ... loading plain.tex
% without hyphen.tex patterns ...
\patterns{cv1cv cv2c1c ccv1c cccv1c
ccccv1c cccccv1c v2v1 v2v2v1 v2v2v2v1
...
}
242 TUGboat, Volume 20 (1999), No. 3 — Proceedings of the 1999 Annual Meeting
Hyphenation on Demand
There is a way to typeset words together with their
hyphenation points in T
E
X; the code from Olˇs´ak
(1997, with minor modifications) looks like this:
\def\showhyphenspar{\begingroup
\overfullrule=0pt \parindent0pt
\hbadness=10000 \tt
\def\par{\setparams\endgraf\composelines}%
\setbox0=\vbox\bgroup
\noindent\hskip0pt\relax}
\def\setparams{\leftskip=0pt
\rightskip=0pt plus 1fil
\linepenalty1000 \pretolerance=-1
\hyphenpenalty=-10000}
\def\composelines{%
\global\setbox1=\hbox{}%
\loop
\setbox0=\lastbox \unskip \unpenalty
\ifhbox0 %
\global\setbox1=\hbox{%
\unhbox0\unskip\hskip0pt\unhbox1}%
\repeat
\egroup % close \setbox0=\vbox
\exhyphenpenalty=10000%
\emergencystretch=4em%
\unhbox1\endgraf
\endgroup}
Now, we will typeset our word list in the typewriter
font without ligatures. To use the
CV patterns de-
fined above we need to map word characters prop-
erly:
% vowels mapping
\lccode‘\a=‘v \lccode‘\e=‘v
\lccode‘\i=‘v \lccode‘\o=‘v
...
% consonants
\lccode‘\b=‘c \lccode‘\c=‘c
\lccode‘\d=‘c \lccode‘\f=‘c
...
\raggedbottom \nopagenumbers
\showhyphenspar
The need to fully automate the
batch typesetting process increases
with the use of word in wordlist
...
\par\bye
Finally, extracting hyphenated words from dvi the
file via the dvitype program, we get our word list
hyphenated by our simple
CV patterns.
Another way to get the initial word list hyphen-
ated is to use PATGEN with initial patterns and no
new level, letting PATGEN hyphenate the word list
that was input.
PERL addicts may want to use the
PERL hyphenation module (Pazdziora, 1997) for the
task.
Once the job of proofreading the word list is
finished, we can generate new patterns and collect
other words in the language. Using new patterns
on the new collection will show the efficiency of the
process.
Fine tuning of patterns may be iterated, once
PATGEN parameters are set, so that nearly 100 % cov-
erage of hyphenation points is achieved in every it-
eration. The setting of such PATGEN parameters may
be difficult to find on the first attempt. Setting of
these parameters is discussed in Sojka and
ˇ
Seveˇcek
(1995).
Modularity of patterns
It is tractable for some languages to create patterns
by hand, simply by writing patterns according to the
rules for a given language. This approach is, how-
ever, doomed to failure for complex languages with
several levels of exceptions. Nevertheless, there are
special cases in which we may build pattern modules
and concatenate patterns to achieve special purpose
behaviour. This applies especially when additional
characters (not handled when patterns have been
built originally) may occur in words that we still
want to hyphenate.
Patterns generated by Raichle (1997) may serve
as an example that can be used with any fonts in the
standard L
A
T
E
X eight-bit T1 font encoding, to allow
hyphenation after an explicit hyphen. Similar pat-
tern modules can be written for words or chemical
formulæ that contain braces and parentheses. These
can be combined with “standard” patterns in the
needed encodings. Some problems might be caused
by the fact that T
E
X does not allow metrics to be
defined for \lefthyphenmin and \righthyphenmin
properly — we might want to say that ligatures, for
instance, count as a single letter only or that some
characters should not affect hyphenation at all (e.g.
parentheses in words like colo(u)r). We must wait
until some naming mechanisms for output glyphs
(characters) is adopted by the T
E
X community for
handling these issues.
Adding a new primitive for the hyphenmin code
— let’s call it \hccode, a calque on \lccode — would
cause similar problems: changing it in mid-para-
graph would have unpredictable results.
1
It is advisable to create modules or libraries of
special-purpose hyphenation patterns, such as the
1
ε-T
E
Xv2hasanewfeaturetofixthe\lccode values
during the pattern read phase.
TUGboat, Volume 20 (1999), No. 3 — Proceedings of the 1999 Annual Meeting 243
Petr Sojka
ones mentioned above, to ease the task of pattern
development. These patterns might be written in
such as as to be easily adaptable for use with core
patterns of a different language.
Common patterns for more languages
Having large hyphenated word lists of several lan-
guages the possibility then exists to make multilin-
gual or special-purpose patterns from collections of
words by using PATGEN. Joining word lists and gen-
erating patterns on demand for particular publica-
tions is especially useful when the word databases
are structured and split into sublists of personal
names, geographic names, abbreviations, etc. These
patterns are requested when typesetting material in
which language switching is not properly done (e.g.
on the
WWW).
Czech and Slovak are very closely related lan-
guages. Although they do not share exactly the
same alphabet, rules for hyphenation are similar.
That has led us to the idea of making one set of hy-
phenation patterns to work for both languages, sav-
ing on space in a format file that supports both. In
the Czech/Slovak standard T
E
X distribution there is
support for different font encodings. For every en-
coding, hyphenation patterns have to be loaded as
there is no character remapping on the level of trie
possible. Such Czechoslovak patterns would save
patterns for each encoding in use.
It should be mentioned that this approach can-
not be taken for any set of languages as there may
be, in general, identical words that hyphenate dif-
ferently in different languages; thus, simply merging
word lists to feed PATGEN is not sufficient without de-
grading the performance of patterns by forbidding
hyphenation in these conflicting words (e.g. re-cord
vs. rec-ord).
Phonetic hyphenation
As an example of custom-made hyphenation pat-
terns, the patterns required to hyphenate a pho-
netic (
IPA) transcription are described in this sec-
tion. Dictionaries use this extensively — see Fig. 1,
2
taken from Kirsteinov´a.
The steps used to develop the hyphenation pat-
terns for this dictionary were similar to those de-
scribed in the previous section on bootstrapping:
1. Write down the most obvious (syllable) pat-
terns.
2. Extract all phonetic words from available texts.
2
The IPA font used is TechPhonetic, downloadable from
http://www.sil.org/ftp/PUB/SOFTWARE/WIN/FONTS/.
akkompagnement sb [æk
^
mpænj
{
-
'
ma
4
] -et, -er hudebnı´ doprovod m
alimentationsbidrag sb [ælim
E
ntæ-
'
sˇo:’ns
,
bi
,
dra:’w] -et, - alimenty pl,
p
ˇ
rı´sp
ˇ
evek m na vy´zˇivne´dı´t
ˇ
ete
befolknings
eksplosion sb [be
'
f
^
l’g-
ne
4
s-] -en, -er popula
ˇ
cnı´explozef
-tilvækst -en, -er pˇrı´r˚ustek m
obyvatelstva
-tæthed -en, -er
hustota f obyvatelstva
bemærkelsesværdig adj [be
'
mæ
R
-
g
{
ls
{
s
,
væ
R
’di] -t, -e pozoruhodny´
beslutningsdygtig adj [be
'
slud-
ne
4
s
,
døgdi] -t, -e schopny´
rozhodovat; den lovgivende for-
samling var
˜
za´konoda´rne´ shro-
ma´zˇd
ˇ
enı´ bylo schopne´seusna´sˇet
Figure 1: Example of phonetic hyphenation
in Kirsteinov´a and Borg (1999).
3. Hyphenate this word list with the initial set of
patterns.
4. Check and correct all hyphenated words.
5. Generate final quality patterns.
In bigger publishing projects efforts like this pay off
very quickly.
Hyphenation for an etymological dictionary
In some publications (Rejzek, in prep., for exam-
ple), a different problem can arise: the possibility of
having more than 256 characters used within a sin-
gle paragraph. This problem cannot, in general, be
easily solved
3
withintheframeofT
E
X82. We thus
tried Ω, the typesetting system by Plaice and Hara-
lambous, for this purpose. One has to create special
virtual fonts (e.g., by using the fontinst package) on
top of the Ω ones, in order to typeset it — see Fig. 2.
More hyphenation classes
But at least I can point out a minor weakness
of T
E
X’s algorithm: all possible hyphenations
have the same penalty. This might be ok
for english, but for languages like German
that have a lot of composite words there
should be the ability to assign lower penalties
between parts of a composite i.e. Um-brechen
should be favored against Umbre-chen.
— (Hars, 1999)
3
One could try to re-encode all fonts used in parallel
in some paragraph such that they share the same \lccode
mappings, but this exercise would have to be made for each
multilingual-intensive publication, again and again.
244 TUGboat, Volume 20 (1999), No. 3 — Proceedings of the 1999 Annual Meeting
Hyphenation on Demand
Figure 2: Using Ω to typeset paragraphs in which
words from languages with more than 256 different
characters may appear and be hyphenated in
parallel.
Some suggestions on handling multiple hyphenation
classes were suggested in Sojka (1995). A proto-
type implementation of ε-T
E
XandPATGEN has re-
cently been done (Classen, 1998). For wider adop-
tion of such improvements availability of large word
lists and development of new patterns is crucial.
Many of the methods mentioned above could be
used to develop such multi-class/multi-purpose pat-
terns. Allen (1990) contains such a word list, which
shows that some publishers do pay attention to line-
breaking details.
Speed considerations
Even though hyphenation searches using a trie data
structure is fast, searching for unnecessary hyphen-
ation points is a waste of time. It is advisable to tell
T
E
X where words shouldn’t be hyphenated. Com-
paring several possibilities for suppressing hyphen-
ation, the option of setting \lefthyphenmin to 65 is
slightly faster than switching to \language, which
has no patterns. These solutions outperform the
\hyphenpenalty 10000 solution by a fair amount
(cf. Arsenau, 1994).
Reuse of patterns
Sometimes we need the same patterns with differ-
ent \lefthyphenmin and \righthyphenmin param-
eters. The suggested approach is not to limit hy-
phens close to word boundaries during the pattern
generation phase but to use T
E
X’s \setlanguage
primitive. This can be done to achieve special hy-
phenation handling for the last word in a paragraph
(e.g., a higher \righthyphenmin) given proper mark-
up by a preprocessing filter. For example:
\newcount\tmpcount
\def\lastwordinpar#1{%
\tmpcount=\righthyphenmin
\righthyphenmin5
\setlanguage\language #1
\expandafter\righthyphenmin\the\tmpcount
\setlanguage\language}
\showhyphens{demand}
\lastwordinpar{demand\showhyphens{demand}}
\bye
Future work
If you find that you’re spending almost
all your time on practice, start turning
some attention to theoretical things;
it will improve your practice.
— (Knuth, 1989)
It seems inevitable that embedding of language-spe-
cific support modules will be necessary for the type-
setting system in the future. These demands may
not only apply for hyphenation but also for spelling
or even grammar checkers. As even people using
WYSIWYG systems may use tools that help to vi-
sualise possible typos (in color, etc.) on the fly, the
computing power of today’s machines is surely suf-
ficient to do the same in batch processing with even
better results.
The idea of using patterns to capture mappings
specific for particular languages or dialect modules
can be further generalized for different purposes and
mappings. The use of the theory of finite-state trans-
ducers (Mohri, 1996; Mohri, 1997; Roche and Sch-
abes, 1996) to implement other classes of language
modules looks promising.
TUGboat, Volume 20 (1999), No. 3 — Proceedings of the 1999 Annual Meeting 245
Petr Sojka
Summary
Some computerized typesetting methods in frequent
use today may render a conservative approach
to word division impractical. Compromise may
therefore be necessary pending the development
of more sophisticated technology.
— Chicago Manual of Style (1993, Section 6.43)
We have outlined some of the possibilities offered
by T
E
XandPATGEN for the development of cus-
tomized hyphenation patterns. We have suggested
bootstrapping and iterative techniques to facilitate
pattern development. We also suggest wider em-
ployment of PATGEN and preparation of hyphenated
word lists and modules of patterns for easy prepara-
tion of hyphenation patterns on demand in today’s
age of digital typography (Knuth, 1999).
Acknowledgements. We thank Bernd Raichle for
valuable comments and corrections to the paper. We
are indebted to the Proceedings editor for wording
improvements. The presentation of this work has
been made possible through support from the Min-
istery of Education, Youth and Physical Training
(
M
ˇ
SMT
ˇ
CR grant VS97028).
References
Allen, R.E. The Oxford Spelling Dictionary,vol-
ume II of The Oxford Library of English Usage.
Oxford University Press, 1990.
Arsenau, Donald. “Benchmarking paragraphs with-
out hyphenation”. Posting to the Usenet group
news:comp.text.tex on Dec 13, 1994.
Bos, Bert. “Internationalization / Localiza-
tion”. http://www.w3.org/International/
O-HTML-hyphenation.html, 1999.
Chicago Manual of Style. The Chicago Manual of
Style, 14th edition, 1993.
Classen, Matthias. “An extension of T
E
X’s hyphen-
ation algorithm”. ftp://peano.mathematik.
uni-freiburg.de/pub/etex/hyphenation/,
1998.
Goldfarb, Charles F. The
SGML Handbook. Claren-
don Press, Oxford, 1990.
Haralambous, Yannis. “A Small Tutorial on the
Multilingual Features of PATGEN2”. In elec-
tronic form, available from
CTAN as info/
patgen2.tutorial, 1994.
Haralambous, Yannis. “From Unicode to Typogra-
phy, A Case Study: The Greek Script”. Pro-
ceedings of 14th International Unicode Confer-
ence, preprint available from http://genepi.
louis-jean.com/omega/boston99.pdf, 1999.
Hars, Florian. “Typo-l email discussion list”. 1999.
Hein, Piet. Grooks.
MIT Press, Cambridge, Mas-
sachusetts, 1966.
Jarnefors, Olle. “
ISO-10646 email discussion list”.
1995.
Kirsteinov´a, Blanka and B. Borg. D´ansko-ˇcesk´y
slovn´ık, Dansk-Tjekkisk Ordbog [Danish-Czech
dictionary].
LEDA, Prague, Czech Republic,
1999.
Knuth, Donald E. The T
E
Xbook, volume A of Com-
puters and Typesetting. Addison-Wesley, Read-
ing, MA, USA, 1986a.
Knuth, Donald E. T
E
X: The Program, volume B
of Computers and Typesetting. Addison-Wesley,
Reading, MA, USA, 1986b.
Knuth, Donald E. “Theory and Practice”. Keynote
address for the 11th World Computer Congress
(Information Processing ’89), 1989.
Knuth, Donald E. Sorting and Searching, volume 3
of The Art of Computer Programming. Addison-
Wesley, 1998.
Knuth, Donald E. Digital Typography.
CSLI Lecture
Notes 78. Center for the Study of Language and
Information, Stanford, California, 1999.
Liang, Frank. Word Hy-phen-a-tion by Com-put-er.
Ph.D. thesis, Department of Computer Science,
Stanford University, 1983.
Liang, Frank and P. Breitenlohner. “PATtern GEN-
eration Program for the T
E
X82 Hyphenator”.
Electronic documentation of PATGEN program
version 2.3 from web2c distribution on
CTAN,
1999.
Megginson, David. Structuring
XML Documents.
Prentice-Hall, Inc., Englewood Cliffs, New Jer-
sey, 1998.
Mohri, Mehryar. “On some applications of finite-
state automata theory to natural language pro-
cessing”. Natural Language Engineering 2(1),
61–80, 1996.
Mohri, Mehryar. “Finite-State Transducers in Lan-
guage and Speech Processing”. Computational
Linguistics 23(2), 269–311, 1997.
Olˇs´ak, Petr. T
E
Xbook naruby [T
E
Xbook topsy-turvy].
Konvoj, Brno, 1997.
Pazdziora, Jan. “TeX::Hyphen— hyphen-
ate words using T
E
X’s patterns”. CPAN:
modules/by-authors/Jan_Pazdziora/
TeX-Hyphen-0.10.tar.gz, 1997.
Plaice, John. “pdftex email discussion list”.
http://www.tug.org/archives/pdftex/
msg01913.html, 1998.
Raichle, Bernd. “Hyphenation patterns for words
containing explicit hyphens”. CTAN/language/
hyphenation/hypht1.tex, 1997.
246 TUGb oat, Volume 20 (1999), No. 3 — Proceedings of the 1999 Annual Meeting
Hyphenation on Demand
Rejzek, Jan. Etymologick´yslovn´ık ˇcesk´eho jazyka
[Czech Etymological Dictionary].
LEDA, Prague,
Czech Republic, in prep..
Roche, Emmanuel and Y. Schabes. Finite-State
Language Processing.
MIT Press, 1996.
Skoup´y, Karel. “N
T
S: A New Typesetting Sys-
tem”. TUGboat 18(3), 318–322, 1998.
Sojka, Petr. “Notes on Compound Word Hyphen-
ation in T
E
X”. TUGboat 16(3), 290–297, 1995.
Sojka, Petr and P.
ˇ
Seveˇcek. “Hyphenation in T
E
X—
Quo Vadis?”. TUGboat 16(3), 280–289, 1995.
Sutor, Robert S. and A. L. D´ıaz. “
IBM techplorer:
Scientific Publishing for the Internet”. Cahiers
Gutenberg 28–29 , 295–308, 1998.
The Young Man of Vancouver
There was a young man of Vancouver
who thought he admired Anita Hoover
but he looked at some macros
which ran under Windows
and now all he can think of is \over s
—Sebastian Rahtz
The TUG conference
Down the T
E
Xing path we go
with a Sparc its not so slow
Up the network nodes we run
\href links can be so much fun
Round the browser wars we dodge
Sans MathML—a real hodge-podge
Home at last—the Web is fast—we wait for L
A
T
E
X3
While Frank and David trade ideas,
Chris seeks terminology
—Christina Thiele
The Young Lady of Stanford
There was a young lady from Stanford
who delighted to play with Mac Word
she met a Don Knuth
who told her the truth
and now what she enjoys is absurd
—Sebastian Rahtz and Patrick Ion
TUGboat, Volume 20 (1999), No. 3 — Proceedings of the 1999 Annual Meeting 247