基于 js 的类

排日文论文或书籍时,通常不用标准的 articlebook,而是使用 js 系 class。起点是奥村晴彦的 jsclassesjsarticle 等),它是 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 和纪要用的 kiyoujsreport 相对较新,是把过去用 jsbookreport 选项代替的用途独立成一个 class。

与标准 class 最大的区别是,正文以 10.5 pt(约 13 Q) 为基准设计,并使用 JIS 字体度量(jis.tfmjisg.tfm,由东京书籍印刷的小林肇制作)排日文。这样全角字宽和行距会调整到适合日文排版的状态。class 原样继承标准 class 的接口,包括 \section 等命令,以及纸张、栏数、单双面的选项;因此只要了解标准 class,就能马上使用(参见 Standard classes)。

在 upLaTeX 中使用时,要给 class 选项加上 uplatex(源于田中琢爾的 upLaTeX 支持补丁)。由于编译路线会经过 DVI,通常还会同时指定 dvipdfmx 作为 PDF 驱动。

latex
\documentclass[uplatex,dvipdfmx]{jsarticle}
\begin{document}
こんにちは、\LaTeX! これは jsarticle で組んだ日本語の文書です。
\end{document}

主要 class 选项继承自标准 class,包括 a4paper(默认)、b5paper 等纸张,twocolumntwosidelandscapetitlepagedraft;在 jsbook / jsreport 中,还可用 openright / openleft / openany 决定章从哪里开始。此外还有 mingoth 用来把日文 TFM 恢复为旧的 min10 / goth10,以及 disablejfam 用来避免把日文字体注册为数学字体。

字号与放大率(nomag)

jsclasses 提供的字号选项比标准 class 更丰富。除了常见的 10pt / 11pt / 12pt,还加入按等比数列选择的 8pt9pt14pt17pt21pt25pt30pt36pt43pt,以及以 Q 为单位的 12Q / 14Q10ptj 系的实际尺寸选项。

实现这一点的机制有一段历史背景。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 项目维护。它提供 ltjsarticleltjsbookltjsreport(另有 ltjspfltjskiyou),正如名称所示,与 jsclasses 一一对应。日文使用 luatexja 的标准度量(jfm-ujis.lua),并且不经过 DVI,直接输出 PDF。

与 jsclasses 的主要区别在于缩放处理。由于 LuaTeX 从 beta-0.87.0 起无法在 PDF 输出时使用 \mag,ltjsclasses 不采用 \mag 方式,而是 默认使用 nomag*(指定 usemag 会出现警告)。uplatexautodetect-engine 选项也因不再需要而被移除,指定它们会报错。替换日文字体时,配合 luatexja-fontspec 使用。

latex
% lualatex でコンパイル
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont{Noto Serif CJK JP}   % 明朝
\begin{document}
こんにちは、\LaTeX! ltjsclasses は LuaLaTeX 専用です。
\end{document}

BXjscls — 可在任意引擎上运行

BXjscls(八登崇之,通称 ZR)把 jsclasses 的设计 扩展到可在任意引擎使用。它提供 bxjsarticlebxjsbookbxjsreportbxjsslide;jsclasses 只面向 (u)pLaTeX,而 BXjscls 还可以在 pdfLaTeX、XeLaTeX、LuaLaTeX 下排日文。

关键是 engine= 选项。把它设为 pdflatexxelatexlualatexplatexuplatex 之一(或用 autodetect-engine 自动判定),class 就会为该处理系加载合适的日文包。随后用 ja=(ja driver,旧称 jadriver)选择日文处理方式;默认的 standard 不需要额外设置就能直接写日文(其他还有 minimalmodernpandoc)。

engine=加载的主要日文包(ja=standard)
platex / uplatex直接使用 (u)pLaTeX 本身的日文功能
lualatexluatexja(LuaTeX-ja)
xelatexzxjatype(基于 xeCJK)
pdflatexbxcjkjatype(基于 CJK)

正文基准字号可用 base= 指定,日文基准用 jbase= 指定;日文缩放比由 \jsScale 保存(默认 0.924715,可通过 scale= 选项修改)。\mag 周边的缩放方式用 magstyle= 选择,可取 usemagnomagnomag*。由于 LuaTeX v0.87 以后无法使用 \mag,在该环境中会自动表现为相当于 nomag*

latex
% 同じ原稿を 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 就是 uplatexdvipdfmx,LuaLaTeX 就是 ltjsarticle 加字体设置,多引擎分发则是 BXjscls 的 engine=。在项目 README 或构建设置中也写同样的名称,避免共同作者或 CI 走另一条路线编译而弄坏版面。

latex
% upLaTeX で提出する日本語レポートの固定例
\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle}

% LuaLaTeX へ移すなら、クラスとフォント設定をセットで見直す
% \documentclass[a4paper]{ltjsarticle}
% \usepackage{luatexja-fontspec}

nomagmagstyle 这类缩放方式选项不仅影响外观,也会影响后续工具如何解释尺寸。通常从 class 默认值开始,只有当图像配置、geometry 或 PDF 后处理出现实际尺寸不一致时,再对照手册考虑 nomag*magstyle=nomag*。比起一开始就堆满所有选项,更应优先保证提交物可复现。

在日志中确认处理路线

使用 js 系 class 时,只看源文件第一行可能会误判实际处理路线。jsarticle 用于 (u)pLaTeX,ltjsarticle 用于 LuaLaTeX,bxjsarticle 则遵循 engine= 的指定;因此构建后应在 .log 开头确认 class 名、引擎名以及加载的日文包。共同写作时,重要的不是单纯“生成了 PDF”,而是确认“通过指定路线生成了 PDF”。

选择日志中检查什么若不一致
jsarticlepLaTeX / upLaTeXdvipdfmx 路线将构建配方固定为 uplatex + dvipdfmx
ltjsarticleLuaLaTeX 与 LuaTeX-ja不要在保留 class 的同时只把引擎切回去
bxjsarticleengine=ja= 的实际值与 README 和 CI 命令中的值保持一致