Pide a jsarticle un cuerpo de «10 puntos» y el japonés que sale mide en realidad unos 9,25 puntos. No es un fallo sino el diseño: las jsclasses de Haruhiko Okumura (jsarticle, jsbook) están construidas alrededor del cuerpo de imprenta japonés de 13 Q (3,25 mm), no de los 10 pt latinos. Las clases de la familia js conservan el tacto de las clases estándar de LaTeX y sustituyen solo lo que el japonés necesita: la métrica de fuente, la escalera de cuerpos y el mecanismo que los escala. ltjsclasses lleva ese diseño a LuaLaTeX; BXjscls, a todos los motores. Esta página trata de qué resuelve realmente cada una de las tres familias y de cómo elegir.
Las dos cosas que jsclasses cambia de las clases estándar
El manual que acompaña a jsclasses cita exactamente dos diferencias respecto a las clases estándar: la métrica de fuente japonesa y el tratamiento de las opciones de cuerpo. No reescribió ninguna filosofía de márgenes ni de interlineado; arregló dos puntos que estaban realmente rotos al componer japonés. Primero, usa las métricas JIS jis.tfm y jisg.tfm, obra de Hajime Kobayashi (Tokyo Shoseki Printing), en lugar de las antiguas min10 y goth10. Segundo, rehízo la selección de cuerpo: las clases estándar solo ofrecían 10pt, 11pt y 12pt y, en palabras del propio manual, fuera de los 10 puntos estándar el equilibrio de las fuentes se descompensaba algo.
Los dos puntos tienen la misma raíz. La imprenta japonesa mide el cuerpo en Q (kyū, 1 Q = 0,25 mm), y el cuerpo habitual es 13 Q, es decir 3,25 mm. Pero un carácter de ancho completo en la métrica JIS en bruto mide 13,527 Q, así que jsclasses escala la fuente japonesa por 0,961 (= 13 ÷ 13,527) para que el cuadratín caiga justo en 13 Q. El manual detalla la cuenta y señala que, tras escalar la métrica de 9,62216 pt, un cuerpo nominal de diez puntos mide en realidad «algo más de nueve puntos». La razón vive en la macro real \Cjascale, que vale 0,924690 en jsarticle, jsbook y jsreport (= 9,62216 pt × 0,961 ÷ 10 pt). Desde 2018 el paquete OTF lee esa macro para ajustar el tamaño del japonés.
% upLaTeX: the dvipdfmx option is a global option for graphicx/hyperref
\documentclass[uplatex,dvipdfmx,a4paper,papersize]{jsarticle}
\begin{document}
こんにちは、\LaTeX!
\end{document}La familia la forman jsarticle (artículos e informes), jsbook (libros) y jsreport (informes), con jspf para una revista de sociedad y kiyou para boletines incluidos aparte. jsreport se separó en febrero de 2017, tras una discusión en un foro, de lo que antes se hacía con la opción report de jsbook. Okumura escribió el paquete originalmente sobre classes.dtx del LaTeX3 Project y jclasses.dtx de ASCII Corporation; el parche de compatibilidad con upLaTeX de Takuji Tanaka se integró en 2009 y, desde julio de 2016, lo mantiene la Japanese TeX Development Community (texjporg/jsclasses en GitHub). Viene con TeX Live, así que no hay nada que instalar.
| Opción | Efecto |
|---|---|
a4paper / b5j / a4var | Papel. ISO a4paper/b5paper, tamaños JIS B b4j/b5j, y las variantes a4var (210×283 mm) y b5var (182×230 mm). Predeterminado a4paper |
papersize | Escribe un \special de tamaño de papel en el DVI. Prácticamente imprescindible en la ruta DVI hacia PDF |
tombow / tombo / mentuke | Imprime marcas de corte. Añade una pulgada de soporte por cada lado; tombow estampa además el nombre del trabajo y la fecha y hora de la pasada |
mingoth / jis | mingoth vuelve a los antiguos TFM japoneses min10/goth10; jis selecciona explícitamente la métrica JIS bajo pLaTeX |
disablejfam | No registra las fuentes japonesas como familia matemática: útil cuando un documento agota las familias matemáticas |
openright / openleft / openany | En jsbook/jsreport, decide en qué página abre un capítulo; openleft abre a la izquierda |
Cómo se fabrica el cuerpo: \mag frente a nomag
jsclasses compone el cuerpo a 10 pt y luego escala todo el documento con la primitiva \mag de TeX hasta el tamaño pedido (×1,095 para 11pt, ×1,200 para 12pt). Así ofrece cuerpos que las clases estándar no tienen: la escalera geométrica 8pt, 9pt, 14pt, 17pt, 20pt, 21pt, 25pt, 30pt, 36pt, 43pt, los valores en Q 12Q y 14Q, y los tamaños reales 10ptj, 10.5ptj, 11ptj, 12ptj. \mag estira papel, glifos y filetes por igual, lo que es potente; pero algunas herramientas no entienden el valor, y el resultado depende de cómo lo traten después dvipdfmx o dvips.
| Opción | Comportamiento |
|---|---|
usemag | Escala todo el documento con \mag, el método original. Predeterminado en jsclasses y único método antes del 8 de julio de 2016 |
nomag | Añadida el 8 de julio de 2016: evitar \mag y escalar en su lugar las dimensiones del diseño |
nomag* | Añadida el 24 de julio de 2016: como nomag, más un parche a NFSS para ajustar también el tamaño óptico |
En la práctica, empieza con el usemag predeterminado. Si geometry, la colocación de imágenes o un posprocesamiento de PDF muestran un desajuste real de dimensiones, prueba nomag*. La reproducibilidad —los mismos comandos dando el mismo PDF— importa más que cargar todas las opciones desde el principio. Y como un documento escalado con \mag debe avisar de esa ampliación a cada herramienta DVI posterior, fijar el método de escalado junto con la receta de compilación ahorra problemas en trabajo colaborativo.
¿jsarticle necesita pLaTeX o upLaTeX?
Sirven ambos, porque la clase detecta el motor por sí misma. Escribe solo \documentclass{jsarticle} y ejecuta upLaTeX: el registro dice Class jsarticle Info: Autodetected engine: upLaTeX y cambia las codificaciones japonesas a JY2/JT2; bajo pLaTeX dice Autodetected engine: pLaTeX. Aun así se escribe uplatex (o platex, o autodetect-engine) como opción de clase por dos motivos: deja constancia de la intención en la fuente e impide que un desajuste produzca en silencio otra composición. Si la opción y el motor real no coinciden, la clase se detiene, por ejemplo con ! Class jsarticle Error: Option 'platex' is specified but you are running upLaTeX.
dvipdfmx, en cambio, no es una opción de clase. Todo lo que jsclasses no consume se pasa como opción global a los paquetes que siguen, y graphicx, color y hyperref la leen para elegir su controlador. Escribirla una vez entre los corchetes de \documentclass evita repetirla en cada paquete: eso es todo lo que significa la forma habitual [uplatex,dvipdfmx].
Por qué un documento A5 sale como PDF A4
Si pediste a5paper y el PDF sale en A4, la causa no es la clase sino que el DVI no lleva ningún tamaño de papel. En TeX Live 2024, \documentclass[uplatex,a5paper]{jsarticle} pasado a dvipdfmx da un PDF de 595,28 × 841,89 pt, es decir A4: un archivo DVI no tiene noción de papel y dvipdfmx recurre a su propio valor por defecto. Añade la opción de clase papersize y se escribe un \special{papersize=...}; la misma fuente sale entonces en 419,53 × 595,28 pt, o sea A5. Con tombow además, el pliego crece por las marcas de corte: el A5 pasa a 563,53 × 739,28 pt, exactamente una pulgada añadida por cada lado. LuaLaTeX (ltjsclasses, en la sección siguiente) escribe el PDF directamente y nunca topa con esto.
ltjsclasses: jsclasses llevado a LuaLaTeX
ltjsclasses reescribe jsclasses para LuaLaTeX (LuaTeX-ja) y lo mantiene el proyecto LuaTeX-ja. Ofrece ltjsarticle, ltjsbook y ltjsreport (además de ltjspf y ltjskiyou), en correspondencia uno a uno con las jsclasses, como sugieren los nombres. La mayor diferencia está en el escalado. El manual de LuaTeX dice claramente que la ampliación con \mag solo se admite en modo de salida DVI, así que no está disponible cuando LuaLaTeX escribe PDF directamente. ltjsclasses hace por tanto que nomag* sea el valor predeterminado y, si pasas usemag, avisa con This ltjsarticle cls does not support 'usemag' option, since LuaTeX does not support \mag in pdf output y vuelve a nomag*.
Las opciones relacionadas con el motor también cambian de comportamiento. Pasar uplatex produce un error (this class does not support 'uplatex' option), mientras que autodetect-engine solo genera una advertencia y se ignora, algo razonable porque aquí solo hay un motor. La métrica japonesa usa por defecto el jfm-ujis.lua estándar de LuaTeX-ja; la opción ptexjis cambia a la misma métrica JIS que usa jsclasses (jfm-jis.lua), y mingoth a la antigua jfm-min.lua. Para cambiar de fuentes, combina la clase con luatexja-fontspec y nombra cualquier fuente OpenType instalada en el sistema.
% 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: una fuente, todos los motores
BXjscls (Takayuki Yato, conocido como ZR) amplía el diseño de las jsclasses para que funcione con cualquier motor, y ofrece bxjsarticle, bxjsbook, bxjsreport y bxjsslide. Lo primero que hay que acertar es cómo se nombra el motor. El motor es una opción de clase desnuda, no engine=: lualatex, xelatex, pdflatex, platex, uplatex, latex, platex-ng, o autodetect-engine para la detección automática. Si escribes engine=lualatex, el ajuste nunca llega y la compilación se detiene con ! 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 segunda clave es ja= (antes jadriver), que elige el esquema de tratamiento del japonés entre standard, minimal, modern y pandoc. Aquí está la trampa real. Si omites ja=, solo (u)pLaTeX recibe standard; cualquier otro motor cae en minimal con la advertencia The option 'ja' is MISSING!! So 'ja=minimal' is assumed as fallback, but such implicit setting is now DEPRECATED! A la inversa, en cuanto escribes ja=, una opción de motor explícita pasa a ser obligatoria. En la práctica, la única forma segura es escribir siempre juntos el motor y ja=. Con ja=standard, la clase carga el paquete japonés adecuado al motor en uso.
| Opción de motor | Soporte japonés cargado por ja=standard |
|---|---|
platex / uplatex | El soporte japonés nativo de (u)pLaTeX; el cambio de fuentes se hace con pxchfon |
lualatex | luatexja, con luatexja-fontspec / luatexja-preset para las fuentes |
xelatex | zxjatype, construido sobre xeCJK; fuentes mediante zxjafont |
pdflatex / latex | bxcjkjatype, construido sobre el paquete CJK: la ruta más limitada |
El vocabulario de las dimensiones toma prestado de jsclasses y de jlreq. El cuerpo latino base es base= (alias fontsize=), el japonés jbase= (alias jafontsize=), y la razón de escala japonesa scale= (alias jafontscale=), cuyo valor predeterminado es \jsScale = 0,924715 (\Cjascale apunta al mismo valor). El bloque de texto se indica con textwidth= y number-of-lines=, o con las grafías propias de jlreq line_length= y number_of_lines=. El escalado se elige con magstyle= entre usemag, nomag y nomag*; desde LuaTeX v0.87, y en pTeX-ng, el predeterminado pasa a nomag* y pedir magstyle=usemag se detiene con ! Class bxjsarticle Error: The engine does not support 'magstyle=usemag'.
Elegir entre jsclasses, ltjsclasses y BXjscls
Elige primero el motor y después la clase que le encaja. Incluso para el mismo «aspecto jsarticle», el nombre de la clase cambia con el procesador. Cambiar la clase dejando el motor es la forma segura de perder por completo el tratamiento del japonés y ver cómo se desmorona la composición.
- Con pLaTeX/upLaTeX, usa jsclasses. La elección estándar cuando el material existente o las normas de envío fijan el procesador. Parte de
\documentclass[uplatex,dvipdfmx,papersize]{jsarticle}. - ¿Sobre todo LuaLaTeX? ltjsclasses. Las fuentes OpenType del sistema funcionan directamente y el PDF se escribe sin etapa DVI;
nomag*es el predeterminado y el tamaño de papel nunca se pierde. - ¿No quieres fijar el motor, o vas a distribuir la fuente? BXjscls. Dos cambios —el nombre del motor y
ja=— bastan para que el mismo archivo se mueva entre pdfLaTeX, XeLaTeX, LuaLaTeX y (u)pLaTeX. - ¿Quieres el bloque de texto en números? jlreq. Un linaje distinto de la familia js, donde longitud de línea, número de líneas y márgenes se diseñan según la norma.
Confirmar la ruta en el registro
Como en la familia js el motor y la clase van en pareja, las primeras líneas del .log dicen si el documento se compuso por la ruta prevista. En colaboración o CI, comprueba no que apareció un PDF, sino que el PDF salió de la ruta prevista. Lo ideal es que el comando de compilación, la línea \documentclass y el README nombren lo mismo.
| Clase | Qué comprobar en el registro |
|---|---|
jsarticle | Si la línea Autodetected engine: dice pLaTeX o upLaTeX; con papersize, mide también el tamaño de página del PDF |
ltjsarticle | Que se cargó luatexja, que la configuración de fuentes surte efecto y que no aparece ninguna advertencia usemag |
bxjsarticle | Que están presentes la opción de motor y ja=; si aparece la advertencia de ja ausente, añádelo |