jlreq

jlreq es probablemente la única clase de documento de LaTeX que te avisa, a mitad de compilación, de que tu interlineado se sale de lo que la norma recomienda. Publicada por Noriyuki Abe en 2017, es un intento de implementar en LaTeX la nota técnica del W3C «Requirements for Japanese Text Layout» (JLReq), y de ahí viene el nombre. Su código fuente lleva más de treinta comentarios que citan números de cláusula de esos requisitos, y con la opción jlreq_notes esos consejos —con la cláusula incluida— aparecen en el registro. Esta página trata de qué hace jlreq distinto de las clases de la familia js, de cómo permite diseñar el bloque de texto con números, y de cómo maneja decisiones propias del japonés como la escritura vertical o la posición de un paréntesis de apertura al principio de una línea.

Qué es JLReq y cómo lo implementa la clase

JLReq es una nota técnica del W3C que describe qué hace falta para componer japonés correctamente. Basada en la norma industrial japonesa JIS X 4051 (reglas de formato para documentos japoneses), enumera —cláusula numerada tras cláusula numerada— las reglas que tecnologías como CSS o el libro electrónico deberían respetar: qué caracteres no pueden empezar ni terminar una línea, el espacio entre escritura japonesa y latina, el tratamiento de notas y encabezados, cómo se obtiene el bloque de texto. La cabecera del archivo de clase jlreq nombra la edición que implementa: la nota del W3C del 11 de agosto de 2020. Dicho con precisión: se ha traducido una especificación a una clase de documento.

La profundidad de la implementación se ve en que la clase trae sus propias métricas de fuente japonesa (JFM). Donde jsclasses toma prestada la métrica JIS, jlreq distribuye TFM propios como jlreq.tfm, jlreqg-v.tfm y jlreq-jidori.tfm, además de jfm-jlreq.lua y jfm-jlreqv.lua para LuaTeX-ja. El espaciado alrededor de la puntuación y los paréntesis se decide dentro de la métrica y no en una macro de clase: los requisitos quedan grabados en la capa más baja del sistema de composición. La clase detecta por sí misma si corre pLaTeX, upLaTeX o LuaLaTeX y lo anota en el registro, por ejemplo jlreq guessed engine: uplatex (XeLaTeX no está soportado). Para forzar la elección, pasa platex, uplatex o lualatex como opción de clase.

La diferencia entre jlreq y jsclasses

En una frase: jsclasses te entrega un aspecto terminado; jlreq te entrega los mandos que lo fabrican. El jsarticle de Haruhiko Okumura está construido sobre valores por defecto bien afinados que uno acepta tal cual, y produce sin pensar un documento japonés legible. jlreq supone lo contrario: que serás tú quien aporte los números —cuerpo del texto, caracteres por línea, líneas por página, interlineado, y márgenes de cabeza, pie, lomo y corte—. Así que apenas compiten. jsclasses cuando un artículo debe quedar presentable deprisa; jlreq cuando el formato y la longitud de línea estaban decididos antes de empezar.

La otra diferencia: las decisiones finas que exige la norma están expuestas como opciones. Añade narrow_kanjiskip, por ejemplo, y el espacio entre caracteres japoneses (kanjiskip) vuelve al que usa jsarticle. Esa opción es la respuesta más corta a «la textura del texto cambió al pasarme a jlreq». La JFM por defecto aplica los espacios que piden los requisitos, así que un manuscrito trasladado sin cambios de jsclasses a jlreq se verá algo distinto línea a línea, aun con los mismos caracteres por línea. Si vas a migrar, compara una página antes de comprometer todo el texto.

Las opciones básicas: tipo de documento, papel y cuerpo

jlreq tiene una sola clase. El tipo de documento se cambia con una opción entre corchetes: por defecto se comporta como article, report da un informe con \chapter y book da un libro. Fíjate en que el nombre de la clase no se divide por tipo como en jsclasses. Añade tate para escritura vertical. Por lo demás, las grafías familiares de las clases estándar funcionan sin cambios: twocolumn, twoside, titlepage, landscape, draft, openright/openany, disablejfam.

El papel se indica con paper=. Además de paper=a4 y paper=a5, puedes escribir directamente ancho y alto, como paper={148mm,210mm}. Aquí hay una trampa: paper=b5 significa B5 ISO (176×250 mm), no los 182×257 mm que «B5» designa en Japón. La clase no lo deja pasar en silencio; avisa con 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. Para una publicación propia o una imprenta japonesa, casi con seguridad quieres paper=b5j.

Piensa por separado los cuerpos latino y japonés. fontsize= es el cuerpo latino base (predeterminado 10pt), jafontsize= es el cuerpo japonés, y jafontscale= da directamente la razón entre ambos (predeterminado 1, es decir, el mismo tamaño). jlreq acepta las unidades de imprenta Q y H como longitudes, así que fontsize=13Q se escribe tal cual (1 Q = 1 H = 0,25 mm). Las especificaciones japonesas llegan casi siempre en Q, y poder copiarlas sin convertir pesa más en la práctica de lo que parece.

OpciónSignificadoPredeterminado
article / report / bookCambiar el tipo de documento (capítulos, diseño)tipo article
tateComponer en verticalhorizontal
platex / uplatex / lualatexIndicar el motor; si se omite, la clase lo detecta y lo anota en el registroautodetectado
paper=Papel: a4, a5, b5j (JIS B5), {ancho,alto}. b5 a secas es B5 ISOa4
fontsize= / jafontsize=Cuerpo base latino / japonés; se aceptan Q y H además de pt10pt / igual que el latino
jlreq_notesEscribe en el registro consejos, con número de cláusula, cuando un ajuste se aparta de los requisitosoff

Diseñar el bloque de texto con números

El bloque de texto —el rectángulo donde se compone el cuerpo— se fija de dentro hacia fuera o de fuera hacia dentro. De dentro hacia fuera es dar la longitud de línea line_length=, el número de líneas number_of_lines= y el interlineado baselineskip=, y dejar que los márgenes sean lo que sobre. De fuera hacia dentro es dar los márgenes de cabeza head_space=, pie foot_space=, lomo gutter= y corte fore_edge= (también vale fore-edge=), y dejar que el bloque sea lo que sobre. Si la especificación llega como «38 caracteres por línea, 18 líneas por página», trabaja desde dentro; si llega como «20 mm de cabeza, 18 mm de lomo», desde fuera. No hace falta mezclar.

Aquí ayudan unidades dedicadas. zw es el ancho de un carácter de ancho completo y zh su altura, así que longitud de línea e interlineado pueden seguir expresándose en caracteres. line_length=40zw son 40 caracteres por línea; baselineskip=1.75zw es un interlineado de 1,75 caracteres de ancho completo. El interlineado también puede darse con linegap=, que cuenta «un carácter de ancho completo más el hueco indicado». Sin ajustar, line_length vale 0,75× la extensión del papel en la dirección de caracteres, number_of_lines es lo que quepa en 0,75× la extensión en la dirección de líneas, baselineskip es 1,7× el cuerpo japonés y la separación entre columnas column_gap es 2zw. Si omites head_space y foot_space, el bloque queda centrado verticalmente.

OpciónSignificadoPredeterminado
line_length=Longitud de una línea0,75× el papel en la dirección de caracteres
number_of_lines=Líneas por páginalas que quepan en 0,75× la dirección de líneas
baselineskip= / linegap=Interlineado; linegap= cuenta un carácter de ancho completo más este hueco1,7× el cuerpo japonés
gutter= / fore_edge=Márgenes de lomo y de corte
head_space= / foot_space=Márgenes superior e inferiorcentrado vertical si se omite
column_gap=Separación entre columnas en composición a dos columnas2zw

Ajustes propios del japonés: paréntesis, puntuación colgante, tate-chu-yoko

Este es el terreno más característico de jlreq. open_bracket_pos= decide cómo se coloca un paréntesis de apertura cuando cae al principio de una línea (JLReq 3.1.5). Los tres valores son zenkaku_tentsuki (predeterminado), zenkakunibu_nibu y nibu_tentsuki, según si el paréntesis queda a ras con su ancho completo o se recoge medio cuadratín. hanging_punctuation activa la puntuación colgante: una coma o un punto al final de línea puede sobresalir del bloque de texto (3.8.2, nota 1). Son decisiones que en la web y en autoedición se discuten a diario; poder alternarlas con una sola opción de clase es casi exclusivo de jlreq.

El cuerpo del documento también recibe herramientas japonesas: \tatechuyoko para poner cifras derechas dentro de texto vertical, \jidori para encajar texto en un número fijo de caracteres, \warichu para la pequeña nota en línea a dos renglones, \sidenote para notas laterales, \endnote para notas finales, y \akigumi para ensanchar temporalmente el espacio entre caracteres. Las fechas tienen su propia etiqueta: declara \和暦 y \today imprime la fecha con el nombre de era, en numerales kanji cuando el documento es vertical. La clase lleva en su propio código las fronteras entre Shōwa, Heisei y Reiwa —8 de enero de 1989 y 1 de mayo de 2019— y su registro de cambios anota el cambio de 2019 simplemente como una nueva era de reinado.

Un ejemplo vertical y la elección del motor

Este es un documento A5 en vertical, con el bloque de texto diseñado desde dentro: tate lo hace vertical, paper=a5 fija el formato y el resto declara el bloque con números —japonés a 13 Q, 40 caracteres por línea, 17 líneas por página, interlineado de 1,75 caracteres de ancho completo—. No hace falta añadir nada al cuerpo; esa sola línea fija una composición de libro. La misma línea \documentclass sirve para ambos caminos: upLaTeX pasa por DVI, LuaLaTeX escribe el PDF directamente con fuentes del sistema. Para pasar a horizontal, quita 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}

Hay una trampa que solo aparece en la ruta DVI: jlreq no escribe el tamaño de papel en el DVI como \special. Así, una fuente que dice paper=a5, compuesta con upLaTeX y entregada a dvipdfmx, produce un PDF con el papel por defecto de dvipdfmx —A4 en la configuración estándar de TeX Live—. Hay dos soluciones: añadir \usepackage{bxpapersize} al preámbulo, o indicar el tamaño en el conversor, como dvipdfmx -p a5. LuaLaTeX escribe el tamaño de página directamente en el PDF y nunca topa con esto.

Deja que la clase compruebe tu diseño (jlreq_notes)

Añade jlreq_notes a las opciones de clase y jlreq contrasta tus números con los requisitos, escribiendo en el registro todo lo que quede fuera de rango. Con baselineskip=1.2zw, por ejemplo, aparece una línea bajo un encabezado JLReq indicando que el hueco entre líneas debería estar entre medio cuadratín y un cuadratín completo (cláusula 2.4.2.d, nota 3). También avisa cuando la medida de una nota lateral es demasiado corta, o cuando una composición vertical deja poco espacio entre el bloque y el titulillo, citando cada vez la cláusula. La composición no se detiene: son avisos, no reglas. Solo un ajuste físicamente imposible corta la pasada: si el interlineado es menor que el cuerpo, se obtiene ! Class jlreq Error: The baselineskip is less than fontsize.

Modelar encabezados y notas con \jlreqsetup

Las dimensiones del bloque de texto se fijan como opciones de clase, pero el detalle de notas, citas, listas y encabezados se ajusta en el preámbulo con pares key=value dentro de \jlreqsetup{...}: cómo se muestran notas al pie, notas laterales, warichu y notas finales, la sangría de las citas (quote_indent=), la asignación de líneas de los encabezados. Para rediseñar un encabezado en sí, se usan \NewBlockHeading o \ModifyHeading. El reparto es deliberado: el bloque de texto es lo que el lector ve nada más abrir una página, mientras que \jlreqsetup gobierna cómo se comporta cada elemento. No hace falta aprenderlo todo de golpe: fija formato, longitud de línea y número de líneas en \documentclass y añade a \jlreqsetup según surja la necesidad. La lista de referencia está en el manual incluido (en japonés, de Abe), que abre texdoc jlreq.

Fijado el bloque, inspecciona una página

jlreq es lo bastante potente como para producir un PDF aun con números equivocados. Antes de escribir el cuerpo real, compila una página de texto ficticio con un encabezado, una nota, una cita y una figura o tabla pequeña, y mide de verdad la longitud de línea, el número de líneas y los márgenes de lomo y corte. En escritura vertical, la dirección de línea y la de caracteres intercambian su papel respecto a la horizontal, así que comprueba primero que no hayas intercambiado line_length y number_of_lines. Si necesitas marcas de corte, usa el paquete jlreq-trimmarks en lugar de una opción de clase; pasar tombow avisa con The option 'tombow' is not supported by jlreq class. Please use the jlreq-trimmarks package.

  • Longitud de línea — cuenta caracteres de ancho completo en el cuerpo, no solo dónde cae la puntuación.
  • Número de líneas — cuenta líneas de texto en una página ordinaria y en una con encabezado.
  • Márgenes — deja más en el lomo para un manuscrito encuadernado; evita un lomo excesivo si solo entregas PDF.
  • Papel — en la ruta DVI, mide el PDF terminado. Sin bxpapersize ni dvipdfmx -p sale en A4.
  • Motor — si upLaTeX y LuaLaTeX usan fuentes distintas, considera autoritativo solo el PDF de la ruta elegida.