日文字体

把「漢」这一个字分别用 Harano Aji 明朝、Hiragino 明朝 ProN 和 IPAex 明朝排出来测量宽度,三者都是 正好 10.0pt——10pt 下的全角,即一个 em。日文字体换来换去而行不会变动,原因正在于此;这与西文换字体会改变行长的情形截然不同。因此,在 LaTeX 中选择日文字体,真正要问的不是外观,而是 对方环境里到底有没有这个字体,以及它是否被正确嵌入 PDF。本页通过实测确认 TeX Live 2024 一定具备哪些日文字体,再讲 LuaLaTeX、XeLaTeX、(u)pLaTeX 各自的指定方法,以及如何用 pdffonts 确认嵌入。

TeX Live 中一定有哪些日文字体

随 TeX Live 分发的只有 Harano Aji、IPA 和 IPAex 三个系列,Noto CJK 与 Source Han 并不在内。 这不是猜测,而是 kanji-config-updmap-sys status 输出的内容。在 TeX Live 2024 上运行该命令,会显示当前设置为 haranoaji,候选(standby)家族为 haranoajiipaipaex 三个。Hiragino、Morisawa 之类的商业字体,只要系统中装有便可使用,但它们并非由 TeX Live 分发。

terminal
$ kanji-config-updmap-sys status
CURRENT family for ja: haranoaji (variant: -04)
Standby family : haranoaji
Standby family : ipa
Standby family : ipaex

# asking for a font that is not installed fails loudly
$ lualatex noto.tex
luaotfload | db : Reload initiated; reason: Font "NotoSerifCJKJPRegular" not found.
! Package fontspec Error: The font "NotoSerifCJKJPRegular" cannot be found.

这条界线确实会弄坏文档。写着 \usepackage[noto]{luatexja-preset} 的最小文件交给 LuaLaTeX,会停在 ! Package fontspec Error: The font "NotoSerifCJKJPRegular" cannot be found.——预设名虽有定义,但没有真实字体便到此为止。因此 要交给合作者或投稿方的稿件,指定 haranoaji(或 ipaex)是唯一稳妥的选择。若要使用 Noto CJK 或 Source Han,就必须另行安装字体,并把这一前提告知对方。

字体来源是否随 TeX Live 2024 分发
Harano Aji细田真道把 Source Han 的 CID 重新编入 Adobe-Japan1 而成的免费字体是,且为默认。明朝、Gothic 各 7 个字重,分属 haranoajiharanoaji-extra
IPAex日本 IPA 机构发布的免费字体是。ipaexm.ttf(明朝)与 ipaexg.ttf(Gothic);TeX Live 2020 之前的默认
Noto CJK / Source HanGoogle 与 Adobe 发布的开源泛 CJK 字体否。仅附有字体映射,字体本身需另行安装
Hiragino随 macOS 附带的商业书体否。仅在 macOS 上可用,通过 hiragino-pron 等预设调用
MorisawaMorisawa 的商业书体,商业印刷的标准否。需购买授权;已备有 morisawa-pr6n 等预设

Mincho 与 Gothic:用 \textmc\textgt 切换

日文排版靠两种书体运转。Mincho(明朝体) 横画细、竖画粗,笔画末端带有称为 uroko(「鳞」)的小三角衬饰,相当于西文的衬线体,承担 正文Gothic(ゴシック体) 笔画粗细几乎一致、没有衬饰,相当于无衬线体,适合 标题、强调、图注以及图表中的标签。切换方式与西文字体命令相同:声明形式的 \mcfamily / \gtfamily,以及只作用于参数的命令形式 \textmc{...} / \textgt{...}。其中 mc 是 mincho 的缩写,gt 是 gothic 的缩写。

latex
本文は明朝体で組みます。\textgt{ここだけゴシック体}で強調できます。

{\gtfamily この波括弧の中はすべてゴシック体になります。}

見出しなどは \textbf{太字} にすると、和文では自動的にゴシック体になります。

这里与西文有一处决定性差异:粗体的处理。日文的 Mincho 默认没有粗字重,因此 \bfseries\textbf{} 实际上被 映射为切换到 Gothic(即便在 LuaTeX-ja 的默认设置中,Mincho 与 Gothic 两族的粗体系列也都指向 Gothic 的中等字重)。日文基本上 没有 italic 或 oblique 的概念,因此不会提供西文那种倾斜字形。\textmc\textgt 只改变字体族(family),与字重(series)和字形(shape)相互独立。某些文档类和宏包可以设置为使用 \rmfamily / \sffamily 时同步切换 Mincho / Gothic——在 LuaTeX-ja 中是 luatexja-fontspecmatch 选项。

除这两种书体外,还有毛笔书体。Kaisho(楷书体) 是一画一停、规整书写的楷体;Gyosho(行书体) 是笔画相连、略作简省的半草书。它们出现在奖状、正式致辞、请柬等需要传统日式气氛的场合。另有圆角的 Maru Gothic(丸ゴシック体),通过 \mgfamily / \textmg{...} 调用。不过真正含有圆角 Gothic 的字体不多,Harano Aji 就没有——即便加上下文的 deluxe 选项,实际嵌入的也只有 Mincho 和 Gothic。日常论文与书籍排版的核心,始终是这两种。

Harano Aji:把 Source Han 重新编入 Adobe-Japan1

Harano Aji 是 把 Source Han(Source Han Serif 与 Source Han Sans)的 CID 重新编入 Adobe-Japan1 而成的字体。随附的 README 用一句话写明:这些字体是把 Adobe-Identity-0(AI0)的 CID 替换为 Adobe-Japan1(AJ1)的 CID 而得。关键正在于此——它不是「外观相似的另一款字体」,而是 重新编号。(u)pLaTeX 与 dvipdfmx 的世界按 CID 编号调用字符,若字体未按 Adobe-Japan1 编号,就无法接入传统工作流。Noto CJK 之所以不能直接拿来当默认,原因正在这里。

作者是细田真道。据 README,总共有 14 款字体——Mincho 与 Gothic 各 7 个字重,在 TeX Live 中被拆成两个宏包。haranoaji 收录预设所用的主要 7 款(Mincho 的 Light、Regular、Bold,Gothic 的 Regular、Medium、Bold、Heavy),haranoaji-extra 收录其余 7 款(Mincho 的 ExtraLight、Medium、SemiBold、Heavy,Gothic 的 ExtraLight、Light、Normal)。在本机 ls 这两个目录,就能看到这种拆分原样呈现为文件列表。

terminal
$ ls texmf-dist/fonts/opentype/public/haranoaji/
HaranoAjiGothic-Bold.otf    HaranoAjiGothic-Heavy.otf
HaranoAjiGothic-Medium.otf  HaranoAjiGothic-Regular.otf
HaranoAjiMincho-Bold.otf    HaranoAjiMincho-Light.otf
HaranoAjiMincho-Regular.otf

$ ls texmf-dist/fonts/opentype/public/haranoaji-extra/
HaranoAjiGothic-ExtraLight.otf  HaranoAjiGothic-Light.otf
HaranoAjiGothic-Normal.otf      HaranoAjiMincho-ExtraLight.otf
HaranoAjiMincho-Heavy.otf       HaranoAjiMincho-Medium.otf
HaranoAjiMincho-SemiBold.otf

正文的 Mincho 默认指向 HaranoAjiMincho-Regular,Gothic 指向 HaranoAjiGothic-Medium。选择 Harano Aji 的实务理由不只是质量:同一段文字若改用 IPAex 排版,PDF 体积会相差一个数量级。以仅有 7 个字的文档比较,Harano Aji 的 PDF 为 5,617 字节,IPAex 的为 155,880 字节pdffonts 分别把它们报告为 CID Type 0C(Harano Aji,OpenType/CFF)与 CID TrueType(IPAex)。原始字体文件分别是 6.4 MB 和 7.8 MB,大小相仿,因此差异并非来自字形本身,而是来自 格式及其子集化效率

在 LuaLaTeX 与 XeLaTeX 中指定字体:luatexja-presetzxjafont

在 Unicode 引擎上,最短的路径是把预设名交给 LuaLaTeX 下的 luatexja-preset(属于 LuaTeX-ja,即 luatexja)或 XeLaTeX 下的 zxjafont。二者都能用一个词设定「Mincho 用这个、Gothic 用那个」的配对。预设名大体通用,已定义 haranoajiipa/ipaexhiragino-pro/hiragino-pronnoto/noto-otcsourcehanmsyu-win10morisawa-pr6nkozuka-pr6n 等。实测中,带 \usepackage[haranoaji]{zxjafont} 的文档在 XeLaTeX 下顺利编译,并嵌入了 HaranoAjiMincho-Regular 的子集。

document.tex
% LuaLaTeX
\documentclass{ltjsarticle}
\usepackage[haranoaji]{luatexja-preset}
% add deluxe for multiple weights of Mincho and Gothic:
% \usepackage[haranoaji,deluxe]{luatexja-preset}

% XeLaTeX
% \documentclass[a4paper]{bxjsarticle}
% \usepackage[haranoaji]{zxjafont}

\begin{document}
本文は明朝体。\textgt{見出しはゴシック体}\end{document}

加上 deluxe 选项后,就能在正文中区分使用 Mincho 与 Gothic 的多个字重。实测中,\usepackage[haranoaji,deluxe]{luatexja-preset} 生成的 PDF 嵌入了四个字体:HaranoAjiMincho-RegularHaranoAjiMincho-BoldHaranoAjiGothic-RegularHaranoAjiGothic-Medium。另外,ltjsarticleltjs* 文档类会把日文相对西文略微缩小排版——编译时出现的 Package luatexja-preset Warning: Japanese fonts will be scaled by 0.924715. 正是此意,属于设计行为而非问题。

若不依赖预设而想直接指定字体,在 LuaLaTeX 下载入 luatexja-fontspec。它的命令与 fontspec 一一对应:\setmainjfont(Mincho,正文)、\setsansjfont(Gothic)、\setmonojfont(等宽)、\newjfontfamily,临时一次性则用 \jfontspec。选项写法也与 fontspec 相同——Scale=Path= 等——因此西文那边的知识可以直接沿用。既可给书体名也可给文件名;协作时 写文件名(HaranoAjiMincho-Regular.otf)更可靠

document.tex
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec}
% naming files, not family names, keeps it reproducible
\setmainjfont{HaranoAjiMincho-Regular.otf}
\setsansjfont{HaranoAjiGothic-Medium.otf}
% \setmainjfont{Hiragino Mincho ProN}   % macOS only
\begin{document}
明朝の本文。\textsf{ゴシックの見出し}\textbf{太字}\end{document}

在 (u)pLaTeX + dvipdfmx 中指定字体:kanji-config-updmapotf 宏包

在传统 (u)pLaTeX 中,决定嵌入哪个字体的是系统一侧的设置,而不是文档本身。排版所用日文字体的度量(字宽)是虚拟固定的,源文件中不会出现真实字体名。切换该设置的工具是 TeX Live 附带的 kanji-config-updmap:它重写 dvipdfmx 参照的字体映射(updmap.cfg),一次性替换 Mincho 与 Gothic 的真实字体。面向所有用户用 kanji-config-updmap-sys(需管理员权限),只针对自己则用 kanji-config-updmap-user,用户设置优先。

terminal
# show the current setting and the candidates found on this system
kanji-config-updmap-sys status

# switch to Harano Aji (the TeX Live default)
sudo kanji-config-updmap-sys haranoaji

# other examples
sudo kanji-config-updmap-sys ipaex
sudo kanji-config-updmap-sys hiragino-pron

# use the JIS X 0213:2004 glyph shapes
sudo kanji-config-updmap-sys --jis2004 haranoaji

# embed nothing, or auto-detect what is installed
sudo kanji-config-updmap-sys nofont
sudo kanji-config-updmap-sys auto

status 会列出当前设置以及系统中找到的候选字体。auto 自动寻找可用的商业或免费字体并设为嵌入,找不到则退回不嵌入。--jis2004 选择 JIS X 0213:2004 字形(所谓「2004 JIS」);上文 status 输出中的 variant: -04 就是这一字形选择的另一种称呼。若需要按文档而非按机器更换字体,可以改用 pxchfon 宏包在导言区指定,而不必改动系统设置。

要在正文中使用多种书体和字重,并触及范围更广的 Adobe-Japan1 字符集,请载入齋藤修三郎的 otf 宏包(japanese-otf)(在 upLaTeX 中要显式写出引擎:\usepackage[uplatex]{otf})。Adobe-Japan1 是日文字体的标准字形集合,包含 JIS X 0208 容纳不下的异体字、符号与旧字。有两个命令可直接指定字符:\UTF{...} 接受 Unicode 码点(4 至 5 位十六进制),\CID{...} 接受十进制的 Adobe-Japan1 CID 编号。其好处是,像人名中的旧字这类不易输入的字形,可以通过代码值可靠输出。同样的功能在 LuaTeX-ja 中以 luatexja-otf 提供。

latex
\UTF{9DD7}\CID{7652}飾区
葛城市、\CID{1481}城駅

otf 的选项也值得记住。deluxe 启用总共七种书体:Mincho 三个字重、Gothic 三个字重、Maru Gothic 一个字重,并为圆角 Gothic 增加 \mgfamily / \textmg{...}expert 启用竖排标点和异体字等额外字形,jis2004 选择 2004 JIS 字形。要真正用上多字重,需要在 kanji-config-updmap 一侧配置好相应的真实字体。顺带一提,日文字体的编码横排为 JY3,竖排为 JT3

pdffonts 确认字体是否真的嵌入了 PDF

把 PDF 交给 pdffonts,它会为每个已嵌入的字体打印一行。要看的有三列:embyes 表示已嵌入,subyes 表示已子集化(只抽出用到的字形),uni 表示是否带有反查 Unicode 的信息。此外,字体名前面 形如 NWYKMN+ 的 6 个大写字母前缀 就是子集化的标记。在 TeX Live 2024 上尝试的每一条路径中,这 6 个字母都必定出现。

还有一点值得实测确认:路径不同,结果相同。取同一份 jlreq 源文件,一次经 uplatexdvipdfmx 处理,一次直接用 lualatex 处理,再看 pdffonts:两者都嵌入了 HaranoAjiMincho-Regular 的子集。子集化的效果非常显著——原始的 HaranoAjiMincho-Regular.otf 有 6.4 MB,而七个字的文档生成的 PDF 只有 5,617 字节。也就是说,基本不必担心用于分发的日文 PDF 会膨胀到几 MB。

terminal
# same jlreq source, two routes, same embedded font
$ uplatex doc.tex && dvipdfmx doc.dvi && pdffonts doc.pdf
UCCFIG+HaranoAjiMincho-Regular-Identity-H  CID Type 0C  yes yes
KXFDXT+LMRoman9-Regular                    Type 1C      yes yes

$ lualatex doc.tex && pdffonts doc.pdf
NWYKMN+HaranoAjiMincho-Regular             CID Type 0C  yes yes
PNHTXY+LMRoman9-Regular                    CID Type 0C  yes yes

最后,这项检查请务必自己做一遍。日文 PDF 中对方反映「字显示不出来」「乱码」的事故,几乎都源于字体未被嵌入的 PDF。若残留着 kanji-config-updmap-sys nofont 的设置,或导言区某处带有不嵌入的选项,pdffontsemb 一列就会显示 no。提交前跑一次 pdffonts,就能整类避免这种事故。