字体与数据库工具

这些不是每天都要输入的命令,而是让 TeX 安装保持一致性的维护工具updmapkanji-config-updmap 管理“哪些字体会嵌入 PDF”,而 mktexlsrfmtutil 刷新 TeX 所依赖的数据库和预生成格式。手动安装字体或软件包之后,或者遇到“找不到文件”时,就会用到它们。

维护工具修复“查找”“嵌入”和“启动”

把 TeX 故障分成三层来看,维护会清楚得多。安装的文件找不到时,怀疑文件名数据库。PDF 嵌入了错误字体时,怀疑字体映射。引擎启动时无法加载 .fmt 时,怀疑格式文件mktexlsrupdmapfmtutil 分别修复这三层。先判断哪一层坏了,再决定是否运行命令,比盲目全部执行更能保持共享机器和 CI 镜像可预测。

updmap — 管理字体映射

DVI 驱动(dvipsdvipdfmx)和 pdftex 通过字体映射得知 TeX 中的字体名与实际字体文件之间的对应关系,以及如何嵌入它。updmap 会根据已启用的映射文件和选项重新生成合成映射;启用新字体的映射后需要运行它。updmap-sys 作用于系统范围配置(需要管理员权限),updmap 作用于用户个人配置,并会覆盖系统设置。

设置用 --setoption KEY VALUE 写入 updmap.cfg,映射用 --enable Map foo.map / --disable 添加或移除。之后运行 updmap(或 updmap-sys)即可应用更改。实际使用中的规则是不要混用用户设置和系统设置。在共享机器或 CI 中统一使用 updmap-sys;普通的 updmap 只留给个人实验。这样可避免“只有某个作者的 PDF 字体不同”的故障。

terminal
updmap-sys --enable Map myfont.map   # マップを有効化 / enable a map
updmap-sys                           # 合成マップを再生成 / regenerate the maps

kanji-config-updmap — 选择嵌入的日文字体

日文(CJK)的嵌入字体是在 dvi→pdf 转换(dvipdfmx)阶段决定的。选择它的简便工具是 kanji-config-updmap(texjporg):它在内部设置 updmapjaEmbed 选项(旧名 kanjiEmbed),查找常用日文字体并在它们之间切换。用 status 查看当前设置,用 auto 自动选择,或传入字体系列名(例如 ipaexhiragino-pronnoto-otc)切换到该系列。

terminal
kanji-config-updmap-sys status   # 現在の和文フォントを表示 / show the current font
kanji-config-updmap-sys ipaex    # IPAex フォントを埋め込む設定に / embed IPAex

mktexlsr / texhash — 刷新文件名数据库

TeX 使用 kpathsea 库和名为 ls-R 的文件名数据库,在巨大的 texmf 树中快速定位目标文件。如果你只是手动把文件放进 texmf 树,TeX 不会自动看到它。用 mktexlsr(别名 texhash)重建 ls-R 后,新文件就能被找到。

terminal
mktexlsr        # ls-R を再構築(= texhash)/ rebuild ls-R (same as texhash)

fmtutil — 重新生成格式

pdflatex 等命令在启动时会加载格式文件(.fmt,例如 latex.fmt。它保存了加载格式(例如 LaTeX)后的完整引擎状态,让引擎不必每次都从零重读,从而快速启动fmtutil 会重新生成这些 .fmt 文件。影响格式的更改之后,或 .fmt 缺失/损坏并出现“can’t find the format file”错误时,会用到它。fmtutil-sys 作用于系统树;fmtutil --byfmt latex 只重建一个,fmtutil-sys --all 则全部重建。它不是每次添加普通软件包都要运行的命令;应把它视为修复引擎启动问题的最后维护手段。

terminal
fmtutil --byfmt pdflatex   # pdflatex の .fmt を作り直す / rebuild just pdflatex
fmtutil-sys --all          # すべてのフォーマットを再生成 / rebuild every format

按顺序选择修复方法

  • 如果 kpsewhich mypackage.sty 找不到文件,检查它在 TEXMF 中的放置位置,以及是否需要 mktexlsr
  • 如果 PDF 中只有日文字体不对,先用 kanji-config-updmap-sys status 查看当前 jaEmbed
  • 如果刚安装的西文字体不对,检查它的 .map 是否已用 updmap-sys --enable Map ... 启用。
  • 如果引擎在启动前因缺少格式而停止,用 fmtutil --byfmt 只重建该格式。

什么时候需要这些工具

  • 手动安装了字体updmap(日文字体嵌入用 kanji-config-updmap)。
  • 手动把文件或软件包放进 texmfmktexlsrtexhash)。
  • 更改了与格式相关的内容 / .fmt 损坏fmtutil
  • 通常 TeX Live 管理器 tlmgr 会替你调用这些命令;只有维护时才手动运行。