jlreq

jlreq est sans doute la seule classe de document LaTeX qui vous signale, en cours de compilation, que votre interligne sort de ce que la norme recommande. Publiée par Noriyuki Abe en 2017, elle tente d’implémenter dans LaTeX la note technique du W3C « Requirements for Japanese Text Layout » (JLReq), d’où son nom. Son code source contient plus de trente commentaires citant les numéros de clause de ces exigences, et l’option jlreq_notes fait apparaître ces conseils, numéro de clause à l’appui, dans le log. Cette page explique ce que jlreq fait autrement que les classes de la famille js, comment elle permet de concevoir le bloc de texte en chiffres, et comment elle traite les décisions propres au japonais comme l’écriture verticale ou la position d’une parenthèse ouvrante en début de ligne.

Ce qu’est JLReq et comment la classe l’implémente

JLReq est une note technique du W3C décrivant ce qu’il faut pour composer correctement le japonais. Fondée sur la norme industrielle japonaise JIS X 4051 (règles de mise en forme des documents japonais), elle énumère, clause numérotée après clause numérotée, les règles que des technologies comme CSS ou le livre numérique devraient respecter : quels caractères ne peuvent commencer ni finir une ligne, l’espace entre écriture japonaise et latine, le traitement des notes et des titres, la façon d’obtenir le bloc de texte. L’en-tête du fichier de classe jlreq nomme l’édition implémentée : la note du W3C du 11 août 2020. Pour le dire précisément : une spécification a été traduite en classe de document.

La profondeur de l’implémentation se voit au fait que la classe embarque ses propres métriques de fonte japonaise (JFM). Là où jsclasses emprunte la métrique JIS, jlreq distribue des TFM dédiés comme jlreq.tfm, jlreqg-v.tfm et jlreq-jidori.tfm, ainsi que jfm-jlreq.lua et jfm-jlreqv.lua pour LuaTeX-ja. Les espaces autour de la ponctuation et des parenthèses sont décidés dans la métrique et non dans une macro de classe : les exigences sont gravées dans la couche la plus basse du système de composition. La classe détecte elle-même si c’est pLaTeX, upLaTeX ou LuaLaTeX qui tourne et l’inscrit dans le log, par exemple jlreq guessed engine: uplatex (XeLaTeX n’est pas pris en charge). Pour forcer le choix, passez platex, uplatex ou lualatex en option de classe.

La différence entre jlreq et jsclasses

En une phrase : jsclasses vous tend une mise en page finie, jlreq vous tend les molettes qui la fabriquent. Le jsarticle de Haruhiko Okumura est bâti sur des valeurs par défaut bien réglées que l’on accepte telles quelles, et produit sans réflexion un document japonais lisible. jlreq suppose l’inverse : que vous fournirez vous-même les chiffres — corps du texte, caractères par ligne, lignes par page, interligne, et marges de tête, de pied, de reliure et de gouttière. Les deux ne se concurrencent donc guère. jsclasses quand un article doit être propre rapidement ; jlreq quand le format et la longueur de ligne étaient fixés avant même d’écrire.

L’autre différence : les décisions fines qu’exige la norme sont exposées comme options. Ajoutez narrow_kanjiskip, par exemple, et l’espace entre caractères japonais (kanjiskip) revient à celui de jsarticle. Cette option est la réponse la plus courte à « la texture du texte a changé depuis que je suis passé à jlreq ». La JFM par défaut applique les espaces prescrits par les exigences ; un manuscrit transféré tel quel de jsclasses vers jlreq aura donc un rendu légèrement différent ligne à ligne, même à nombre de caractères égal. Si vous migrez, comparez une page avant d’engager tout le texte.

Les options de base : type de document, papier et corps

jlreq ne comporte qu’une seule classe. Le type de document se change par une option entre crochets : par défaut, elle se comporte comme article ; report donne un rapport avec \chapter et book un livre. Contrairement à jsclasses, le nom de classe n’est donc pas décliné par type. Ajoutez tate pour l’écriture verticale. Pour le reste, les graphies familières des classes standard fonctionnent telles quelles : twocolumn, twoside, titlepage, landscape, draft, openright/openany, disablejfam.

Le papier se donne par paper=. Outre paper=a4 et paper=a5, on peut écrire directement largeur et hauteur, comme paper={148mm,210mm}. Un piège attend ici : paper=b5 désigne le B5 ISO (176×250 mm), et non les 182×257 mm que « B5 » désigne au Japon. La classe ne laisse pas passer cela en silence ; elle avertit : 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. Pour une publication indépendante ou un imprimeur japonais, c’est presque à coup sûr paper=b5j qu’il faut.

Pensez séparément les corps latin et japonais. fontsize= est le corps latin de base (défaut 10pt), jafontsize= le corps japonais, et jafontscale= donne directement le rapport entre les deux (défaut 1, soit la même taille). jlreq accepte les unités d’imprimerie Q et H comme longueurs, si bien que fontsize=13Q s’écrit tel quel (1 Q = 1 H = 0,25 mm). Les cahiers des charges japonais arrivent presque toujours en Q, et pouvoir les recopier sans conversion pèse plus lourd en pratique qu’il n’y paraît.

OptionSignificationDéfaut
article / report / bookChanger le type de document (chapitres, mise en page)type article
tateComposer verticalementhorizontal
platex / uplatex / lualatexIndiquer le moteur ; sans cela, la classe le détecte et le note dans le logauto-détecté
paper=Papier : a4, a5, b5j (JIS B5), {l,h}. b5 seul désigne le B5 ISOa4
fontsize= / jafontsize=Corps de base latin / japonais ; Q et H acceptés en plus de pt10pt / identique au latin
jlreq_notesÉcrit dans le log des conseils, numéro de clause à l’appui, en cas d’écart aux exigencesoff

Concevoir le bloc de texte en chiffres

Le bloc de texte — le rectangle où se compose le corps — se fixe de l’intérieur vers l’extérieur ou de l’extérieur vers l’intérieur. De l’intérieur : on donne la longueur de ligne line_length=, le nombre de lignes number_of_lines= et l’interligne baselineskip=, et les marges sont ce qui reste. De l’extérieur : on donne les marges de tête head_space=, de pied foot_space=, de reliure gutter= et de gouttière fore_edge= (fore-edge= fonctionne aussi), et le bloc est ce qui reste. Si le cahier des charges dit « 38 caractères par ligne, 18 lignes par page », travaillez de l’intérieur ; s’il dit « 20 mm en tête, 18 mm au fond », de l’extérieur. Nul besoin de mélanger.

Des unités dédiées aident ici. zw est la largeur d’un caractère pleine chasse et zh sa hauteur, si bien que longueur de ligne et interligne restent exprimables en caractères. line_length=40zw donne 40 caractères par ligne ; baselineskip=1.75zw un interligne de 1,75 caractère pleine chasse. L’interligne peut aussi se donner par linegap=, qui compte « un caractère pleine chasse plus l’espace indiqué ». Sans réglage, line_length vaut 0,75× l’étendue du papier dans la direction des caractères, number_of_lines le nombre tenant dans 0,75× l’étendue dans la direction des lignes, baselineskip 1,7× le corps japonais, et l’écart entre colonnes column_gap 2zw. Sans head_space ni foot_space, le bloc est centré verticalement.

OptionSignificationDéfaut
line_length=Longueur d’une ligne0,75× le papier dans la direction des caractères
number_of_lines=Lignes par pageautant qu’il en tient dans 0,75× la direction des lignes
baselineskip= / linegap=Interligne ; linegap= compte un caractère pleine chasse plus cet espace1,7× le corps japonais
gutter= / fore_edge=Marges de reliure et de gouttière
head_space= / foot_space=Marges de tête et de piedcentré verticalement si omis
column_gap=Écart entre colonnes en composition à deux colonnes2zw

Réglages propres au japonais : parenthèses, ponctuation suspendue, tate-chu-yoko

C’est là le terrain le plus caractéristique de jlreq. open_bracket_pos= décide du placement d’une parenthèse ouvrante en début de ligne (JLReq 3.1.5). Les trois valeurs sont zenkaku_tentsuki (défaut), zenkakunibu_nibu et nibu_tentsuki, selon que la parenthèse s’aligne sur toute sa chasse ou se resserre d’une demi-chasse. hanging_punctuation active la ponctuation suspendue : une virgule ou un point en fin de ligne peut déborder du bloc de texte (3.8.2, note 1). Ce sont des choix dont on débat couramment sur le web et en PAO ; pouvoir les basculer par une seule option de classe est presque propre à jlreq.

Le corps du document dispose aussi d’outils japonais : \tatechuyoko pour dresser des chiffres dans un texte vertical, \jidori pour caler du texte dans un nombre fixe de caractères, \warichu pour la petite note en ligne sur deux lignes, \sidenote pour les notes latérales, \endnote pour les notes finales, et \akigumi pour élargir provisoirement l’espace entre caractères. Les dates ont leur étiquette : déclarez \和暦 et \today imprime la date avec le nom d’ère, en chiffres kanji lorsque le document est vertical. La classe porte dans son propre code les frontières entre Shōwa, Heisei et Reiwa — 8 janvier 1989 et 1er mai 2019 — et son journal des modifications consigne le changement de 2019 comme une simple nouvelle ère de règne.

Un exemple vertical et le choix du moteur

Voici un document A5 en écriture verticale, dont le bloc de texte est conçu de l’intérieur : tate le rend vertical, paper=a5 fixe le format, et le reste décrit le bloc en chiffres — japonais à 13 Q, 40 caractères par ligne, 17 lignes par page, interligne de 1,75 caractère pleine chasse. Rien à ajouter dans le corps : cette seule ligne fixe une mise en page de livre. La même ligne \documentclass fonctionne des deux côtés : upLaTeX passe par DVI, LuaLaTeX écrit le PDF directement avec les polices du système. Pour l’horizontal, retirez tate.

latex
\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}

Un piège n’apparaît que sur la route DVI : jlreq n’écrit pas le format de papier dans le DVI sous forme de \special. Une source indiquant paper=a5, composée avec upLaTeX puis passée à dvipdfmx, donne donc un PDF au format par défaut de dvipdfmx — A4 dans la configuration standard de TeX Live. Deux remèdes : ajouter \usepackage{bxpapersize} au préambule, ou indiquer le format au convertisseur, comme dvipdfmx -p a5. LuaLaTeX inscrit la taille de page directement dans le PDF et ne rencontre jamais ce cas.

Faire vérifier votre conception par la classe (jlreq_notes)

Ajoutez jlreq_notes aux options de classe et jlreq confronte vos chiffres aux exigences, consignant dans le log tout ce qui sort du cadre. Avec baselineskip=1.2zw, par exemple, une ligne apparaît sous un en-tête JLReq indiquant que l’espace entre lignes devrait tenir entre une demi-chasse et une chasse pleine (clause 2.4.2.d, note 3). La classe signale de même une note latérale trop étroite, ou un manque de place entre le bloc et le titre courant en composition verticale, en citant à chaque fois la clause. La composition ne s’arrête pas : ce sont des avis, non des règles. Seul l’impossible physiquement interrompt le passage : si l’interligne est inférieur au corps, on obtient ! Class jlreq Error: The baselineskip is less than fontsize.

Façonner titres et notes avec \jlreqsetup

Les dimensions du bloc de texte se règlent en options de classe, mais le détail des notes, citations, listes et titres se peaufine dans le préambule par des paires key=value dans \jlreqsetup{...} : rendu des notes de bas de page, notes latérales, warichu et notes finales, indentation des citations (quote_indent=), allocation de lignes des titres. Pour redessiner un titre lui-même, on utilise \NewBlockHeading ou \ModifyHeading. Cette répartition est voulue : le bloc de texte est ce que le lecteur voit dès l’ouverture d’une page, tandis que \jlreqsetup régit le comportement de chaque élément. Inutile de tout apprendre d’un coup : fixez format, longueur de ligne et nombre de lignes dans \documentclass, puis enrichissez \jlreqsetup au fil des besoins. La liste de référence figure dans le manuel fourni (en japonais, par Abe), qu’ouvre texdoc jlreq.

Une fois le bloc fixé, inspecter une page

jlreq est assez puissant pour produire un PDF même avec de mauvais chiffres. Avant d’écrire le vrai corps, compilez une page de faux texte avec un titre, une note, une citation et une petite figure ou un tableau, puis mesurez réellement la longueur de ligne, le nombre de lignes et les marges de reliure et de gouttière. En écriture verticale, direction des lignes et direction des caractères échangent leurs rôles par rapport à l’horizontal : vérifiez donc d’abord que line_length et number_of_lines n’ont pas été intervertis. Pour les traits de coupe, utilisez le package jlreq-trimmarks plutôt qu’une option de classe ; passer tombow déclenche l’avertissement The option 'tombow' is not supported by jlreq class. Please use the jlreq-trimmarks package.

  • Longueur de ligne — comptez les caractères pleine chasse dans le corps, pas seulement l’endroit où tombe la ponctuation.
  • Nombre de lignes — comptez les lignes de texte sur une page ordinaire et sur une page portant un titre.
  • Marges — prévoyez plus au fond pour un manuscrit relié ; évitez un fond excessif pour une remise en PDF seul.
  • Papier — sur la route DVI, mesurez le PDF final. Sans bxpapersize ni dvipdfmx -p, il sort en A4.
  • Moteur — si upLaTeX et LuaLaTeX emploient des polices différentes, seul le PDF de la route retenue fait foi.