jsarticle に「10 ポイント」と指定した和文は、実測すると 9.25 ポイントほどしかありません。これは不具合ではなく設計です。奥村晴彦氏の jsclasses(jsarticle・jsbook)は、欧文の 10 ポイントではなく日本語の印刷が使う 13 級(3.25 mm) を基準に本文を組み立てているからです。js 系クラスは LaTeX 標準クラスの操作感をそのまま残し、和文フォントメトリック・文字サイズの刻み・拡大の仕掛けだけを入れ替えたもので、その系譜に LuaLaTeX 用の ltjsclasses、どのエンジンでも通る BXjscls が続きます。このページでは三系統がそれぞれ何を解いたのか、そしてどれを選ぶのかを見ていきます。
jsclasses が標準クラスから変えた二つのこと
jsclasses 付属のマニュアルが「標準のドキュメントクラスとの違い」として挙げているのは、和文フォントメトリックとサイズオプションの扱いの二点だけです。余白や行間の思想を書き換えたのではなく、日本語を組むときに実際に壊れていた場所を二つ直した——それが jsclasses の出発点です。ひとつ目は、和文 TFM に従来の min10・goth10 ではなく、東京書籍印刷の 小林肇 氏が作った JIS フォントメトリック jis.tfm・jisg.tfm を使うこと。ふたつ目は、標準クラスが 10pt・11pt・12pt の三段しか持たず、しかもマニュアルの言葉を借りれば「標準の 10 ポイント以外では多少フォントのバランスが崩れる」状態だったサイズ指定を、作り直したことです。
この二点はじつは同じ根から出ています。日本語の印刷では文字の大きさを 級(Q、1 級 = 0.25 mm) で数え、本文は 13 級=3.25 mm が定番です。ところが JIS フォントメトリックの全角は素のままだと 13.527 級あるので、jsclasses は和文フォントを 0.961 倍(= 13 ÷ 13.527)して全角をちょうど 13 級に合わせます。マニュアルはこの計算を明示していて、9.62216 pt のメトリックを 0.961 倍した結果が「公称 10 ポイントといっても実は 9 ポイント強」だと書いています。この比率は実数マクロ \Cjascale に入っていて、jsarticle・jsbook・jsreport では 0.924690(= 9.62216 pt × 0.961 ÷ 10 pt)。2018 年以降の OTF パッケージはこの値を読んで和文の大きさを合わせます。
% upLaTeX: the dvipdfmx option is a global option for graphicx/hyperref
\documentclass[uplatex,dvipdfmx,a4paper,papersize]{jsarticle}
\begin{document}
こんにちは、\LaTeX!
\end{document}クラスの顔ぶれは jsarticle(論文・レポート)、jsbook(書籍)、jsreport(レポート)の三つで、ほかに学会誌用の jspf、紀要用の kiyou が同梱されています。jsreport は 2017 年 2 月に、jsbook の report オプションで代用していたものを掲示板の議論を機に独立させたクラスです。元は LaTeX3 Project の classes.dtx と 株式会社アスキーの jclasses.dtx を土台に奥村氏が書いたもので、2009 年に 田中琢爾 氏による upLaTeX 対応パッチが取り込まれ、2016 年 7 月から 日本語 TeX 開発コミュニティ(GitHub の texjporg/jsclasses)が保守しています。TeX Live に最初から入っているので、追加インストールは要りません。
| オプション | 効果 |
|---|---|
a4paper / b5j / a4var | 用紙。ISO の a4paper・b5paper に加え、JIS B 系の b4j・b5j、変形判の a4var(210×283 mm)・b5var(182×230 mm)。既定は a4paper |
papersize | DVI に用紙寸法の \special を書き出す。DVI 経由で PDF にするなら実質必須 |
tombow / tombo / mentuke | トンボ(裁ち落とし用の位置合わせ罫)を付ける。用紙の四方に 1 インチずつ余分な地が付き、tombow はジョブ名と処理した日時も刷り込む |
mingoth / jis | mingoth は和文 TFM を旧来の min10・goth10 に戻す。jis は pLaTeX でも JIS メトリックを明示的に選ぶ |
disablejfam | 和文フォントを数式ファミリとして登録しない。数式ファミリを使い切ってしまう文書で効く |
openright / openleft / openany | jsbook・jsreport で章を起こすページを決める。openleft は左起こし |
\mag と nomag — 文字サイズはどう作られているか
jsclasses は本文を 10 ポイントで組んでから、TeX のプリミティブ \mag で文書全体を拡大・縮小して指定サイズに合わせます(11pt なら 1.095 倍、12pt なら 1.200 倍)。だから標準クラスにない 8pt・9pt・14pt・17pt・20pt・21pt・25pt・30pt・36pt・43pt という等比数列のサイズや、級で指定する 12Q・14Q、実寸の 10ptj・10.5ptj・11ptj・12ptj まで用意できます。\mag は紙も文字も罫線も一律に引き伸ばすので発想としては強力ですが、値を理解しないツールがあり、dvipdfmx や dvips の扱いにも依存するのが弱点でした。
| オプション | 挙動 |
|---|---|
usemag | \mag で文書全体を拡大する従来方式。jsclasses の 既定(2016 年 7 月 8 日以前は唯一の方式) |
nomag | 2016 年 7 月 8 日に追加。\mag を使わず、レイアウトの各種寸法のほうをスケールする |
nomag* | 2016 年 7 月 24 日に追加。nomag に加え、NFSS にパッチを当ててオプティカルサイズも調整する |
実務では、既定の usemag から始めて構いません。geometry や画像の配置、PDF の後処理で寸法が合わないときに nomag* を試す、という順序が安全です。最初から全オプションを盛るより、提出物が同じ手順で同じ PDF になることを優先してください。なお \mag を使う文書は、DVI を経由するツールに「拡大率つき」であることを伝える必要があるので、共同執筆では拡大方式もビルド手順とセットで決めておくと事故が減ります。
jsarticle は pLaTeX と upLaTeX のどちらで通るのか
どちらでも通ります。クラスが自分で判定します。 \documentclass{jsarticle} とだけ書いて upLaTeX で処理すると、ログに Class jsarticle Info: Autodetected engine: upLaTeX と出て、和文の内部エンコーディングが JY2/JT2 に切り替わります。pLaTeX なら Autodetected engine: pLaTeX です。それでもクラスオプションに uplatex(または platex・autodetect-engine)を書くのは、意図を原稿に残すためと、判定が食い違ったときに黙って別の体裁で通るのを防ぐためです。指定と実際の処理系がずれると、クラスは通しません——! Class jsarticle Error: Option 'platex' is specified but you are running upLaTeX. のように、はっきり止まります。
一方 dvipdfmx はクラスのオプションではありません。jsclasses が解釈しない指定はグローバルオプションとして後続のパッケージに配られ、graphicx・color・hyperref がそれを見てドライバを選びます。だから \documentclass の角括弧に一度書けば、各パッケージに書き分ける必要がなくなる——これが [uplatex,dvipdfmx] という定型の正体です。
A5 で組んだのに PDF が A4 で出てくる
a5paper を書いたのに PDF が A4 になるなら、原因はクラスではなく DVI に用紙寸法が書かれていない ことです。TeX Live 2024 で \documentclass[uplatex,a5paper]{jsarticle} を組んで dvipdfmx に渡すと、出てくる PDF は 595.28 × 841.89 pt、つまり A4 です。DVI 自体には紙の大きさという概念がないので、dvipdfmx は自分の既定値を使います。クラスオプションに papersize を足すと \special{papersize=...} が書き出され、同じ原稿が 419.53 × 595.28 pt の A5 で出ます。tombow を併用した場合はトンボの分だけ大きくなり、A5 なら四方に 1 インチずつ足した 563.53 × 739.28 pt になります。LuaLaTeX(次節の ltjsclasses)は PDF を直接書くのでこの問題が起きません。
ltjsclasses — LuaLaTeX へ移した jsclasses
ltjsclasses は jsclasses を LuaLaTeX(LuaTeX-ja) 用に書き換えたクラス集で、LuaTeX-ja プロジェクトが保守しています。ltjsarticle・ltjsbook・ltjsreport(ほかに ltjspf・ltjskiyou)と、名前のとおり一対一に対応します。ここで一番大きな違いは拡大方式です。LuaTeX の公式マニュアルは「\mag は DVI 出力モードでのみサポートされる」と明記しており、PDF を直接出す LuaLaTeX では使えません。そのため ltjsclasses は nomag* を既定にしていて、usemag を指定すると This ltjsarticle cls does not support 'usemag' option, since LuaTeX does not support \mag in pdf output と警告して nomag* に戻します。
エンジン関連のオプションの扱いも変わります。uplatex を渡すと エラー(this class does not support 'uplatex' option)になり、autodetect-engine は 警告 だけで無視されます。処理系が一つしかないのだから当然の設計です。和文メトリックは LuaTeX-ja の標準である jfm-ujis.lua が既定で、ptexjis オプションを付ければ jsclasses と同じ JIS メトリック(jfm-jis.lua)に、mingoth なら旧来の jfm-min.lua に切り替わります。フォントを差し替えるときは luatexja-fontspec を併用し、OS にインストールされた OpenType フォントをそのまま名前で指定できます。
% 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 — 同じ原稿をどのエンジンでも通す
BXjscls(八登崇之氏、通称 ZR)は jsclasses の設計をどのエンジンでも使えるように広げたクラス集で、bxjsarticle・bxjsbook・bxjsreport・bxjsslide を提供します。ここで最初につまずくのがエンジンの指定方法です。エンジンは engine= ではなく、素のクラスオプションとして書きます——lualatex・xelatex・pdflatex・platex・uplatex・latex・platex-ng、あるいは自動判定の autodetect-engine のいずれかです。engine=lualatex と書くと、指定は届かず ! 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}二つ目のキーが ja=(旧称 jadriver)で、日本語処理の方式を standard・minimal・modern・pandoc から選びます。ここが実際の落とし穴です。ja= を省くと、(u)pLaTeX のときだけ standard が補われ、それ以外のエンジンでは The option 'ja' is MISSING!! So 'ja=minimal' is assumed as fallback, but such implicit setting is now DEPRECATED! という警告つきで minimal になります。逆に ja= を書いた場合は、エンジンオプションの明示が 必須 になります。つまり実務では、ja= とエンジンを常に二つセットで書くのが唯一の安全な形です。ja=standard を選ぶと、エンジンごとに適切な日本語パッケージが読み込まれます。
| エンジンオプション | ja=standard で読み込まれる日本語処理 |
|---|---|
platex / uplatex | (u)pLaTeX 本体の日本語機能をそのまま使う。フォント差し替えは pxchfon |
lualatex | luatexja。フォント指定は luatexja-fontspec / luatexja-preset |
xelatex | zxjatype(xeCJK の上に載る)。フォントは zxjafont |
pdflatex / latex | bxcjkjatype(CJK パッケージの上に載る)。もっとも制約が多い経路 |
寸法まわりの語彙は jsclasses と jlreq の両方に寄せてあります。欧文の基準サイズは base=(別名 fontsize=)、和文は jbase=(別名 jafontsize=)、和文スケール比は scale=(別名 jafontscale=)で、比の既定値は \jsScale = 0.924715(\Cjascale も同じ値を指します)。版面は textwidth= / number-of-lines= のほか、jlreq と同じ綴りの line_length= / number_of_lines= でも書けます。拡大方式は magstyle= で usemag・nomag・nomag* を選べますが、LuaTeX v0.87 以降と pTeX-ng では既定が nomag* に切り替わり、magstyle=usemag を指定すると ! Class bxjsarticle Error: The engine does not support 'magstyle=usemag' と止まります。
jsclasses・ltjsclasses・BXjscls のどれを選ぶか
先にエンジンを決め、それに合うクラスを選ぶ のが順序です。同じ「jsarticle 風の体裁」でも、処理系が変わればクラス名が変わります。逆にクラスだけ差し替えてエンジンを据え置くと、日本語処理そのものが失われて崩れます。
- pLaTeX/upLaTeX を使うなら jsclasses。 既存資産や投稿規定で処理系が決まっている場合の定番。
\documentclass[uplatex,dvipdfmx,papersize]{jsarticle}を出発点にする。 - LuaLaTeX 中心なら ltjsclasses。 OS の OpenType フォントをそのまま使え、PDF が直接出る。
nomag*が既定で、用紙寸法の取りこぼしも起きない。 - エンジンを固定したくない/配布物にするなら BXjscls。 エンジン名と
ja=を二つ書き換えるだけで、pdfLaTeX・XeLaTeX・LuaLaTeX・(u)pLaTeX を行き来できる。 - 版面の寸法を数値で指定したいなら jlreq。 js 系とは別系統で、字詰め・行数・余白を規格に基づいて設計できる。
ログで経路を確かめる
js 系はエンジンとクラスが対で決まるので、.log の冒頭を見れば「意図した経路で組まれたか」がわかります。共同執筆や CI では、PDF が出たことではなく 指定した経路で PDF が出たこと を確認してください。ビルドコマンド、\documentclass の行、README の記述が三つとも同じ名前を指しているのが理想です。
| クラス | ログで確かめること |
|---|---|
jsarticle | Autodetected engine: の行が pLaTeX か upLaTeX か。papersize を付けたなら PDF の用紙寸法も測る |
ltjsarticle | luatexja が読まれているか、フォント設定が効いているか。usemag の警告が出ていないか |
bxjsarticle | エンジンオプションと ja= が両方書かれているか。ja の欠落警告が出ていたら書き足す |