Demandez à jsarticle un corps de « 10 points » et le japonais obtenu mesure en réalité environ 9,25 points. Ce n’est pas un défaut mais une intention : les jsclasses de Haruhiko Okumura (jsarticle, jsbook) sont bâties autour du corps d’imprimerie japonais de 13 Q (3,25 mm), et non des 10 pt latins. Les classes de la famille js gardent le toucher des classes standard de LaTeX et ne remplacent que ce dont le japonais a besoin : la métrique de fonte, l’échelle des corps et le mécanisme qui les met à l’échelle. ltjsclasses porte cette conception sur LuaLaTeX, BXjscls sur tous les moteurs. Cette page explique ce que chacune des trois familles résout réellement, et comment choisir.
Les deux choses que jsclasses change aux classes standard
Le manuel livré avec jsclasses ne cite que deux différences avec les classes standard : la métrique de fonte japonaise et le traitement des options de corps. Il ne réécrit pas une philosophie des marges ou de l’interlignage ; il répare deux endroits réellement défaillants pour la composition japonaise. D’abord, il utilise les métriques JIS jis.tfm et jisg.tfm, réalisées par Hajime Kobayashi (Tokyo Shoseki Printing), à la place des anciennes min10 et goth10. Ensuite, il refait la sélection des corps : les classes standard n’offraient que 10pt, 11pt et 12pt et, selon les mots mêmes du manuel, hors des 10 points standard l’équilibre des fontes se dégradait un peu.
Les deux points n’en font qu’un. L’imprimerie japonaise compte les corps en Q (kyū, 1 Q = 0,25 mm), et le corps courant vaut 13 Q, soit 3,25 mm. Or, dans la métrique JIS brute, un caractère pleine chasse mesure 13,527 Q ; jsclasses met donc la fonte japonaise à l’échelle 0,961 (= 13 ÷ 13,527) pour que le cadratin tombe exactement sur 13 Q. Le manuel détaille le calcul et note qu’après cette mise à l’échelle de la métrique de 9,62216 pt, un corps nominal de dix points fait en réalité « un peu plus de neuf points ». Le rapport est conservé dans la macro réelle \Cjascale, qui vaut 0,924690 dans jsarticle, jsbook et jsreport (= 9,62216 pt × 0,961 ÷ 10 pt). Depuis 2018, le package OTF lit cette macro pour accorder la taille du japonais.
% upLaTeX: the dvipdfmx option is a global option for graphicx/hyperref
\documentclass[uplatex,dvipdfmx,a4paper,papersize]{jsarticle}
\begin{document}
こんにちは、\LaTeX!
\end{document}La famille comprend jsarticle (articles et rapports), jsbook (livres) et jsreport (rapports), auxquels s’ajoutent jspf pour une revue savante et kiyou pour des bulletins. jsreport a été détachée en février 2017, à la suite d’une discussion sur un forum, de ce que l’on faisait auparavant avec l’option report de jsbook. Okumura a écrit l’ensemble à partir de classes.dtx du LaTeX3 Project et de jclasses.dtx d’ASCII Corporation ; le correctif upLaTeX de Takuji Tanaka a été intégré en 2009, et depuis juillet 2016 la Japanese TeX Development Community en assure la maintenance (texjporg/jsclasses sur GitHub). Le tout est fourni avec TeX Live, sans installation supplémentaire.
| Option | Effet |
|---|---|
a4paper / b5j / a4var | Papier. ISO a4paper/b5paper, formats JIS B b4j/b5j, et les variantes a4var (210×283 mm) et b5var (182×230 mm). Défaut a4paper |
papersize | Écrit un \special de format papier dans le DVI. Pratiquement indispensable sur la route DVI vers PDF |
tombow / tombo / mentuke | Imprime les traits de coupe. Ajoute un pouce de support de chaque côté ; tombow estampille aussi le nom du travail et la date et l’heure du passage |
mingoth / jis | mingoth revient aux anciens TFM japonais min10/goth10 ; jis sélectionne explicitement la métrique JIS sous pLaTeX |
disablejfam | N’enregistre pas les polices japonaises comme famille mathématique — utile quand un document épuise les familles mathématiques |
openright / openleft / openany | Dans jsbook/jsreport, décide sur quelle page s’ouvre un chapitre ; openleft ouvre à gauche |
Comment le corps est fabriqué : \mag contre nomag
jsclasses compose le corps en 10 pt, puis met tout le document à l’échelle avec la primitive TeX \mag pour atteindre la taille demandée (×1,095 pour 11pt, ×1,200 pour 12pt). C’est ainsi qu’il propose des corps absents des classes standard : la suite géométrique 8pt, 9pt, 14pt, 17pt, 20pt, 21pt, 25pt, 30pt, 36pt, 43pt, les valeurs en Q 12Q et 14Q, et les tailles réelles 10ptj, 10.5ptj, 11ptj, 12ptj. \mag étire papier, glyphes et filets ensemble, ce qui est puissant ; mais certains outils n’en comprennent pas la valeur, et le résultat dépend du traitement ultérieur par dvipdfmx ou dvips.
| Option | Comportement |
|---|---|
usemag | Met tout le document à l’échelle avec \mag, la méthode d’origine. Défaut de jsclasses, et seule méthode avant le 8 juillet 2016 |
nomag | Ajoutée le 8 juillet 2016 : éviter \mag et mettre plutôt à l’échelle les dimensions de mise en page |
nomag* | Ajoutée le 24 juillet 2016 : comme nomag, plus un correctif NFSS pour ajuster aussi la taille optique |
En pratique, commencez par le usemag par défaut. Si geometry, le placement des images ou un post-traitement PDF révèle un vrai décalage de dimensions, essayez nomag*. La reproductibilité — les mêmes commandes donnant le même PDF — compte davantage que le chargement de toutes les options d’emblée. Et comme un document mis à l’échelle par \mag doit signaler cet agrandissement à chaque outil DVI en aval, fixer la méthode de mise à l’échelle en même temps que la recette de compilation évite bien des ennuis en travail collaboratif.
jsarticle demande-t-il pLaTeX ou upLaTeX ?
Les deux conviennent, car la classe détecte le moteur elle-même. Écrivez simplement \documentclass{jsarticle} et lancez upLaTeX : le log affiche Class jsarticle Info: Autodetected engine: upLaTeX et bascule les codages japonais sur JY2/JT2 ; sous pLaTeX il affiche Autodetected engine: pLaTeX. On écrit malgré tout uplatex (ou platex, ou autodetect-engine) en option de classe pour deux raisons : consigner l’intention dans la source, et empêcher qu’un désaccord produise silencieusement une autre mise en page. Si l’option et le moteur réel divergent, la classe s’arrête net, par exemple sur ! Class jsarticle Error: Option 'platex' is specified but you are running upLaTeX.
dvipdfmx, en revanche, n’est pas une option de classe. Tout ce que jsclasses ne consomme pas est transmis comme option globale aux packages suivants, et graphicx, color et hyperref la lisent pour choisir leur pilote. L’écrire une fois entre les crochets de \documentclass évite donc de la répéter sur chaque package : c’est tout ce que signifie la forme habituelle [uplatex,dvipdfmx].
Pourquoi un document A5 sort en PDF A4
Si vous avez demandé a5paper et que le PDF est en A4, la cause n’est pas la classe mais le fait que le DVI ne transporte aucun format de papier. Sous TeX Live 2024, \documentclass[uplatex,a5paper]{jsarticle} passé à dvipdfmx donne un PDF de 595,28 × 841,89 pt, soit A4 : un fichier DVI ignore la notion de papier et dvipdfmx retombe sur sa valeur par défaut. Ajoutez l’option de classe papersize : un \special{papersize=...} est écrit et la même source sort en 419,53 × 595,28 pt, c’est-à-dire A5. Avec tombow en plus, la feuille grandit des traits de coupe : l’A5 devient 563,53 × 739,28 pt, soit exactement un pouce ajouté de chaque côté. LuaLaTeX (ltjsclasses, section suivante) écrit le PDF directement et ne rencontre jamais ce problème.
ltjsclasses : jsclasses porté sur LuaLaTeX
ltjsclasses réécrit jsclasses pour LuaLaTeX (LuaTeX-ja) et est maintenu par le projet LuaTeX-ja. Il fournit ltjsarticle, ltjsbook et ltjsreport (ainsi que ltjspf et ltjskiyou), en correspondance un pour un avec les jsclasses, comme leurs noms l’indiquent. La grande différence tient à la mise à l’échelle. Le manuel de LuaTeX indique explicitement que l’agrandissement par \mag n’est pris en charge qu’en mode de sortie DVI ; il est donc indisponible quand LuaLaTeX écrit directement du PDF. ltjsclasses fait donc de nomag* le défaut et, si vous passez usemag, avertit par This ltjsarticle cls does not support 'usemag' option, since LuaTeX does not support \mag in pdf output avant de revenir à nomag*.
Les options liées au moteur changent aussi de comportement. Passer uplatex provoque une erreur (this class does not support 'uplatex' option), tandis que autodetect-engine ne déclenche qu’un avertissement et est ignoré — logique, puisqu’il n’y a qu’un seul moteur ici. La métrique japonaise vaut par défaut le jfm-ujis.lua standard de LuaTeX-ja ; l’option ptexjis bascule sur la métrique JIS employée par jsclasses (jfm-jis.lua), et mingoth sur l’ancienne jfm-min.lua. Pour changer de polices, associez la classe à luatexja-fontspec et désignez par leur nom les polices OpenType installées sur le système.
% compile with lualatex; nomag* is already the default here
\documentclass[a4paper]{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont{Noto Serif CJK JP}
\setsansjfont{Noto Sans CJK JP}
\begin{document}
こんにちは、\LaTeX!
\end{document}BXjscls : une seule source, tous les moteurs
BXjscls (Takayuki Yato, dit ZR) élargit la conception des jsclasses à tous les moteurs et fournit bxjsarticle, bxjsbook, bxjsreport et bxjsslide. Le premier point à ne pas manquer est la façon de nommer le moteur. Le moteur est une option de classe nue, et non engine= : lualatex, xelatex, pdflatex, platex, uplatex, latex, platex-ng, ou autodetect-engine pour la détection automatique. Si vous écrivez engine=lualatex, le réglage n’arrive jamais et la compilation s’arrête sur ! Class bxjsarticle Error: An engine option must be explicitly given.
% the engine is a bare option; ja= picks the Japanese driver
\documentclass[lualatex,ja=standard,a5paper]{bxjsarticle}
\begin{document}
こんにちは、\LaTeX!
\end{document}
% same body, different engine: swap the first option only
% \documentclass[uplatex,ja=standard,dvipdfmx,a5paper]{bxjsarticle}La deuxième clé est ja= (anciennement jadriver), qui choisit le schéma de traitement du japonais parmi standard, minimal, modern et pandoc. C’est là que se cache le vrai piège. Sans ja=, seul (u)pLaTeX se voit attribuer standard ; tout autre moteur retombe sur minimal avec l’avertissement The option 'ja' is MISSING!! So 'ja=minimal' is assumed as fallback, but such implicit setting is now DEPRECATED! Inversement, dès que ja= est écrit, une option de moteur explicite devient obligatoire. En pratique, la seule forme sûre consiste donc à toujours écrire ensemble le moteur et ja=. Avec ja=standard, la classe charge le package japonais adapté au moteur employé.
| Option de moteur | Prise en charge du japonais chargée par ja=standard |
|---|---|
platex / uplatex | La prise en charge japonaise native de (u)pLaTeX ; changement de polices avec pxchfon |
lualatex | luatexja, avec luatexja-fontspec / luatexja-preset pour les polices |
xelatex | zxjatype, fondé sur xeCJK ; polices via zxjafont |
pdflatex / latex | bxcjkjatype, fondé sur le package CJK — la route la plus contrainte |
Le vocabulaire des dimensions emprunte à la fois à jsclasses et à jlreq. Le corps latin de base est base= (alias fontsize=), le japonais jbase= (alias jafontsize=), et le rapport d’échelle japonais scale= (alias jafontscale=), dont la valeur par défaut est \jsScale = 0,924715 (\Cjascale désigne la même valeur). Le bloc de texte se donne par textwidth= et number-of-lines=, ou avec les graphies de jlreq line_length= et number_of_lines=. La mise à l’échelle se choisit par magstyle= parmi usemag, nomag et nomag* ; à partir de LuaTeX v0.87, et sur pTeX-ng, le défaut devient nomag* et demander magstyle=usemag s’arrête sur ! Class bxjsarticle Error: The engine does not support 'magstyle=usemag'.
Choisir entre jsclasses, ltjsclasses et BXjscls
Choisissez d’abord le moteur, puis la classe qui lui convient. Même pour un rendu « à la jsarticle », le nom de la classe change avec le processeur. Changer la classe en gardant le moteur est le moyen sûr de perdre tout traitement du japonais et de voir la mise en page s’effondrer.
- Sous pLaTeX/upLaTeX, utilisez jsclasses. Le choix classique quand des sources existantes ou des consignes de soumission fixent le processeur. Partez de
\documentclass[uplatex,dvipdfmx,papersize]{jsarticle}. - Surtout LuaLaTeX ? ltjsclasses. Les polices OpenType du système fonctionnent directement et le PDF est écrit sans étape DVI ;
nomag*est le défaut et le format de papier ne se perd jamais. - Vous ne voulez pas fixer le moteur, ou vous diffusez la source ? BXjscls. Deux modifications — le nom du moteur et
ja=— suffisent pour que le même fichier passe de pdfLaTeX à XeLaTeX, LuaLaTeX et (u)pLaTeX. - Vous voulez fixer le bloc de texte en chiffres ? jlreq. Une lignée distincte de la famille js, où longueur de ligne, nombre de lignes et marges se conçoivent d’après la norme.
Vérifier la route dans le log
Comme moteur et classe vont par paire dans la famille js, les premières lignes du .log disent si le document a bien été composé par la route prévue. En collaboration ou en CI, vérifiez non qu’un PDF est apparu, mais que le PDF vient de la route prévue. Idéalement, la commande de compilation, la ligne \documentclass et le README désignent la même chose.
| Classe | À vérifier dans le log |
|---|---|
jsarticle | Si la ligne Autodetected engine: indique pLaTeX ou upLaTeX ; avec papersize, mesurez aussi la taille de page du PDF |
ltjsarticle | Que luatexja a été chargé, que la configuration de polices agit, et qu’aucun avertissement usemag n’apparaît |
bxjsarticle | Que l’option de moteur et ja= sont toutes deux présentes ; si l’avertissement de ja manquant apparaît, ajoutez-le |