jlreq ist vermutlich die einzige LaTeX-Dokumentklasse, die einem mitten im Lauf mitteilt, dass der Zeilenabstand außerhalb des vom Standard Empfohlenen liegt. Von Noriyuki Abe 2017 veröffentlicht, ist sie der Versuch, die W3C Technical Note „Requirements for Japanese Text Layout“ (JLReq) in LaTeX umzusetzen – daher der Name. Der Quelltext enthält über dreißig Kommentare, die Klauselnummern dieser Anforderungen zitieren, und mit der Option jlreq_notes erscheinen die Hinweise samt Klauselnummer im Log. Diese Seite zeigt, was jlreq anders macht als die js-basierten Klassen, wie sich der Textblock in Zahlen entwerfen lässt und wie japanisch-spezifische Entscheidungen wie vertikaler Satz oder die Position einer öffnenden Klammer am Zeilenanfang behandelt werden.
Was JLReq ist und wie die Klasse es umsetzt
JLReq ist eine technische Note des W3C darüber, was für korrekten japanischen Satz nötig ist. Auf Basis des japanischen Industriestandards JIS X 4051 (Satzregeln für japanische Dokumente) führt sie – Klausel für nummerierte Klausel – jene Regeln auf, die Technologien wie CSS und E-Books beachten sollten: welche Zeichen nicht am Zeilenanfang oder -ende stehen dürfen, der Abstand zwischen japanischer und lateinischer Schrift, die Behandlung von Anmerkungen und Überschriften, wie der Textblock zustande kommt. Der Dateikopf der Klasse jlreq nennt die umgesetzte Fassung: die W3C Note vom 11. August 2020. Präzise gesagt: Hier wurde eine Spezifikation in eine Dokumentklasse übersetzt.
Wie tief die Umsetzung reicht, zeigt sich daran, dass die Klasse eigene japanische Fontmetriken (JFM) mitbringt. Während jsclasses die JIS-Metrik entleiht, liefert jlreq eigene TFM-Dateien wie jlreq.tfm, jlreqg-v.tfm und jlreq-jidori.tfm sowie jfm-jlreq.lua und jfm-jlreqv.lua für LuaTeX-ja. Die Abstände um Satzzeichen und Klammern entstehen in der Metrik, nicht in einem Klassenmakro – die Anforderungen sind in der untersten Schicht des Satzsystems verankert. Die Klasse erkennt selbst, ob pLaTeX, upLaTeX oder LuaLaTeX läuft, und hält es im Log fest, etwa als jlreq guessed engine: uplatex (XeLaTeX wird nicht unterstützt). Zur ausdrücklichen Wahl übergibt man platex, uplatex oder lualatex als Klassenoption.
Der Unterschied zwischen jlreq und jsclasses
In einem Satz: jsclasses reicht ein fertiges Erscheinungsbild, jlreq reicht die Stellräder dafür. Haruhiko Okumuras jsarticle ist um gut abgestimmte Vorgaben gebaut, die man einfach übernimmt, und liefert ohne Nachdenken ein lesbares japanisches Dokument. jlreq setzt das Gegenteil voraus: dass man die Zahlen selbst angibt – Schriftgröße, Zeichen pro Zeile, Zeilen pro Seite, Zeilenabstand sowie Kopf-, Fuß-, Bund- und Außenrand. Beide konkurrieren also kaum. jsclasses, wenn ein Aufsatz schnell ordentlich aussehen soll; jlreq, wenn Format und Zeilenlänge schon vor dem Schreiben feststanden.
Der zweite Unterschied: Die feinen Entscheidungen, die der Standard verlangt, liegen als Optionen offen. Mit narrow_kanjiskip etwa kehrt der Abstand zwischen japanischen Zeichen (kanjiskip) zu dem zurück, was jsarticle verwendet. Diese Option ist die kürzeste Antwort auf „nach dem Wechsel zu jlreq sieht der Satzspiegel anders aus“. Die Standard-JFM nimmt die von den Anforderungen geforderten Abstände; ein unverändert von jsclasses nach jlreq übertragenes Manuskript wirkt daher Zeile für Zeile leicht anders, selbst bei gleicher Zeichenzahl pro Zeile. Wer migriert, vergleicht zuerst eine Seite und geht dann an den ganzen Text.
Die Grundoptionen: Dokumentart, Papier und Schriftgröße
jlreq besitzt nur eine Klasse. Die Dokumentart wechselt man über eine Option in eckigen Klammern: Standardmäßig verhält sie sich wie article, report ergibt einen Bericht mit \chapter, book ein Buch. Anders als bei jsclasses gibt es also nicht je Typ einen eigenen Klassennamen. Für vertikalen Satz kommt tate hinzu. Darüber hinaus funktionieren vertraute Schreibweisen der Standardklassen unverändert: twocolumn, twoside, titlepage, landscape, draft, openright/openany, disablejfam.
Das Papier gibt paper= an. Neben paper=a4 und paper=a5 lassen sich Breite und Höhe direkt schreiben, etwa paper={148mm,210mm}. Hier lauert eine Falle: paper=b5 bedeutet ISO-B5 (176×250 mm), nicht die 182×257 mm, die in Japan „B5“ heißen. Die Klasse lässt das nicht stillschweigend durchgehen, sondern warnt: Class jlreq Warning: The option 'b5' means the papersize in the ISO B-series, not in the JIS B-series. This behavior was changed from jlreq version 2021-11-05. Use 'paper=b5j' for the JIS-B-series. Für ein selbstverlegtes Buch oder eine japanische Druckerei ist fast sicher paper=b5j gemeint.
Lateinische und japanische Größen denkt man getrennt. fontsize= ist die lateinische Grundgröße (Standard 10pt), jafontsize= die japanische Größe, und jafontscale= gibt das Verhältnis direkt an (Standard 1, also gleich groß). jlreq akzeptiert die Satzmaße Q und H als Längeneinheiten, sodass fontsize=13Q unverändert geschrieben werden kann (1 Q = 1 H = 0,25 mm). Japanische Layoutvorgaben kommen fast immer in Q, und sie ohne Umrechnung übernehmen zu können, wiegt in der Praxis schwerer, als es klingt.
| Option | Bedeutung | Standard |
|---|---|---|
article / report / book | Dokumentart wechseln (Kapitel, Layout) | article-artig |
tate | Vertikal setzen | horizontal |
platex / uplatex / lualatex | Engine angeben; ohne Angabe erkennt die Klasse sie und vermerkt es im Log | automatisch erkannt |
paper= | Papier: a4, a5, b5j (JIS B5), {B,H}. Bloßes b5 ist ISO-B5 | a4 |
fontsize= / jafontsize= | Lateinische / japanische Grundgröße; neben pt auch Q und H | 10pt / wie lateinisch |
jlreq_notes | Gibt bei Abweichungen von den Anforderungen Hinweise mit Klauselnummer ins Log aus | aus |
Den Textblock in Zahlen entwerfen
Der Textblock – das Rechteck, in dem der Haupttext steht – wird entweder von innen nach außen oder von außen nach innen festgelegt. Von innen heißt: Zeilenlänge line_length=, Zeilenzahl number_of_lines= und Zeilenabstand baselineskip= angeben und die Ränder als Rest entstehen lassen. Von außen heißt: Kopf head_space=, Fuß foot_space=, Bund gutter= und Außenrand fore_edge= (auch fore-edge=) angeben und den Block als Rest entstehen lassen. Kommt die Vorgabe als „38 Zeichen pro Zeile, 18 Zeilen pro Seite“, arbeitet man von innen; kommt sie als „20 mm Kopfsteg, 18 mm Bundsteg“, von außen. Beides zu mischen ist nicht nötig.
Hier helfen eigene Einheiten. zw ist die Breite eines Vollbreitenzeichens, zh dessen Höhe, sodass Zeilenlänge und Abstand in Zeichen ausgedrückt bleiben können. line_length=40zw sind 40 Zeichen pro Zeile; baselineskip=1.75zw ein Abstand von 1,75 Vollbreitenzeichen. Der Zeilenabstand lässt sich auch als linegap= angeben, das „ein Vollbreitenzeichen plus den genannten Zwischenraum“ zählt. Ohne Angabe ist line_length 0,75× die Papierausdehnung in Zeichenrichtung, number_of_lines die Anzahl, die in 0,75× der Ausdehnung in Zeilenrichtung passt, baselineskip 1,7× die japanische Größe und der Spaltenabstand column_gap 2zw. Ohne head_space und foot_space wird der Block vertikal zentriert.
| Option | Bedeutung | Standard |
|---|---|---|
line_length= | Zeilenlänge | 0,75× das Papier in Zeichenrichtung |
number_of_lines= | Zeilen pro Seite | so viele, wie in 0,75× der Zeilenrichtung passen |
baselineskip= / linegap= | Zeilenabstand; linegap= zählt ein Vollbreitenzeichen plus diesen Zwischenraum | 1,7× die japanische Größe |
gutter= / fore_edge= | Bundsteg und Außensteg | — |
head_space= / foot_space= | Kopf- und Fußsteg | bei Auslassung vertikal zentriert |
column_gap= | Spaltenabstand im zweispaltigen Satz | 2zw |
Japanisch-spezifische Einstellungen: Klammern, hängende Interpunktion, Tate-chu-yoko
Das ist jlreqs eigenstes Terrain. open_bracket_pos= legt fest, wie eine öffnende Klammer am Zeilenanfang gesetzt wird (JLReq 3.1.5). Die drei Werte lauten zenkaku_tentsuki (Standard), zenkakunibu_nibu und nibu_tentsuki und entscheiden, ob die Klammer in voller Geviertbreite bündig steht oder um ein halbes Geviert eingezogen wird. hanging_punctuation schaltet den hängenden Satz ein, bei dem Komma oder Punkt am Zeilenende außerhalb des Textblocks hängen dürfen (3.8.2, Anm. 1). Über beides wird im Web- und DTP-Umfeld regelmäßig gestritten; mit einer einzigen Klassenoption umschalten kann man es praktisch nur in jlreq.
Auch im Textkörper stehen japanische Werkzeuge bereit: \tatechuyoko, um Ziffern im vertikalen Satz aufrecht zu stellen, \jidori, um Text in eine feste Zeichenzahl einzupassen, \warichu für die kleine zweizeilige Inline-Anmerkung, \sidenote für Randnoten, \endnote für Endnoten und \akigumi, um den Zeichenabstand vorübergehend zu weiten. Auch Datumsangaben haben ihre Etikette: Nach \和暦 druckt \today das Datum mit dem Ära-Namen, im vertikalen Satz in Kanji-Ziffern. Die Klasse trägt die Grenzen zwischen Shōwa, Heisei und Reiwa – 8. Januar 1989 und 1. Mai 2019 – in ihrem eigenen Code, und ihr Änderungsprotokoll verzeichnet den Wechsel von 2019 schlicht als neue Regierungsdevise.
Ein vertikales Beispiel und die Wahl der Engine
Hier ein A5-Dokument im vertikalen Satz, dessen Textblock von innen entworfen ist: tate macht es vertikal, paper=a5 legt das Format fest, der Rest beschreibt den Block in Zahlen – Japanisch mit 13 Q, 40 Zeichen pro Zeile, 17 Zeilen pro Seite, Abstand von 1,75 Vollbreitenzeichen. Im Textkörper ist nichts zu ergänzen; diese eine Zeile legt ein buchartiges Layout fest. Dieselbe \documentclass-Zeile läuft in beide Richtungen: upLaTeX führt sie über DVI, LuaLaTeX schreibt das PDF direkt mit Systemschriften. Für horizontalen Satz entfällt tate.
\documentclass[
tate, % vertical writing
paper=a5,
fontsize=13Q, % 1 Q = 0.25 mm
line_length=40zw, % 40 characters per line
number_of_lines=17,
baselineskip=1.75zw,
]{jlreq}
\begin{document}
\title{雪国}
\author{川端康成}
\maketitle
国境の長いトンネルを抜けると雪国であった。
\end{document}Eine Falle tritt nur auf dem DVI-Weg auf: jlreq schreibt das Papierformat nicht als \special in die DVI. Eine Quelle mit paper=a5, mit upLaTeX gesetzt und an dvipdfmx übergeben, ergibt daher ein PDF im Standardpapier von dvipdfmx – unter der üblichen TeX-Live-Konfiguration A4. Es gibt zwei Auswege: \usepackage{bxpapersize} in die Präambel aufnehmen oder das Format beim Konverter angeben, etwa dvipdfmx -p a5. LuaLaTeX schreibt die Seitengröße direkt ins PDF und kennt das Problem nicht.
Die Klasse den Entwurf nachrechnen lassen (jlreq_notes)
Ergänzt man die Klassenoptionen um jlreq_notes, prüft jlreq die angegebenen Zahlen gegen die Anforderungen und schreibt alles Ausreißende ins Log. Bei baselineskip=1.2zw etwa erscheint unter einer JLReq-Überschrift der Hinweis, der Zeilenzwischenraum solle zwischen einem halben und einem ganzen Geviert liegen (Klausel 2.4.2.d, Anm. 3). Ebenso meldet sich die Klasse, wenn die Zeilenlänge einer Randnote zu kurz ist oder im vertikalen Satz zu wenig Raum zwischen Textblock und Kolumnentitel bleibt – jeweils mit Klauselnummer. Der Satz läuft weiter – es sind Hinweise, keine Vorschriften. Nur physisch Unmögliches bricht ab: Ist der Zeilenabstand kleiner als die Schriftgröße, endet der Lauf mit ! Class jlreq Error: The baselineskip is less than fontsize.
Überschriften und Anmerkungen mit \jlreqsetup formen
Die Maße des Textblocks werden als Klassenoptionen gesetzt, das Detail von Anmerkungen, Zitaten, Listen und Überschriften dagegen in der Präambel mit key=value-Paaren in \jlreqsetup{...}: wie Fußnoten, Randnoten, Warichu und Endnoten erscheinen, der Einzug von Zitaten (quote_indent=), die Zeilenzuteilung von Überschriften. Wer eine Überschrift selbst neu gestalten will, greift zu \NewBlockHeading oder \ModifyHeading. Die Arbeitsteilung ist beabsichtigt: Der Textblock ist, was Lesende beim Aufschlagen sofort sehen, während \jlreqsetup das Verhalten einzelner Elemente regelt. Man braucht nicht alles auf einmal: erst Format, Zeilenlänge und Zeilenzahl in \documentclass festlegen, dann \jlreqsetup nach Bedarf ergänzen. Die verbindliche Liste steht im mitgelieferten Handbuch (japanisch, von Abe), das texdoc jlreq öffnet.
Nach dem Festlegen des Blocks eine Seite prüfen
jlreq ist mächtig genug, dass falsche Zahlen trotzdem ein PDF ergeben. Bevor der eigentliche Text entsteht, sollte man eine Seite Blindtext mit Überschrift, Fußnote, Zitat und einer kleinen Abbildung oder Tabelle bauen und Zeilenlänge, Zeilenzahl sowie Bund- und Außensteg wirklich nachmessen. Im vertikalen Satz tauschen Zeilenrichtung und Zeichenrichtung gegenüber dem horizontalen Satz die Plätze; prüfen Sie deshalb zuerst, ob line_length und number_of_lines nicht vertauscht sind. Für Schneidmarken dient das Paket jlreq-trimmarks statt einer Klassenoption; bei tombow warnt die Klasse: The option 'tombow' is not supported by jlreq class. Please use the jlreq-trimmarks package.
- Zeilenlänge — Vollbreitenzeichen im Fließtext zählen, nicht nur nachsehen, wo die Satzzeichen fallen.
- Zeilenzahl — Textzeilen auf einer normalen Seite und auf einer Seite mit Überschrift zählen.
- Ränder — Für gebundene Manuskripte am Bund mehr Platz lassen; bei reiner PDF-Abgabe übermäßigen Bundsteg vermeiden.
- Papier — Auf dem DVI-Weg das fertige PDF nachmessen. Ohne
bxpapersizeoderdvipdfmx -pkommt A4 heraus. - Engine — Verwenden upLaTeX und LuaLaTeX unterschiedliche Schriften, gilt nur das PDF der gewählten Route.