MlBibTEX: Reporting the experience∗

Jean-Michel Hufflen LIFC (EA CNRS 4157) University of Franche-Comté 16, route de Gray 25030 BESANÇON CEDEX France hufflen (at) lifc dot univ-fcomte dot fr http://lifc.univ-fcomte.fr/~hufflen

Abstract This article reports how the different steps of the MlBibTEX project were con- ducted until the first public release. We particularly focus on the problems raised by reimplementing a program (BibTEX) that came out in the 1980’s. Since that time, implementation techniques have evolved and new requirements have ap- peared, as well as new programs within TEX’s galaxy. Our choices are explained and discussed. Keywords TEX, LATEX, BibTEX, reimplementation, reverse engineering, im- plementation language, program update.

Streszczenie Artykuł omawia realizację poszczególnych kroków przedsięwzięcia MlBibTEX, w czasie do przedstawienia pierwszej publicznej wersji. W szczególności skupiamy się na problemach powstałych przy reimplementacji programu (BibTEX), powsta- łego w latach 80 zeszłego wieku. Od tego czasu rozwinęły się techniki implemen- tacyjne, powstały nowe wymagania oraz nowe programy w świecie TEX-owym. Przedstawiamy i dyskutujemy dokonane wybory. Słowa kluczowe TEX, LATEX, BibTEX, reimplementacja, reverse engineering, język implementacji, aktualizacja programu.

0 Introduction aim to provide new programs, based on TEX & Co.’s ideas.2 A first representative example is the LAT X 3 In 2003, TEX’s 25th anniversary was celebrated at E 1 project [32], a second is N S [27]. the TUG conference, held in Hawaii [1]. LATEX MlBibT X — for ‘MultiLingual BibT X’ — be- [28] and BibTEX [35] — the bibliography processor E E longs to the class of such projects. Let us recall usually associated with the LATEX word processor — are more recent, since they came out in the 1980’s, that this program aims to be a ‘better BibTEX’, especially regarding multilingual features. For an shortly after TEX. All are still widely used, such longevity being exceptional for software. However, end-user, MlBibTEX behaves exactly like ‘classical’ these programs are aging. Of course, recent ver- BibTEX: it searches bibliography data base (.bib) sions have incorporated many features absent from files for citation keys used in a document and then the first versions, which proves the robustness of arranges the references found, writing them to a .bbl A these systems. Nevertheless, they present some lim- file suitable for LTEX, w.r.t. a bibliography style. 3 4 itations due to the original conception, and a major MlBibTEX is written in Scheme, it uses XML as a reimplementation may be needed to integrate some modern requirements. In addition, interactive word 2 Concerning TEX, an additional point is that TEX’s de- processors have made important progress and are se- velopment has been frozen by its author, Donald E. Knuth [26]. If incorporating new ideas to a ‘new TEX’ leads to a ma- rious rivals, even if they do not yield typesetting of jor reimplementation, the resulting program must be named such professional quality. That is why some projects differently. 3 The version used is described in [24]. ∗ Title in Polish: MlBIBTEX: raport z doświadczeń. 4 EXtensible Markup Language. Readers interested in 1 TEX Users Group. an introductory book to this formalism can consult [37].

TUGboat, Volume 29, No. 1 — XVII European TEX Conference, 2007 157 Jean-Michel Hufflen central format: when entries of .bib files are parsed, ming language, higher than . So we consider they result in an XML . Bibliography styles tak- again the prototype in Scheme that we sketched ing advantage as far as possible of MlBibTEX’s new in 2002. SXML7 [25] is chosen as the represen- features are written using nbst,5 a variant of XSLT6 tation of XML texts in Scheme. Some parts of described in [15]. The stack-based bst language [34] MlBibTEX are directly reprogrammed from C used for writing bibliography styles of BibTEX can to Scheme. As for the other parts, this proto- be used in a compatibility [20]. type is a good basis for much experiment [16]. We think that the experience we have gained Nov. 2004 The version written in C is definitely in developing MlBibTEX may be useful for other, dropped, whereas the version in Scheme is mod- analogous, projects. To begin, we briefly review the ified to improve efficiency; it becomes the ‘offi- chronology of this development. As will be seen, cial’ MlBibTEX [18]. this development has not been linear, and the two following sections focus on the problems we had to Sep. 2005 We decided to freeze MlBibTEX’s design face. We explain how we have determined which and concentrate only on finishing programming. Many Scheme functions are rewritten in confor- criteria are accurate when a 8 is to be chosen for such an application. Then we mity to SRFIs [39]. show how the compatibility with ‘old’ data and the May 2006 A working version is almost finished, integration of modern features should be managed. except for the interface with the kpathsea li- brary. 1 MlBibTEX’s chronology May 2007 Public availability of MlBibTEX’s Ver- Oct. 2000 MlBibTEX’s design begins: the syntax sion 1.3. of .bib files is enriched with multilingual anno- Let us also explain that MlBibT X is not our tations. Version 1.1’s prototype is written using E only task. As an Assistant Professor in our univer- the C programming language and tries to reuse sity, we teach computer science, and participate in parts of ‘old’ BibT X’s program as far as pos- E other projects. As a consequence, MlBibT X’s de- sible. E velopment has been somewhat anarchic: we hardly May 2001 The first article about Ml T X is [9]. Bib E worked on it for two or three months, put it aside Later, the experience of developing Ml T X’s Bib E for one or two months, and so on. Last, we have su- Version 1.1 is described in [10]. pervised some student projects regarding graphical May 2002 After discussions with participants at tools around MlBibTEX [2, 8], programmed using the EuroBachoTEX conference, we realise that Ruby [31], but concerning the development of the the conventions for bibliography styles are too MlBibTEX program itself, we have done it alone. diverse, even if we consider only those of Eu- ropean countries. We realise that this first ap- 2 Choice of an implementation language proach is quite unsuitable, without defining a There are several programming paradigms: impera- new version of the bst language. So we decide tive, functional, and logic programming. There are to explore two directions. First, we develop a also several ways to implement a programming lan- questionnaire about problems and conventions guage: interpretation and compilation. Some par- concerning bibliography styles used within Eu- adigms are more appropriate, according to the do- ropean countries. Second, we begin a prototype main of interest. Likewise, some interpreted lan- in Scheme implementing the bst language [11]. guages are more appropriate if you want to pro- Initially, this prototype is devoted to experi- gram a prototype quickly and are just interested in ments about improving bst in a second version, performing some experiment.9 But compiled lan- 1.2. guages are often preferable if a program’s efficiency Jan. 2003 Version 1.2 is stalled. The new version is crucial. In addition, the level of a programming (1.3) is based on XML formats. The nbst lan- language has some influence on development: in a guage is designed and presented at [12, 13]. We high-level language, low-level details of structures’ explain in [14] how the results of our question- implementation do not have to be made explicit, so naire have influenced this new direction. Feb. 2004 It appears to us that MlBibTEX should 7 Scheme implementation of XML. be developed using a very high-level program- 8 Scheme Requests for Implementation, an effort to coor- dinate libraries and other additions to the Scheme language 5 New Bibliography STyles. between implementations. 6 eXtensible Stylesheet Language Transformations, the 9 Such is the case for the two graphical tools around language of transformations used for XML documents [44]. MlBibTEX programmed in Ruby by our students [2, 8].

158 TUGboat, Volume 29, No. 1 — XVII European TEX Conference, 2007 MlBibTEX: Reporting the experience development is quicker, and the resulting programs implementation of low-level functionalities. are more concise, nearer to a mathematical model. Finally, our choice was Scheme, the modern di- In addition to these general considerations, let alect of Lisp. We confess that we are personally us recall that we aim to replace an existing program attracted by languages, be- by a new one. This new program is supposed to cause they can abstract procedures as well as data: do better than the ‘old’ one. ‘To do better’ may in this sense, they are very high-level programming mean ‘to have more functionalities, more expressive languages. Concerning Scheme, it seems to us to be power’, but for sake of credibility, it is desirable for undebatable that it has very good expressive power, the new program to be as efficient as the ‘old’ one. and takes as much advantage as possible of lexical Let us not forget that TEX and BibTEX are written scoping. In addition, it allows some operations to be using an old style of programming — more precisely, programmed ‘impurely’, by side effects, as in imper- a monolithic style used in the 1970’s–1980’s — based ative programming, in order to increase efficiency. mainly on global variables, without abstract data However, we use this feature parsimoniously, on lo- types. Choosing a language implemented efficiently cal variables, since it breaks the principles of func- is crucial: as a counter-example, NT S, written us- tional programming. We have defined precise rules ing Java, has been reported 100 times slower than for naming variables, as we did in C for the first ver- TEX [42, § 5]. That is why we wrote MlBibTEX’s sion, in order to emphasise the modular decomposi- first version using C, because of its efficiency. In ad- tion of our program [19]. Last but not least, Scheme dition, this language is portable to most operating programs may be interpreted — when software is be- systems. And to make our program modular, we de- ing developed — or compiled, in which case they are fined precise rules for naming procedures [10, § 3]. more efficient. As an example of a good Scheme im- But two problems appeared. plementation, [38] compiles Scheme functions First, MlBibTEX’s development has not been by transforming them into C functions, then these a daily task, as mentioned above. Even if we are C functions are compiled, in turn. personally able to program large applications in C, If we compare the implementations in C and it is difficult to put aside a C program and resume Scheme, the latter is better, as expected from a it later: from this point of view, C is not a very very high-level programming language. But pro- high-level language. Besides, let us not forget that gramming an application related to TEX using a lan- we are working within an open domain, as natural guage other than C reveals a drawback: the kpath- languages are. A change may be needed because of sea [3] is written in C. Let us recall that new features concerning languages that had not yet kpathsea implements functions navigating through been integrated into MlBibTEX’s framework. The the TDS11 [43]. In particular, such functions lo- higher the level, the more easily such a change can calise the files containing the specification of a class be applied. for a LATEX document or a bibliography style when Second, we want end-users of MlBibTEX to be BibTEX runs. If there is a compatibility mode, for able to influence the behaviour of this program. For ‘old’ bibliography styles written in bst, the functions example, many BibTEX users put LATEX commands of this compatibility mode should be able to localise inside values associated with fields of .bib files, in or- such files too. Likewise, ‘new’ bibliography styles der to increase their expressive power within biblio- written in nbst, should be localised by means of graphical data. These users should be able to spec- an analogous method. This implies that the lan- ify how to handle such commands when .bib files are guage — or, at least, an implementation of the lan- converted into XML trees. In particular, this is use- guage — used for our software includes an interface ful if MlBibTEX is used to produce outputs for word with C. processors other than LATEX [21]. How to do that in Of course, what we expose above proceeds from C, without defining a mini-language to express such general considerations. After all, we do not know functions? In this case, using a script language is a if BibTEX++ [4] — a successor of BibTEX based on better choice . . . provided that this language is effi- Java, with bibliography styles also written in Java — cient. Another choice is a Lisp10 dialect, as in is much less efficient than BibTEX. This may not be [40]: end-users can customise Emacs’ behaviour by the case. The advantages of script languages in such writing expressions using the Emacs Lisp language development appear if we consider Bibulus [46], an- [30]. This choice is homogeneous: the entire Emacs other successor of BibTEX, written using .12 It editor is expressed in Emacs Lisp, excepting for the 11 TEX Directory Structure. 12 Practical Extraction Report Language. A didactic in- 10 LISt Processor. troduction to this language is [45].

TUGboat, Volume 29, No. 1 — XVII European TEX Conference, 2007 159 Jean-Michel Hufflen has developed more quickly than MlBibTEX, but is points out that the arguments of some macros — ‘less’ multilingual and uses BibTEX when it runs. e.g., \catcode — are not easily parseable. As an- That is, Bibulus does not replace BibTEX wholly, as other example, the ConTEXt format [7] implements MlBibTEX attempts to do. In addition, there is an a homogeneous expression of setup commands, by example where the need of a programming language means of a ‘key=value’ syntax: at a higher level than C appeared: the project of \setuplayout[backspace=4cm,topspace=2.5cm] moving Ω — a successor of T X — into a C++ plat- E Nevertheless, is it reasonable to add more and more form [36]. syntactic sugar to such old-fashioned syntax? Would We personally think that an implementation of the definition of new languages not be preferable? N S in [41] — what was planned ini- T Of course, the present languages of T X and BibT X tially — would have been preferable. As mentioned E E will still remain to be used, due to the huge number in [47], the object-oriented features of Common Lisp of files using them and developed by end-users. But (CLOS13) have been added to the language’s basis — if a new language is designed, it should become the as C++ object-oriented functionalities are added on usual way to deal with the new program. Of course, top of C — but the language itself is not actually end-users will have to get used to the new language. object-oriented. In [47], this point is viewed as a But that can be done progressively and synergy be- drawback. First, we personally think that not every- tween developers and users may cause this new lan- thing is an object, from the point of view of conceiv- guage to be improved if need be. ing ideas. Second, Common Lisp, even if it is a func- In addition, let us remark that in our case, the tional programming language, allows some opera- new language for bibliography styles (nbst) is close tions to be performed more efficiently by means of to XSLT, so we think that users familiar with the side effects, like Scheme.14 But Common Lisp’s stan- former can get used to the latter easily. dard does not specify an interface with C, as Scheme does, although some implementations provide this 3.2 New services service. However, we personally prefer Scheme: it is Now it is admitted that composite tasks are not to simpler and more modern. be done by a monolithic program, but by means of 3 Choice of strategy a cooperation among several programs. From this point of view, the cooperation between LAT X and 3.1 Languages E BibTEX is exemplary. But BibTEX is too strongly TEX & Co. have been wonderful programs since the related to LATEX. BibTEX can be used to build bibli- date they came out. Although they behave very ographies for ConTEXt documents, but only because nicely, the syntaxes are quite archaic. TEX’s is not this word processor belongs to the TEX family. On A A homogeneous — although LTEX 2ε and LTEX 3 [32] the contrary, writing a converter from BibTEX to try to correct this point — for example, different de- HTML15 by means of the bst language is impossi- limiters are used to change size (‘{\small ...}’) ble without loss of quality: for example, the un- or face (‘\textbf{...}’). BibTEX’s syntax suffers breakable space character is represented by ‘~’ — as from lack of expressive power: for example, the only in TEX — when names are formatted [22], and this way to put a brace within a field’s value is to give convention cannot be changed.16 We see that such its code number by ‘\symbol{...}’. ‘Semantically’, problems can be avoided by considering an XML-like TEX’s language provides many intelligent features, language as a central format. In our case, generat- as mentioned in [6], but does not meet a modern ing bibliographies according to formats other than style of programming. Likewise, .bib files’ syntax LATEX’s should be easy since the LATEX commands can express only ‘verbatim’ values, except for some end users put into .bib files are removed when these ‘tricks’ like inserting ‘-’ characters for a range of files are parsed. This point is detailed in [17, 21]. page numbers. The specification of structured val- ues like person or organisation names is easy for 4 Conclusion simple cases, but quickly becomes obscure in more Last but not least, we have enjoyed designing and complicated cases [22]. implementing MlBibTEX, even if this development In addition, new syntactic sugar may be needed backtracked several times. In addition, we think to meet some new requirements. As an example, [23] 15 HyperText Markup Language. Readers interested in an introduction to this language can refer to [33]. 13 Common Lisp Object System. 16 In fact, there are such converters, an example being 14 Emacs Lisp, too, and the components of the Emacs editor BibTEX2HTML [5], written using Objective Caml [29], a func- largely use this feature. tional programming language.

160 TUGboat, Volume 29, No. 1 — XVII European TEX Conference, 2007 MlBibTEX: Reporting the experience that this development shows the difficulties related In: Mark van den Brand and Ralf Lämmel, to such a task. Two parts have to be managed in eds., LDTA 2002, Vol. 65.3 of ENTCS. parallel. The first part is reverse engineering, that Elsevier, Grenoble, France. April 2002. is, guessing the concept from the program. The sec- [11] Jean-Michel Hufflen: Interaktive ond: enlarging what already exists. In comparison BIBTEX-Programmierung. DANTE, with ‘classical’ development of a new program from Herbsttagung 2002, Augsburg. Oktober 2002. scratch, tests concerning the compatibility mode are [12] Jean-Michel : Die neue Sprache easy to perform: we can simply compare what is Hufflen für MlBIBT X. DANTE 2003, Bremen. April given by the two programs, the ‘old’ one becoming E 2003. an oracle. But reaching a homogeneous concept is not obvious if we want to keep backward compatibil- [13] Jean-Michel Hufflen: “Mixing Two ity. Nevertheless, we hope that we have done some Bibliography Style Languages”. In: Barrett R. satisfactory work. Bryant and João Saraiva, eds., LDTA 2003, Vol. 82.3 of ENTCS. Elsevier, Warsaw, 5 Acknowledgements Poland. April 2003. Many thanks to Jerzy B. Ludwichowski, who has [14] Jean-Michel Hufflen: “European written the Polish translation of the abstract, and Bibliography Styles and MlBibTEX”. to the proofreaders: Karl Berry, Barbara Beeton. TUGboat, Vol. 24, no. 3, pp. 489–498. EuroT X 2003, Brest, France. June 2003. References E [15] Jean-Michel Hufflen: “MlBibTEX’s Version [1] William , ed.: TUG 2003 Proceedings, Adams 1.3”. TUGboat, Vol. 24, no. 2, pp. 249–262. TUGboat, Vol. 24:1. July 2003. July 2003. [2] Cédric Bassetti and Christian Bon: Interactive Specification of bibliography styles [16] Jean-Michel Hufflen: “A Tour around MlBibT X and Its Implementation(s)”. for MlBIBTEX. Report of student project. E University of Franche-Comté. May 2006. Biuletyn GUST, Vol. 20, pp. 21–28. In BachoTEX 2004 conference. April 2004. [3] Karl Berry and Olaf Weber: Kpathsea library. http://tug.org/kpathsea/. [17] Jean-Michel Hufflen: “MlBibTEX: Beyond LAT X”. In: Apostolos , Karl [4] Emmanuel Donin de Rosière: From Stack E Syropoulos Removing in Stack-Based Languages to Berry, Yannis Haralambous, Baden Hughes, Steven Peter and John Plaice, BIBTEX++. Master’s thesis, ENSTB, Brest. 2003. eds., International Conference on TEX, XML, and Digital Typography, Vol. 3130 of LNCS, [5] Jean-Christophe Filliâtre and Claude pp. 203–215. Springer, Xanthi, Greece. August Marché: The BIBT X2HTML Home Page. E 2004. June 2006. http://www.lri.fr/~filliatr/ bibtex2html/. [18] Jean-Michel Hufflen: Beschreibung der MlBIBT X-Implementierung mit Scheme. [6] Jonathan Fine:“TEX as a Callable E DANTE 2004, Herbsttagung, Hannover. Function”. In: EuroTEX 2002, pp. 26–30. Bachotek, Poland. April 2002. Oktober 2004. [7] Hans Hagen: ConTEXt, the Manual. [19] Jean-Michel Hufflen: “Implementing a November 2001. http://www.pragma-ade. Bibliography Processor in Scheme”. In: com/general/manuals/cont-enp.pdf. J. Michael Ashley and Michel Sperber, [8] Stéphane Henry and Jérôme Voinot: eds., Proc. of the 6th Workshop on Scheme and Functional Programming, Vol. 619 Interface for MlBIBTEX. Getting Bibliographical Entries Interactively. of Indiana University Computer Science Report of student project. University of Department, pp. 77–87. Tallinn. September Franche-Comté. May 2005. 2005. [9] Jean-Michel Hufflen : « Vers une extension [20] Jean-Michel Hufflen:“BibTEX, MlBibTEX multilingue de BibTEX ». Cahiers GUTenberg, and Bibliography Styles”. Biuletyn GUST, Vol. 39–40, p. 23–38. In Actes du Congrès Vol. 23, pp. 76–80. In BachoTEX 2006 GUTenberg 2001, Metz. Mai 2001. conference. April 2006. [10] Jean-Michel Hufflen: “Lessons from a [21] Jean-Michel Hufflen: “MlBibTEX Meets Bibliography Program’s Reimplementation”. ConTEXt”. TUGboat, Vol. 27, no. 1,

TUGboat, Volume 29, No. 1 — XVII European TEX Conference, 2007 161 Jean-Michel Hufflen

pp. 76–82. EuroTEX 2006 proceedings, [33] Chuck Musciano and Bill Kennedy: HTML Debrecen, Hungary. July 2006. & XHTML: The Definitive Guide. 5th edition. [22] Jean-Michel Hufflen: “Names in BibTEX O’Reilly & Associates, Inc. August 2002. and MlBibTEX”. TUGboat, Vol. 27, no. 2, [34] Oren Patashnik: Designing BIBTEX pp. 243–253. TUG 2006 proceedings, Styles. February 1988. Part of the BibTEX Marrakesh, Morocco. November 2006. distribution. [23] David Kastrup: “Designing an Implemen- [35] Oren Patashnik: BIBTEXing. February 1988. tation Language for a TEX Successor”. In: Part of the BibTEX distribution. Proc. EuroTEX 2005, pp. 71–75. February [36] John Plaice and Paul Swoboda: “Moving 2005. Omega to a C++-Based Platform”. Biuletyn [24] Richard Kelsey, William D. Clinger, Polskiej Grupy Użytkowników Systemu Jonathan A. Rees, Harold Abelson, TEX, Vol. 20, pp. 3–5. In BachoTEX 2004 Norman I. Adams iv, David H. Bartley, conference. April 2004. Gary Brooks, R. Kent Dybvig, Daniel P. [37] Erik T. Ray: Learning XML. O’Reilly Friedman, Robert Halstead, Chris & Associates, Inc. January 2001. Hanson, Christopher T. Haynes, [38] Manuel Serrano: Bigloo. A Practical Scheme Eugene Edmund Kohlbecker, Jr, Donald . User Manual for Version 2.9a. Oxley, Kent M. Pitman, Guillermo J. December 2006. Rozas, Guy Lewis Steele, Jr, Gerald Jay [39] Scheme Requests for Implementation. Sussman and Mitchell Wand: “Revised5 February 2007. http://srfi.schemers.org. Report on the Algorithmic Language [40] Richard M. : GNU Emacs Manual. Scheme”. HOSC, Vol. 11, no. 1, pp. 7–105. Stallman August 1998. January 2007. http://www.gnu.org/ software/emacs/manual/. [25] Oleg E. Kiselyov: XML and Scheme. September 2005. http://okmij.org/ftp/ [41] Guy Lewis Steele, Jr., Scott E. Fahlman, Scheme/xml.html. Richard P. Gabriel, David A. Moon, Daniel L. Weinreb, Daniel Gureasko [26] Donald Ervin Knuth: “The Future of T X E , Linda G. , Sonya E. and METAFONT”. TUGboat, Vol. 11, no. 4, Bobrow DeMichiel , Gregor , Crispin , pp. 489. December 1990. Keene Kiczales Perdue Kent M. Pitman, Richard Waters and [27] Joachim Lammarsch: “The History of N S”. T Jon L White: Common Lisp. The Language. In: EuroT X 1999, pp. 228–232. Heidelberg E Second Edition. Digital Press. 1990. (Germany). September 1999. [42] Philip Taylor, Jiři Zlatuška and Karel [28] Leslie Lamport: LAT X: A Document E Skoupý: “The N S Project: From Preparation System. User’s Guide and T Conception to Implementation”. Cahiers Reference Manual. Addison-Wesley Publishing GUTenberg, Vol. 35–36, pp. 53–77. May 2000. Company, Reading, Massachusetts. 1994. [43] TUG Working Group on a T X Directory [29] Xavier Leroy, Damien Doligez, Jacques E Structure: A Directory Structure for T X Garrigue, Didier Rémy and Jéróme E Files. http://tug.org/tds. Vouillon: The Objective Caml System. Release 0.9. Documentation and User’s [44] W3C: XSL Transformations (XSLT). Manual. 2004. http://caml.inria.fr/pub/ Version 1.0. W3C Recommendation. Edited docs/manual-ocaml/index.html. by James Clark. November 1999. http: //www.w3.org/TR/1999/REC-xslt-19991116. [30] Bill Lewis, Dan LaLiberte, Richard M. Stallman and the GNU Manual Group: [45] Larry Wall, Tom Christiansen and Jon GNU Emacs Lisp Reference Manual. Orwant: Programming Perl. 3rd edition. http://www.gnu.org/software/emacs/ O’Reilly & Associates, Inc. July 2000. elisp-manual/. [46] Thomas Widman:“Bibulus—a Perl XML [31] : Ruby in a Nutshell. Replacement for BibTEX”. In: EuroTEX 2003, O’Reilly. English translation by David L. pp. 137–141. ENSTB. June 2003. Reynolds, Jr. November 2001. [47] Jiři Zlatuška:“NT S: Programming [32] Frank Mittelbach and Rainer Schöpf: Languages and Paradigms”. In: EuroTEX “Towards LATEX 3.0”. TUGboat, Vol. 12, 1999, pp. 241–245. Heidelberg (Germany). no. 1, pp. 74–79. March 1991. September 1999.

162 TUGboat, Volume 29, No. 1 — XVII European TEX Conference, 2007