jlreq

jlreq は、行間の値が規格の推奨から外れていることを組版中に指摘してくる、おそらく唯一の LaTeX ドキュメントクラスです。阿部紀行氏が 2017 年に公開したこのクラスは、W3C の技術文書「日本語組版処理の要件(JLReq / Requirements for Japanese Text Layout)」を LaTeX で実装しようという試みで、名前もそこから来ています。ソースの中には要件の条項番号を引いたコメントが 30 か所以上あり、jlreq_notes オプションを付ければ、その条項を添えた助言がログに出ます。このページでは、jlreq が js 系クラスと何を違えているのか、版面をどう数値で設計するのか、そして縦組みや括弧の位置といった日本語固有の指定をどう扱うのかを見ていきます。

JLReq とは何で、クラスはそれをどう実装しているか

JLReq は、日本語を正しく組むために何が必要かを W3C がまとめた技術文書です。日本工業規格 JIS X 4051(日本語文書の組版方法)を土台に、CSS や電子書籍のような技術が守るべき規則——行頭・行末に来てはいけない文字、和文と欧文のあいだの空き、注や見出しの扱い、版面の決め方——を条項番号つきで並べています。jlreq クラスのファイル冒頭には、実装が基づく版として 2020 年 8 月 11 日の W3C Note が明記されています。仕様書をひとつの文書クラスに翻訳した、というのが正確な言い方です。

実装の深さは、クラスが 自前の和文フォントメトリック(JFM) を持っていることによく表れています。jsclasses が JIS メトリックを借りるのに対し、jlreq は jlreq.tfmjlreqg-v.tfmjlreq-jidori.tfm といった専用の TFM と、LuaTeX-ja 用の jfm-jlreq.luajfm-jlreqv.lua を配布します。句読点や括弧まわりの空きは、クラスのマクロではなくメトリックの中で決まっている——つまり要件が組版エンジンのいちばん下の層に埋め込まれているわけです。pLaTeX・upLaTeX・LuaLaTeX のどれで処理されているかはクラスが自動判定し、ログに jlreq guessed engine: uplatex のように書き出します(XeLaTeX は対象外)。明示したいときは platexuplatexlualatex をクラスオプションに渡します。

jlreq と jsclasses の違い

一言でいえば、jsclasses は完成した体裁を渡し、jlreq は体裁を作る目盛りを渡します。 奥村晴彦氏の jsarticle は、よく練られた既定値をそのまま使う設計で、何も考えずに読める日本語文書が出ます。jlreq の発想は逆で、「本文は何ポイント、1 行は何字、1 ページは何行、行送りはいくつ、天・地・ノド・小口の余白はいくつ」を 自分で数値として与える ことを前提にしています。だから両者は競合していません。急いで論文を整った形で出したいなら jsclasses、判型と字詰めが先に決まっているなら jlreq、というのが素直な使い分けです。

もうひとつの違いは、規格に合わせるための細かい判断が明示的なオプションになっている ことです。たとえば narrow_kanjiskip を付けると、和文どうしの空き(kanjiskip)を jsarticle と同じ設定に戻せます。「jlreq に移したら字面の詰まり方が変わった」と感じたときの、いちばん短い答えがこのオプションです。既定の JFM は要件に沿った空きを取るので、jsclasses で組んだ原稿をそのまま jlreq に移すと、同じ字詰めでも行の見え方がわずかに変わります。移行するなら、まず 1 ページを比べてから本文にかかってください。

基本オプション — 文書の種類・用紙・文字サイズ

jlreq はクラスをひとつしか持ちません。文書の種類は角括弧のオプションで切り替えます——既定は article 相当、report を渡せば \chapter を持つ報告書、book を渡せば書籍になります。jsclasses のようにクラス名が分かれていない点に注意してください。縦組みにするには tate を足します。ほかに twocolumntwosidetitlepagelandscapedraftopenrightopenanydisablejfam といった、標準クラスでおなじみの綴りがそのまま使えます。

用紙は paper= で与えます。paper=a4paper=a5 のほか、paper={148mm,210mm} のように幅と高さを直接書けます。ここに一つ落とし穴があります。paper=b5 は ISO の B5(176×250 mm)であって、日本で B5 と呼ぶ JIS の 182×257 mm ではありません。 クラスはこれを黙って通さず、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. と警告します。同人誌や国内の入稿では、ほぼ確実に paper=b5j のほうが正解です。

文字サイズは欧文と和文を分けて考えます。fontsize= が欧文の基準サイズ(既定 10pt)、jafontsize= が和文サイズ、両者の比を直接与えるのが jafontscale=(既定は 1、つまり同寸)です。jlreq は出版で使う 級(Q)と歯(H) を寸法の単位として受け付けるので、fontsize=13Q のようにそのまま書けます(1 Q = 1 H = 0.25 mm)。日本語の原稿指定はほとんど級で来るので、換算せずに書き写せるのは実務上かなり効きます。

オプション意味既定
article / report / book文書の種類(章の有無・体裁)を切り替えるarticle 相当
tate縦組みにする横組み
platex / uplatex / lualatexエンジンを明示する。指定しなければクラスが判定しログに書く自動判定
paper=用紙。a4a5b5j(JIS B5)・{幅,高さ} など。b5 は ISO B5a4
fontsize= / jafontsize=欧文/和文の基準サイズ。pt のほか QH も使える10pt / 欧文と同寸
jlreq_notes要件から外れた設定について、条項番号つきの助言をログに出すoff

版面を数値で設計する

版面——本文を組む長方形の領域——は、内側から外側からか、どちらかの方向で決めます。内側からとは、1 行の長さ line_length=、1 ページの行数 number_of_lines=、行送り baselineskip= を与えて、余りが余白になるやり方。外側からとは、天 head_space=、地 foot_space=、ノド gutter=、小口 fore_edge=fore-edge= でも可)を与えて、残りが版面になるやり方です。入稿指定が「1 行 38 字、1 ページ 18 行」の形で来るなら内側から、「天 20 mm、ノド 18 mm」の形で来るなら外側から書けばよく、途中で混ぜる必要はありません。

寸法には専用の単位が使えます。zw は全角 1 文字分の幅、zh は全角 1 文字分の高さで、字詰めや行送りを「文字何個分」のまま書けます。line_length=40zw なら 1 行 40 字、baselineskip=1.75zw なら全角 1.75 文字分の行送りです。行送りは linegap= でも与えられ、こちらは「全角 1 文字+指定した空き」という数え方になります。何も指定しなければ、line_length は用紙の文字方向の 0.75 倍number_of_lines は行方向の 0.75 倍に収まる行数、baselineskip は和文サイズの 1.7 倍、段間 column_gap2zwhead_spacefoot_space を省くと版面は天地中央に置かれます。

オプション意味既定
line_length=1 行の長さ(字詰め)用紙の文字方向の 0.75 倍
number_of_lines=1 ページの行数行方向の 0.75 倍に収まる行数
baselineskip= / linegap=行送り。linegap= は「全角 1 文字+この空き」と数える和文サイズの 1.7 倍
gutter= / fore_edge=ノド(綴じ側)と小口(その反対側)の余白
head_space= / foot_space=天と地の余白省略時は天地中央
column_gap=2 段組のときの段間2zw

日本語固有の指定——括弧の位置・ぶら下げ・縦中横

ここが jlreq のいちばん特徴的な領域です。open_bracket_pos= は、行頭に始め括弧が来たときの置き方を決めます(JLReq 3.1.5)。値は zenkaku_tentsuki(既定)・zenkakunibu_nibunibu_tentsuki の三つで、括弧を全角のまま行頭に突き付けるか、二分(半角ぶん)詰めるかを選びます。hanging_punctuation を付けると、行末の句読点を版面の外へ ぶら下げる(3.8.2 注 1)組み方になります。どちらも Web や DTP では当たり前に議論される選択肢ですが、それをクラスオプション一語で切り替えられるのは jlreq くらいです。

本文の側にも日本語の道具が揃っています。縦組みの中に横倒しの数字を入れる \tatechuyoko、決めた字数の枠に文字を割り付ける \jidori、本文行の中に小さな二行注を入れる \warichu、傍注の \sidenote、後注の \endnote、和文の空きを一時的に広げる \akigumi。日付にも作法があり、\和暦 を宣言してから \today を書くと元号つきの日付になり、縦組みでは数字が漢数字で出ます。クラスは昭和・平成・令和の境(1989 年 1 月 8 日と 2019 年 5 月 1 日)を自分のコードに持っていて、改元のときの変更履歴にはそのまま「新元号」と記録されています。

縦組みの作例と、エンジンの選び方

次は A5 判の縦組みで、版面を内側から設計した例です。tate で縦組み、paper=a5 で判型、そして和文 13 級・1 行 40 字・1 ページ 17 行・行送り全角 1.75 文字分。本文に何も足さなくても、この一行で出版物の体裁が決まります。同じ \documentclass の行のまま、upLaTeX で処理すれば DVI を経由して、LuaLaTeX で処理すれば OS のフォントを使って直接 PDF が出ます。横組みにしたければ 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}

ここで、DVI 経由のときだけ起きる落とし穴があります。jlreq は用紙寸法を \special として DVI に書き出しません。 そのため paper=a5 と書いた原稿を upLaTeX で組んで dvipdfmx に渡すと、PDF は dvipdfmx の既定用紙(TeX Live の標準設定では A4)で出てきます。解決は二つ。\usepackage{bxpapersize} をプリアンブルに足すか、dvipdfmx -p a5 のように変換側で指定するかです。LuaLaTeX ならページ寸法が直接 PDF に書かれるので、この問題は起きません。

クラスに設計を検算させる(jlreq_notes)

クラスオプションに jlreq_notes を足すと、jlreq は与えられた数値を要件と突き合わせ、外れているものをログに書き出します。たとえば baselineskip=1.2zw で組むと、ログに「行間は二分以上全角以下が望ましい (2.4.2.d 注3)」という趣旨の行が JLReq の見出しつきで現れます。傍注の行長が短すぎるとき、縦組みで版面と柱の空きが足りないときにも、それぞれ該当する条項番号を添えて教えてくれます。組版そのものは止まりません——助言であって強制ではないからです。強制されるのは物理的に成立しない場合だけで、行送りが文字サイズより小さいと ! Class jlreq Error: The baselineskip is less than fontsize. で止まります。

\jlreqsetup で見出しと注を作り込む

版面の寸法はクラスオプションで決めますが、注・引用・箇条書き・見出しの 細部 は、プリアンブルで \jlreqsetup{...} にキー=値を並べて整えます。脚注・傍注・割注・後注の出し方、引用の字下げ(quote_indent=)、見出しの行取りなどがここに集まっています。見出しそのものを設計し直したいときは \NewBlockHeading\ModifyHeading を使います。この分業には理由があって、版面はページを開いた瞬間に効く寸法、\jlreqsetup は要素ごとの振る舞い、と役割が分かれているのです。全部をいきなり覚える必要はありません。まず \documentclass で判型・字詰め・行数を決め、必要になった分だけ \jlreqsetup に足していけば十分です。正確な一覧は texdoc jlreq で開ける付属マニュアル(阿部氏による日本語文書)にあります。

版面を決めたら 1 ページで検査する

jlreq の設定は強力なぶん、数値を間違えても PDF は出てしまいます。本文を書き進める前に、仮文 1 ページ分と見出し・脚注・引用・小さな図表を入れてビルドし、字詰め・行数・ノド・小口を実際に測ってください。とくに縦組みでは紙面上の「行の方向」と「字送りの方向」が横組みと入れ替わるので、line_lengthnumber_of_lines を取り違えていないかを最初に見ます。トンボが必要なら、クラスオプションではなく jlreq-trimmarks パッケージを使います。tombow を渡すと The option 'tombow' is not supported by jlreq class. Please use the jlreq-trimmarks package と警告が出ます。

  • 字詰め — 1 行の全角字数を本文で数える。句読点の位置だけで判断しない。
  • 行数 — 通常のページと、見出しのあるページの両方で本文行を数える。
  • 余白 — 綴じる原稿ではノド側を広くし、PDF 提出だけなら過剰な綴じ代を避ける。
  • 用紙 — DVI 経由なら PDF の実寸を測る。bxpapersizedvipdfmx -p を忘れると A4 で出る。
  • エンジン — upLaTeX と LuaLaTeX でフォントが変わるなら、採用する経路の PDF だけを正とする。