检查 LuaLaTeX 中缺少的字体字符

检查 LuaLaTeX 中缺少的字体字符

我有一份文件:

\documentclass{article}
\usepackage{fontspec}
\begin{document}
Program the μC, please.
\end{document}

当我使用xelatex或进行编译lualatex时,输出中缺少“μ”字符。这是有道理的,因为默认字体不包含该字符,但我需要知道它何时发生。

使用时xelatexlog文件包含一个警告:

Missing character: There is no μ in font [lmroman10-regular]:mapping=tex-text!

太棒了。但是lualatex,输出是错误的,并且找不到任何警告或错误。如何检测 LuaLaTeX 中缺失的字符?

看起来 ConTeXt 可以使用\checkcharactersinfont\enabletrackers[fonts.missing],而 XeLaTeX 使用 来控制它\tracinglostchars=2

答案1

以下是缺失字形的上下文代码的改编版: https://gist.github.com/phi-gamma/5812290

由于字符表附带加载目前处于实验阶段,不包含必要的元数据。因此,代码需要完整版本的 char-def.lua 来自 Context 分布(从 TL 安装 Context 包就足够了)。

用法\startreportmissingglyphs初始化跟踪器。其对应项\stopreportmissingglyphs禁用字形检查器。示例:

\startreportmissingglyphs
  ... some text ...
\stopreportmissingglyphs

如果使用可选参数调用[once]\startreportmissingglyphs则每个字体的每个缺失字符仅报告一次。示例输出:

缺少字体终端输出

请注意,由于所涉及的 Luatex 回调的性质,字形检查器以每个段落为基础进行工作,并 \stopreportmissingglyphs会强制结束段落。

作为参考,我提供了完整的示例,其中包括来自要点的接口宏的定义:

\documentclass{article}
\usepackage{luacode,fontspec}

%% 1) initialize the tracker code (could go to separate file)
\makeatletter
\directlua{dofile "track-missing-glyphs.lua"}
%% 2) Environment start: the optional argument “once”, in square
%%    brackets, requests that the missing glyph message be printed
%%    only once per character and font.
\def\startreportmissingglyphs{%
  \@ifnextchar[\missingglyphs@start@indeed%
               {\missingglyphs@start@indeed[]}%
}
\def\missingglyphs@start@indeed[#1]{%
  \directlua{documentdata.missing_glyphs.enable"\luaescapestring{#1}"}%
}
%% 3) Environment stop: we need to force a \par here to
%%    have the callback apply to the current paragraph.
\def\stopreportmissingglyphs{%
  \endgraf %% paragraph-based callback!
  \directlua{documentdata.missing_glyphs.disable()}%
}
\makeatother
%% Usage examples.
\begin{document}
  %% Latin modern lacks glyphs for the Greek script so we use that for
  %% testing.
  \startreportmissingglyphs
    Program the μC, please.
    %% Works in math mode (different font model) as well.
    $f = ma$
  \stopreportmissingglyphs

  lorem schmipsum

  \startreportmissingglyphs[once]
    %% With the “once” flag, no message is emitted for repetitions of
    %% missing chars.
    Θάλαττα, θάλαττα.
  \stopreportmissingglyphs
\end{document}

相关内容