pTeX 系列

pTeX 系列 是专为日语排版而构建的 TeX 引擎的谱系。它从 ASCII Corporation 的 pTeX 开始,继续通过 Unicode 感知 upTeX、e-TeX 合并 e-pTeX / e-upTeX 和现代化 pTeX-ng。这条线承载了面向欧洲的pdfTeX无法完成的工作:竖写、避头换行、日文字体度量。

一行大图:标准的现代日本管道是 uplatex(内部的 e-upTeX 引擎)→ dvipdfmx → PDF。普通的 pTeX / upTeX / e-upTeX 路由发出 DVI,而不是 PDF — 与 pdfTeX 和 LuaTeX 的决定性区别,后者直接发出 PDF。下面依次介绍四个引擎。

pTeX (ASCII pTeX)

pTeX(出版 TeX,也称为“ASCII pTeX”)是 ASCII Corporation 构建的引擎,旨在使日语 TeX 适合商业出版。 Plain TeX 旨在一次设置一个字节的欧洲字形,完全缺乏日语排版规则。 pTeX 将日语直接设置到 TeX 的内部结构所需的低级机制编织在一起。

它的核心是写作方向的概念。 pTeX 在引擎级别处理 垂直书写 (\tate)水平书写 (\yoko),因此可以以任何一种方式设置相同的正文文本。这对于日本出版业(小说、报纸、教科书)来说是不可或缺的,垂直设置是其中的常态。

日文间距和线条构成的基础是 JFM(日文字体规格)。与欧洲 TFM 不同,它记录日语字形的宽度、高度和深度以及字符之间的间距(胶水/字距)。有了它,pTeX 自动区分全角和半角形式,在标点符号周围插入正确的间隙,并在两个脚本相遇的地方提供日语和西方文本之间的空格(四分之一em间隙)。

pTeX还在引擎内部执行日语避头(禁止换行):不能以行开头(、。」…)或行结尾(「(…)」的字符通过对间距的微调而向前或向后推。 Ruby(阅读注释)本身是宏和包的工作,但它所依赖的精确字符位置是由 pTeX 提供的。欧洲 pdfTeX 中不存在这些规则,这正是需要专用引擎的原因。

pTeX 的弱点是字符编码。其内部代码为 EUC-JPShift_JIS(通过 -kanji-internal 选择),并输入假定的旧编码 — JIS、Shift_JIS、EUC。它可以处理的汉字基本上绑定在 JIS 范围内,因此 JIS 和多语言 CJK 之外的字符很尴尬。将 LaTeX 置于 pTeX 引擎之上的格式是 platex (pLaTeX),这是日本论文的长期标准。

upTeX (Unicode pTeX)

upTeX (Unicode pTeX) 是 Takuji Tanaka 自 2007 年以来开发的引擎,在内部围绕 Unicode 重铸了 pTeX。它的输入、输出和内部处理都建立在 UTF-8 / Unicode 之上,使其摆脱了 pTeX 最头疼的编码限制。

因此,它可以处理比 JIS 框更广泛的汉字,并且可以一次设置多个 CJK 脚本 - 不仅是日语,还有中文(简体和繁体)和韩语(韩文)。 upTeX 通过 \kcatcode 按种类(汉字、假名、韩文、CJK 符号等)对字符进行分类,从而可以精细控制被视为日语文本的范围。

实际上,这种免于编码麻烦是决定性的。将 LaTeX 放在 upTeX 上的格式是 uplatex (upLaTeX),许多现代日本作品已从 pLaTeX 转移到它。与 pTeX 的兼容性很高,因此大多数 pLaTeX 时代的资产几乎保持不变。

e-pTeX / e-upTeX

e-pTeX 是 pTeX 与 e-TeX 扩展合并; e-upTeX 是 upTeX 与它们合并(e-upTeX 于 2008 年推出)。 e-TeX 是一个扩展的 TeX 实现,它添加了 \numexpr\protected 等算术、双向排版的基础和更大的寄存器池。许多现代 LaTeX 软件包都采用这些 e-TeX 功能,因此该扩展在日语设置中也是必不可少的。

这是最重要的实践点。历史上,platex 在 e-pTeX 上运行,uplatex 在 e-upTeX 上运行,但自 TeX Live 2023 起,pLaTeX 已转移到基于 e-upTeX 的设置,同时保留兼容性。因此,当您今天说 pLaTeX 或 upLaTeX 时,实际基础并不是纯粹的 pTeX/upTeX,而是 e-TeX 扩展、支持 Unicode 的引擎。

今天的维护由日本 TeX 开发社区 (texjporg) 进行,该社区使 pTeX 系列引擎、格式和 JFM 保持持续修复。

一个最小的 upLaTeX 示例

这是 upLaTeX 的最小日语文档。 \documentclass{ujarticle} 是 upLaTeX 的水平书写类(使用 utarticle 进行垂直书写;jlreq 类是一个强大的现代选择)。将源保存为 UTF-8。

latex
\documentclass{ujarticle}
\begin{document}
こんにちは、\LaTeX。日本語が美しく組めます。
数式も書けます: \[ E = mc^2 \]
\end{document}

编译需要两个阶段。首先uplatex.tex处理成DVI;然后 dvipdfmx 将 DVI 转换为 PDF。 pTeX 系列不会直接发出 PDF,因此始终需要此 dvipdfmx 步骤(并且 uplatex 通常运行两次,以便进行交叉引用和目录解析)。

terminal
$ uplatex document.tex
$ dvipdfmx document.dvi
# => document.pdf

pTeX-ng(新一代/亚洲pTeX)

pTeX-ng(“ng”=新一代)是 Clerk Ma 相对较新的重新实现工作,也以其命令名称 ApTeX(亚洲语 pTeX)而闻名。它的目标是实现 pTeX 谱系的现代化,支持所有 e-TeX、pTeX 和 upTeX 原语,以保持 与 e-upTeX 高度兼容,同时将其内部扩展至 Unicode(最高 0x10FFFF)。

技术上突出的是直接 PDF 输出。 pTeX-ng嵌入libdpx(dvipdfmx的库形式)作为其输出后端,通过直接调用libdpx的C函数来执行分页和字符输出,因此它可以生成PDF而无需单独运行dvipdfmx。也就是说,pTeX-ng 比 e-upTeX 更具实验性,但部署范围较小。对于日常日语排版,默认值仍然是 e-upTeX (uplatex)。

发动机比较

通过内部编码将四个引擎排列起来,无论它们是否包含 e-TeX 扩展,以及每个引擎上运行的格式:

引擎内部编码e-TeX默认格式
pTeXEUC / Shift_JISpLaTeX(旧版)
upTeXUnicode (UTF-8)upLaTeX(旧版)
e-pTeXEUC / Shift_JIS是的pLaTeX(较旧的运行时基础)
e-upTeXUnicode (UTF-8)是的upLaTeX(当前)和 pLaTeX 兼容性运行时
pTeX-ng / ApTeXUnicode(至 0x10FFFF)是的e-upTeX 兼容

在当前的 TeX Live 日志中,甚至 platex 也可能以 This is e-upTeX ... 等横幅开头。这并不意味着 pLaTeX 已经消失了;这意味着单个 e-upTeX 运行时用于运行 pLaTeX 兼容行为或 upLaTeX 格式。报告问题时,请包含命令名称 (platex / uplatex)、日志中的第一个标题行以及源文件编码。

它在日本航线中的位置

今天的日语有 3 条广泛的路线: pTeX 家族uplatexdvipdfmx,本页); LuaTeX 路线(LuaTeX 和 LuaTeX-ja — 直接 PDF、系统字体、Lua 可扩展性);和 XeTeX 路线(XeTeX 和 xeCJK — 直接 PDF,系统字体)。

  • 输出。 pTeX 系列发出 DVI (需要 dvipdfmx 变为 PDF)。 pdfTeX、LuaTeX 和 XeTeX 直接发出 PDF
  • 字体。 pTeX 系列传统上是基于 JFM 的; LuaTeX-ja 和 XeTeX 可让您直接命名系统的 OpenType 字体。
  • 速度和跟踪记录。 pTeX 系列 (e-upTeX) 速度快、成熟,并且在日语排版质量方面拥有悠久的记录。
  • 重新开始。 如果您重视 Unicode、系统字体和面向未来的需求,LuaLaTeX (LuaTeX-ja) 是一个强大的选择。

总而言之:对于经过验证、稳定的日本论文,e-upTeX (uplatex) → dvipdfmx对于系统字体和现代机械,LuaLaTeX - 这是当前的稳定点。 “选择引擎”页面详细介绍了选择哪种引擎。

安全的论文默认值

对于新的日语论文或报告,如果没有所需的模板,请从 UTF-8 源、uplatexdvipdfmxjlreq 或大学提供的课程开始。如果现有模板假设为 platex,请不要仅仅为了时尚而重写它;遵循模板的构建过程。关键是将类保持在顶部,构建命令和参考书目/索引命令位于同一路径上。

  • 如果没有出现PDF,首先检查.dvi是否存在。如果是,则故障在 dvipdfmx 侧。
  • Mojibake 应通过检查 UTF-8 源代码、类是否针对 pLaTeX/upLaTeX 以及编辑器的保存编码来进行调试。
  • 如果需要自由字体选择,不要强行走pTeX路线;考虑 LuaLaTeX 和 LuaTeX-ja。