排日文论文或书籍时,通常不用标准的 article、book,而是使用 js 系 class。起点是奥村晴彦的 jsclasses(jsarticle 等),它是 pLaTeX/upLaTeX 的事实标准。面向 LuaLaTeX 的移植是 ltjsclasses,而 ZR 的 BXjscls 更进一步,让同一份源文件可在任意引擎上编译。它们都保留标准 class 的操作感,同时调整日文字距和行网格。本页介绍这三个系谱的区别和选择方法。
jsclasses — pLaTeX/upLaTeX 的标准选择
jsclasses 是 奥村晴彦 基于 LaTeX3 的 classes.dtx 和 ASCII Corporation 的 jclasses.dtx 创建的一组 class,现在由 Japanese TeX Development Community 在 GitHub(texjporg/jsclasses)维护。它提供三个 class:jsarticle(论文和报告)、jsbook(书籍)、jsreport(报告),另有学会期刊用的 jspf 和纪要用的 kiyou。jsreport 相对较新,是把过去用 jsbook 的 report 选项代替的用途独立成一个 class。
与标准 class 最大的区别是,正文以 10.5 pt(约 13 Q) 为基准设计,并使用 JIS 字体度量(jis.tfm、jisg.tfm,由东京书籍印刷的小林肇制作)排日文。这样全角字宽和行距会调整到适合日文排版的状态。class 原样继承标准 class 的接口,包括 \section 等命令,以及纸张、栏数、单双面的选项;因此只要了解标准 class,就能马上使用(参见 Standard classes)。
在 upLaTeX 中使用时,要给 class 选项加上 uplatex(源于田中琢爾的 upLaTeX 支持补丁)。由于编译路线会经过 DVI,通常还会同时指定 dvipdfmx 作为 PDF 驱动。
\documentclass[uplatex,dvipdfmx]{jsarticle}
\begin{document}
こんにちは、\LaTeX! これは jsarticle で組んだ日本語の文書です。
\end{document}主要 class 选项继承自标准 class,包括 a4paper(默认)、b5paper 等纸张,twocolumn、twoside、landscape、titlepage、draft;在 jsbook / jsreport 中,还可用 openright / openleft / openany 决定章从哪里开始。此外还有 mingoth 用来把日文 TFM 恢复为旧的 min10 / goth10,以及 disablejfam 用来避免把日文字体注册为数学字体。
字号与放大率(nomag)
jsclasses 提供的字号选项比标准 class 更丰富。除了常见的 10pt / 11pt / 12pt,还加入按等比数列选择的 8pt、9pt、14pt、17pt、21pt、25pt、30pt、36pt、43pt,以及以 Q 为单位的 12Q / 14Q 和 10ptj 系的实际尺寸选项。
实现这一点的机制有一段历史背景。jsclasses 原本先以 10pt 排正文,然后用 TeX 的 \mag primitive 整体放大或缩小结果,以匹配指定字号(10pt 为 1 倍,11pt 约为 1.095 倍,依此类推)。\mag 会给整个文档施加统一缩放,方便之处是字形和尺寸会一起放大;脆弱之处是有些工具不理解 \mag,结果还依赖后续 dvipdfmx / dvips 如何处理。
因此,2016 年加入了不使用 \mag、而是 直接缩放各类尺寸 的 nomag 选项。配套的 nomag* 更进一步,通过给字体选择系统 NFSS 打补丁,同时调整 optical size。若要恢复过去基于 \mag 的行为,则使用 usemag。
| 选项 | 行为 |
|---|---|
usemag | 旧方式:用 \mag 整体缩放。jsclasses 的 默认值 |
nomag | 不用 \mag,改为缩放版式中的各种尺寸 |
nomag* | 在 nomag 基础上,给 NFSS 打补丁并调整 optical size |
jsclasses 默认使用 usemag,但如果想避开 \mag 带来的微妙问题,选择 nomag* 会更稳妥。日文字号与指定字号的比值(1 zw ÷ 请求尺寸)保存在实数宏 \Cjascale 中(默认 0.924715),对应 13Q ≈ 10.5pt 这一设计值。
ltjsclasses — LuaLaTeX 移植版
ltjsclasses 是把 jsclasses 改造为 LuaLaTeX(luatexja) 使用的一组 class,由 LuaTeX-ja 项目维护。它提供 ltjsarticle、ltjsbook、ltjsreport(另有 ltjspf、ltjskiyou),正如名称所示,与 jsclasses 一一对应。日文使用 luatexja 的标准度量(jfm-ujis.lua),并且不经过 DVI,直接输出 PDF。
与 jsclasses 的主要区别在于缩放处理。由于 LuaTeX 从 beta-0.87.0 起无法在 PDF 输出时使用 \mag,ltjsclasses 不采用 \mag 方式,而是 默认使用 nomag*(指定 usemag 会出现警告)。uplatex 和 autodetect-engine 选项也因不再需要而被移除,指定它们会报错。替换日文字体时,配合 luatexja-fontspec 使用。
% lualatex でコンパイル
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont{Noto Serif CJK JP} % 明朝
\begin{document}
こんにちは、\LaTeX! ltjsclasses は LuaLaTeX 専用です。
\end{document}BXjscls — 可在任意引擎上运行
BXjscls(八登崇之,通称 ZR)把 jsclasses 的设计 扩展到可在任意引擎使用。它提供 bxjsarticle、bxjsbook、bxjsreport、bxjsslide;jsclasses 只面向 (u)pLaTeX,而 BXjscls 还可以在 pdfLaTeX、XeLaTeX、LuaLaTeX 下排日文。
关键是 engine= 选项。把它设为 pdflatex、xelatex、lualatex、platex、uplatex 之一(或用 autodetect-engine 自动判定),class 就会为该处理系加载合适的日文包。随后用 ja=(ja driver,旧称 jadriver)选择日文处理方式;默认的 standard 不需要额外设置就能直接写日文(其他还有 minimal、modern、pandoc)。
| engine= | 加载的主要日文包(ja=standard) |
|---|---|
platex / uplatex | 直接使用 (u)pLaTeX 本身的日文功能 |
lualatex | luatexja(LuaTeX-ja) |
xelatex | zxjatype(基于 xeCJK) |
pdflatex | bxcjkjatype(基于 CJK) |
正文基准字号可用 base= 指定,日文基准用 jbase= 指定;日文缩放比由 \jsScale 保存(默认 0.924715,可通过 scale= 选项修改)。\mag 周边的缩放方式用 magstyle= 选择,可取 usemag、nomag、nomag*。由于 LuaTeX v0.87 以后无法使用 \mag,在该环境中会自动表现为相当于 nomag*。
% 同じ原稿を engine= だけ変えれば各エンジンで通る
\documentclass[engine=lualatex,ja=standard]{bxjsarticle}
\begin{document}
こんにちは、\LaTeX! engine= を platex に変えれば pLaTeX でも組めます。
\end{document}该选哪一个
在 js 系中,合理的顺序是 先决定引擎,再选择与之匹配的 class。即使想要同样的“jsarticle 风格”体裁,所用 class 也会随引擎而变。
- 使用 pLaTeX/upLaTeX(既有资产、学会指定等)时用 jsclasses。 在 upLaTeX 中,
\documentclass[uplatex,dvipdfmx]{jsarticle}是标准写法。 - 以 LuaLaTeX 为中心时用 ltjsclasses。 可使用系统 OpenType 字体,直接输出 PDF;
nomag*是默认值。 - 不想固定引擎,或要跨引擎分发时用 BXjscls。 只切换
engine=就能在 pdfLaTeX、XeLaTeX、LuaLaTeX、(u)pLaTeX 之间移动。 - 想要简洁、符合 JLReq 的 class?jlreq 也值得考虑(与 js 系不同谱系,自动判定引擎)。
无论选择哪一个,它们都是在标准 class 的命令体系上叠加日文排版规则,因此正文的写法本身不会改变。关于如何组织导言区和选项,也请参见“Document class & preamble”。
落实到提交模板
日文文档中,不要一选好 class 就立刻开始写正文。先把“引擎、class、PDF 生成路线”作为一组固定下来。upLaTeX 就是 uplatex 加 dvipdfmx,LuaLaTeX 就是 ltjsarticle 加字体设置,多引擎分发则是 BXjscls 的 engine=。在项目 README 或构建设置中也写同样的名称,避免共同作者或 CI 走另一条路线编译而弄坏版面。
% upLaTeX で提出する日本語レポートの固定例
\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle}
% LuaLaTeX へ移すなら、クラスとフォント設定をセットで見直す
% \documentclass[a4paper]{ltjsarticle}
% \usepackage{luatexja-fontspec}nomag、magstyle 这类缩放方式选项不仅影响外观,也会影响后续工具如何解释尺寸。通常从 class 默认值开始,只有当图像配置、geometry 或 PDF 后处理出现实际尺寸不一致时,再对照手册考虑 nomag* 或 magstyle=nomag*。比起一开始就堆满所有选项,更应优先保证提交物可复现。
在日志中确认处理路线
使用 js 系 class 时,只看源文件第一行可能会误判实际处理路线。jsarticle 用于 (u)pLaTeX,ltjsarticle 用于 LuaLaTeX,bxjsarticle 则遵循 engine= 的指定;因此构建后应在 .log 开头确认 class 名、引擎名以及加载的日文包。共同写作时,重要的不是单纯“生成了 PDF”,而是确认“通过指定路线生成了 PDF”。
| 选择 | 日志中检查什么 | 若不一致 |
|---|---|---|
jsarticle | pLaTeX / upLaTeX 与 dvipdfmx 路线 | 将构建配方固定为 uplatex + dvipdfmx |
ltjsarticle | LuaLaTeX 与 LuaTeX-ja | 不要在保留 class 的同时只把引擎切回去 |
bxjsarticle | engine= 与 ja= 的实际值 | 与 README 和 CI 命令中的值保持一致 |