Das bin-Verzeichnis von TeX Live 2024 führt sechs Befehle auf – ptex, uptex, eptex, euptex, platex, uplatex – und ls -l zeigt, dass jeder einzelne ein Symlink auf eine einzige ausführbare Datei namens euptex ist. Die für das Japanische gebaute Familie von LaTeX-Engines – pTeX, upTeX, e-pTeX, e-upTeX – lief im Lauf eines Vierteljahrhunderts in einer einzigen Implementierung zusammen. Diese Seite verfolgt diesen Zusammenlauf anhand der tatsächlichen Banner, Logdateien und gemessenen Werte. Das Handwerk des vertikalen Satzes und des Zeilenumbruchs gehört auf andere Seiten; hier geht es um die Engine selbst.
Sechs Befehle, eine ausführbare Datei
Eine ausführbare Datei namens platex existiert nicht. In TeX Live 2024 ist platex ein Symlink auf euptex, und dasselbe gilt für ptex, uptex, eptex und uplatex. Der Unterschied liegt in dem Format, das jeweils geladen wird. Ein Programm der TeX-Familie sieht nach, unter welchem Namen es aufgerufen wurde, und lädt die gleichnamige Formatdatei (.fmt). Die Zuordnung steht in fmtutil.cnf, wo zwei Zeilen nebeneinanderstehen: platex euptex language.dat *platex.ini und uplatex euptex language.dat *uplatex.ini. Die zweite Spalte nennt die Engine, die vierte die ini-Datei, mit der das Format erzeugt wird. Mit anderen Worten: pLaTeX und upLaTeX sind zwei verschiedene Formate auf ein und derselben Engine, e-upTeX.
$ ls -l /usr/local/texlive/2024/bin/universal-darwin/ | grep -E "ptex|platex"
lrwxr-xr-x platex -> euptex
lrwxr-xr-x ptex -> euptex
lrwxr-xr-x uplatex -> euptex
lrwxr-xr-x uptex -> euptex
lrwxr-xr-x eptex -> euptex
-rwxr-xr-x euptex # the only real binary
$ grep -E "^(platex|uplatex|ptex|uptex|eptex) " texmf-dist/web2c/fmtutil.cnf
platex euptex language.dat *platex.ini
eptex euptex language.def *eptex.ini
ptex euptex - ptex.ini
uplatex euptex language.dat *uplatex.ini
uptex euptex - uptex.iniFührt man alle sechs aus und behält nur die erste Zeile, zeigt sich die Struktur von selbst. Der Rumpf des Banners ist jedes Mal derselbe – This is e-upTeX, Version 3.141592653-p4.1.1-u1.30-230214-2.6 (TeX Live 2024) – und nur die Klammer wechselt: Die platex-Seite gibt (utf8.euc) aus, die uplatex-Seite (utf8.uptex). Diese Klammer benennt die interne japanische Kodierung und ist der einzige äußere Hinweis, der die pTeX-Linie von der upTeX-Linie trennt. Häufig kommt die Frage, warum ein Aufruf von platex „e-upTeX“ ausgibt; es ist kein Fehler – so sieht eine intakte Installation aus.
$ for c in ptex uptex eptex euptex platex uplatex; do
> printf "%s: " $c; echo "\\end" | $c | head -1
> done
ptex: This is e-upTeX, Version 3.141592653-p4.1.1-u1.30-230214-2.6 (utf8.euc) (TeX Live 2024) (preloaded format=ptex)
uptex: This is e-upTeX, Version 3.141592653-p4.1.1-u1.30-230214-2.6 (utf8.uptex) (TeX Live 2024) (preloaded format=uptex)
eptex: This is e-upTeX, Version 3.141592653-p4.1.1-u1.30-230214-2.6 (utf8.euc) (TeX Live 2024) (preloaded format=eptex)
platex: This is e-upTeX, Version 3.141592653-p4.1.1-u1.30-230214-2.6 (utf8.euc) (TeX Live 2024) (preloaded format=platex)
uplatex: This is e-upTeX, Version 3.141592653-p4.1.1-u1.30-230214-2.6 (utf8.uptex) (TeX Live 2024) (preloaded format=uplatex)Was p4.1.1-u1.30-230214-2.6 im Banner bedeutet
Diese lange Ziffernfolge ist keine einzelne Versionsnummer, sondern vier getrennte Entwicklungslinien, aneinandergefügt. Das führende 3.141592653 ist reines TeX, p4.1.1 ist pTeX, u1.30 ist upTeX, 230214 ist e-pTeX (ein Datum) und das abschließende 2.6 ist e-TeX. Das ist keine Vermutung: Die Engine stellt jede Angabe als Primitiv bereit, sodass sie sich im Dokument mit \the\ptexversion und Verwandten auslesen lässt. Wer diese Zeile lesen kann, hat auf die Frage was ist e-pTeX eine konkrete Antwort – es ist pTeX mit eingearbeiteten e-TeX-Erweiterungen, und das hier laufende e-upTeX legt noch upTeX darüber: vier Schichten.
% read the version primitives back out of the running engine
\typeout{PTEX=\the\ptexversion.\the\ptexminorversion\ptexrevision}
\typeout{UPTEX=\the\uptexversion\uptexrevision}
\typeout{EPTEX=\the\epTeXversion}
\typeout{ETEX=\the\eTeXversion\eTeXrevision}
% PTEX=4.1.1 UPTEX=1.30 EPTEX=230214 ETEX=2.6| Banner-Fragment | Herkunft | Wie man es ausliest |
|---|---|---|
3.141592653 | Knuths reines TeX | nur im Banner, kein Primitiv |
p4.1.1 | pTeX – die japanischen Erweiterungen von ASCII | \ptexversion, \ptexminorversion, \ptexrevision |
u1.30 | upTeX – die Unicode-Umarbeitung | \uptexversion, \uptexrevision |
230214 | e-pTeX – ein Datum als Versionsangabe | \epTeXversion |
2.6 | die e-TeX-Erweiterungen | \eTeXversion, \eTeXrevision |
Was pTeX in die Engine einbaute: Schreibrichtung und JFM
Zwei Dinge zwangen pTeX dazu, eine Änderung der Engine statt eines Makropakets zu sein: die Schreibrichtung (\tate und \yoko) und JFM, die japanische Schriftmetrik. Entwickelt wurde es bei der ASCII Corporation – dem in Japan für Computer- und Spielemagazine bekannten Verlag –, und das p steht für publishing: Ziel war ein japanisches TeX, das dem kommerziellen Druck standhält. Schreibrichtung klingt nach der bloßen Frage, wohin die Zeichen laufen, doch im Inneren von TeX ist es ein Vorgang, bei dem die Bedeutung der Boxmaße vertauscht wird. Misst man nach, sagen es die Zahlen unverblümt.
Man setze dieselben drei Kana in eine \hbox und vergleiche die Maße im waagerechten und im senkrechten Modus. Waagerecht beträgt die Höhe 8.46753pt und die Tiefe 1.15465pt – die unsymmetrische Gestalt von etwas, das auf einer Grundlinie sitzt, genau wie in der Antiqua. Senkrecht werden Höhe und Tiefe beide zu 4.8111pt, also exakt die Hälfte des Geviertmaßes von 9.6222pt, gleichmäßig geteilt. Im senkrechten Satz ruht das Zeichen gar nicht auf einer Grundlinie, sondern liegt über der Mittelachse der Spalte. Diese Umschaltung der Maßdeutung im Inneren der Engine ist der Kern von pTeX – und genau der Teil, den kein Makropaket nachbilden kann.
\documentclass{utarticle} % ut... = upLaTeX, vertical writing
\begin{document}
\setbox0=\hbox{あいう}
\typeout{TATE w=\the\wd0\space h=\the\ht0\space d=\the\dp0}
\yoko
\setbox0=\hbox{あいう}
\typeout{YOKO w=\the\wd0\space h=\the\ht0\space d=\the\dp0}
\end{document}
% TATE w=28.86658pt h=4.8111pt d=4.8111pt
% YOKO w=28.86658pt h=8.46753pt d=1.15465ptWo der Abstand steckt: \kanjiskip und \xkanjiskip
Der Abstand zwischen japanischen Zeichen gehört nicht zur Glyphenbreite; er kommt als Leim hinein – dehn- und schrumpfbarer Raum. Die pTeX-Familie hält ihn in zwei Registern: \kanjiskip zwischen zwei japanischen Zeichen, \xkanjiskip dort, wo Japanisch auf Lateinisch trifft. Gemessen in ujarticle bei 10pt Grundschrift beträgt \kanjiskip 0.0pt plus 0.4pt minus 0.5pt – natürliche Breite null, aber elastisch, und damit genau der Spielraum, mit dem der Zeilenumbruch arbeitet. \xkanjiskip beträgt 2.40555pt plus 1.0pt minus 1.0pt, und diese krumm wirkende 2.40555 ist exakt das Geviert von 9.6222pt geteilt durch vier: ein Viertelgeviert. Die alte Regel, zwischen japanischem Text und einem lateinischen Wort ein Viertel Raum zu setzen, steht dort schlicht als Registervorgabe.
\documentclass{ujarticle}
\begin{document}
\typeout{KANJISKIP=\the\kanjiskip}
\typeout{XKANJISKIP=\the\xkanjiskip}
\setbox0=\hbox{あ}\typeout{EM=\the\wd0}
\setbox0=\hbox{あAい}\typeout{WITH=\the\wd0}
{\xkanjiskip=0pt \setbox0=\hbox{あAい}\typeout{WITHOUT=\the\wd0}}
\end{document}
% KANJISKIP=0.0pt plus 0.4pt minus 0.5pt
% XKANJISKIP=2.40555pt plus 1.0pt minus 1.0pt
% EM=9.6222pt WITH=31.5555pt WITHOUT=26.7444pt
% 31.5555 - 26.7444 = 4.8111 = 2 x 2.40555| Register | In TeX Live 2024 gemessener Wert | Wofür es zuständig ist |
|---|---|---|
\kanjiskip | 0.0pt plus 0.4pt minus 0.5pt | Abstand zwischen zwei japanischen Zeichen; keine natürliche Breite, nur Elastizität |
\xkanjiskip | 2.40555pt plus 1.0pt minus 1.0pt | Abstand am Übergang Japanisch/Lateinisch; genau ein Viertel des Gevierts von 9.6222pt |
\prebreakpenalty | 10000 für das ideographische Komma | Zeichen, die keine Zeile beginnen dürfen; 10000 heißt: niemals umbrechen |
\postbreakpenalty | 10000 für die öffnende Eckklammer | Zeichen, die keine Zeile beenden dürfen; Kinsoku wird als Strafwert ausgedrückt |
\jcharwidowpenalty | 500 | wirkt dagegen, dass ein Absatz mit einem einzelnen japanischen Zeichen in eigener Zeile endet |
Festhalten sollte man: Kinsoku ist nicht als Regel kodiert, sondern als Zahl. TeX bricht Zeilen um, indem es die Kosten über die möglichen Umbruchstellen summiert und die günstigste wählt; dem Komma den Strafwert 10000 – den Höchstwert – zu geben, genügt daher, damit „hier beginnt nie eine Zeile“ absolut gilt. Senkt man den Wert, lockert sich das Verbot. JFM wiederum ist eine Metrik, die nicht nur Breite, Höhe und Tiefe jeder japanischen Glyphe festhält, sondern auch, wie viel Raum zwischen welchem Zeichenpaar gehört; daher rührt das Zusammenrücken um Satzzeichen und Klammern. Wie einzelne Satzzeichen feinjustiert werden und wo \inhibitglue sich lohnt, gehört auf die Seiten zum japanischen Satz.
Der Unterschied zwischen pTeX und upTeX – an einem Zeichen entschieden
Der ganze Unterschied läuft auf die intern verwendete Zeichenkodierung hinaus. pTeX arbeitet intern mit EUC-JP oder Shift_JIS und ist damit faktisch an die Kanji des JIS-Standards gebunden. upTeX ist innen Unicode, dieser Zaun fällt weg. Abstrakt gesagt bleibt das blass, also probiert man es mit einem einzigen Zeichen – der „hohen“ Variante des Namenszeichens taka, 髙 (U+9AD9). Gibt man es platex, bricht der Lauf ab mit ! LaTeX Error: Unicode character ^^e9^^ab^^99 (U+9AD9) not set up for use with LaTeX. Reicht man dasselbe Zeichen an uplatex (über \documentclass[uplatex]{jsarticle}), läuft es glatt bis Output written on ... .dvi durch. Wenn ein Dokument voller Personen- und Ortsnamen unter platex plötzlich scheitert, liegt es fast immer daran.
$ platex kanji.tex # \documentclass{jsarticle} + 髙
! LaTeX Error: Unicode character ^^e9^^ab^^99 (U+9AD9)
not set up for use with LaTeX.
$ uplatex kanji2.tex # \documentclass[uplatex]{jsarticle} + 髙
Output written on kanji2.dvi (1 page, 304 bytes).upTeX wird seit 2007 von Takuji Tanaka entwickelt. Die mit TeX Live ausgelieferte uplcore.ltx trägt im Kopf bis heute die Zeile Copyright (c) 2016 Takuji Tanaka und bezeugt damit die Herkunft dieses Zweigs. Der Entwurfsgedanke, der sich am meisten auszahlt, ist \kcatcode: Damit lässt sich bereichsweise festlegen, ob Zeichen als japanischer oder als lateinischer Text behandelt werden. Deshalb kann upTeX nicht nur Japanisch setzen, sondern vereinfachtes und traditionelles Chinesisch sowie koreanisches Hangul im selben Dokument – die Beschreibung in tlmgr info uptex sagt ausdrücklich, dass die vier Schriften gleichzeitig verarbeitet werden. In der pTeX-Ära war davon nichts erreichbar.
Woher e-pTeX kam: aus einem Studienbericht
e-pTeX begann als Studienbericht, den Hironori Kitagawa für ein Universitätspraktikum namens „Computational Mathematics II“ einreichte. Das klingt unwahrscheinlich, doch das Dokument liegt TeX Live bis heute als eptex_resume.pdf bei – auf dem Titel steht „Computational Mathematics II, Arbeitsprotokoll“, der Gruppenname lautet epsilon. Derselbe Bericht hält fest, dass Akira Kakuto am 30. Dezember 2007 einen Versuch unternahm, pTeX mit e-TeX zusammenzuführen, und das Ergebnis peTeX nannte; der Autor merkt nebenbei an, die vertauschte Reihenfolge von p und e habe ihren Reiz. Das README des ptex-manual-Bündels von TeX Live erklärt, solche älteren Dokumente seien „nur aus historischen Gründen“ enthalten. Die Gründungsakte einer Engine, die heute täglich Tausende japanischer Dokumente setzt, überdauert als studentische Abgabe.
Was brachten die e-TeX-Erweiterungen? Ganzzahlarithmetik wie \numexpr, ein Präfix \protected, das ein Makro davor bewahrt, an falscher Stelle expandiert zu werden, einen weit größeren Vorrat an Registern und die Grundlage für bidirektionalen Satz. Unspektakulär – aber sehr viele moderne LaTeX-Pakete sind unter der Annahme geschrieben, dass es all das gibt. Damit lief immer mehr im japanischen Ökosystem ohne e-TeX nicht mehr, und e-pTeX / e-upTeX wurden zur Vorgabe. Ohne \protected expandiert ein Befehl im Argument von \section ins Inhaltsverzeichnis und zerstört es; das passiert täglich, nicht bloß in der Theorie. Der Endpunkt dieses Zusammenlaufs ist genau das Bild vom Anfang: sechs Befehle, ein euptex.
Wer das heute pflegt
Die Japanese TeX Development Community, meist als texjporg geschrieben. Der Augenblick, in dem die Arbeit von einem Unternehmen an eine Gemeinschaft überging, steht in den Copyright-Vermerken selbst. Die ersten beiden Zeilen von plcore.ltx – dem Kern von pLaTeX – lauten in TeX Live 2024 Copyright (c) 2010 ASCII MEDIA WORKS und Copyright (c) 2016-2020 Japanese TeX Development Community, gefolgt von This file is part of the pLaTeX2e system (community edition). Das upLaTeX-Gegenstück uplcore.ltx nennt an derselben Stelle drei Parteien: ASCII MEDIA WORKS, Takuji Tanaka und die Japanese TeX Development Community. Dreißig Jahre japanisches TeX, vom Verlag über eine Einzelperson zur Gemeinschaft, zusammengefaltet in drei Kommentarzeilen.
Außerhalb dieser Linie gibt es außerdem pTeX-ng, dessen Befehl ApTeX heißt – eine Neuimplementierung von Clerk Ma. Sie unterstützt die Primitive von e-TeX, pTeX und upTeX, bleibt so mit e-upTeX kompatibel, weitet die Interna auf ganz Unicode aus und bindet libdpx ein – dvipdfmx als Bibliothek –, sodass sie PDF direkt ausgibt, ohne DVI-Zwischenstufe. Ehrlicherweise gilt aber: In TeX Live 2024 ist sie nicht enthalten. tlmgr info ptex-ng antwortet cannot find package ptex-ng. (Eine Spur ihrer Existenz wird durchaus mitgeliefert: Das ctex-Paket enthält eine Engine-Definition namens ctex-engine-aptex.def.) Die Vorgabe in der Praxis bleibt e-upTeX; pTeX-ng installiert man separat, um es auszuprobieren.
| Engine | Interne Zeichenkodierung | e-TeX | Was sie in TeX Live 2024 tatsächlich ist |
|---|---|---|---|
pTeX | EUC-JP / Shift_JIS | nein | keine eigene Binärdatei; ptex ist ein Symlink auf euptex |
upTeX | Unicode (UTF-8) | nein | ebenso; uptex ist ebenfalls ein Symlink auf euptex |
e-pTeX | EUC-JP / Shift_JIS | ja | das Format eptex; Banner zeigt (utf8.euc) |
e-upTeX | Unicode (UTF-8) | ja | die einzige echte Binärdatei; platex wie uplatex laufen darauf |
pTeX-ng / ApTeX | Unicode (bis 0x10FFFF) | ja | nicht enthalten; tlmgr info ptex-ng meldet, es sei nicht auffindbar |
In der Praxis: von uplatex über dvipdfmx zum PDF
Die pTeX-Familie gibt kein PDF aus. Ihre Ausgabe ist stets DVI, das dvipdfmx anschließend in PDF umwandelt. Das ist der entscheidende Unterschied zu pdfTeX, XeTeX und LuaTeX, die direkt PDF schreiben – und wer es nicht weiß, bleibt bei „ich habe uplatex laufen lassen und bekomme kein PDF“ hängen. Die Standardfolge lautet: uplatex zweimal, damit Querverweise und Inhaltsverzeichnis sich einpendeln, danach einmal dvipdfmx. Übrigens ist dvipdfmx in TeX Live selbst ein Symlink auf xdvipdfmx; ls -l zeigt also einen unerwarteten Namen – auch das ist normal.
\documentclass{ujarticle} % uj... = upLaTeX, horizontal; ut... = vertical
\begin{document}
こんにちは、\LaTeX。日本語が美しく組めます。
\[ E = mc^2 \]
\end{document}$ uplatex document.tex # pass 1 -> document.dvi + document.aux
$ uplatex document.tex # pass 2 -> cross-references settle
$ dvipdfmx document.dvi # -> document.pdf- Erscheint kein PDF, prüfen Sie zuerst, ob die
.dviexistiert. Wenn ja, liegt der Fehler auf der Seite vondvipdfmx; wenn nein, auf der vonuplatex. Diese eine Prüfung halbiert den Suchraum. - Kommt der Text verstümmelt heraus, prüfen Sie der Reihe nach, ob die Quelle als UTF-8 gespeichert ist und ob die Klasse auf upLaTeX zielt (
ujarticle/utarticleoder\documentclass[uplatex]{jsarticle}). Auf Seiten der Engine heißen die Schalter-kanji=STRING(Ein- und Ausgabe;euc|jis|sjis|utf8|uptex) und-kanji-internal=STRING(interne Kodierung;euc|sjis|uptex). - Bei Fragen oder Fehlermeldungen gehören immer drei Angaben dazu: der Befehlsname (
platexoderuplatex), die erste Bannerzeile aus dem Log und die Kodierung, in der die Quelle gespeichert wurde. Ob im Banner(utf8.euc)oder(utf8.uptex)steht, klärt schon die halbe Frage. - Etwas Neues anfangen? Ohne vorgeschriebene Vorlage: UTF-8-Quelle mit
uplatex,dvipdfmxundjlreqoder der von der Hochschule vorgegebenen Klasse. Setzt eine bestehende Vorlageplatexvoraus, folgt man ihrem Bauablauf, statt sie aus Modegründen zu modernisieren. - Wer Schriften frei wählen will, sollte die pTeX-Route nicht erzwingen: LuaLaTeX mit LuaTeX-ja oder XeLaTeX mit xeCJK erlauben es, OpenType-Schriften des Systems direkt beim Namen zu nennen, und liefern PDF in einem Schritt.
Die Entscheidung lässt sich so zusammenfalten: Für bewährte, schnelle, sichere japanische Arbeiten: e-upTeX (uplatex) → dvipdfmx. Wer Systemschriften oder Erweiterungen auf Lua-Seite braucht: LuaLaTeX. Wer bereits XeTeX-Bestände hat: XeLaTeX mit xeCJK. Und man sollte das Alter der pTeX-Linie nicht für einen Mangel halten. Erst die Entscheidung der 1980er Jahre, vertikalen Satz und JFM ins Innere der Engine zu legen, machte japanischen Buchdruck mit TeX überhaupt möglich. Wer heute uplatex tippt, startet das vierzigste Jahr dieser Entscheidung.