由于我开始使用许多 Unicode 字符(日语、一些不常见的变音符号等),因此我从 LaTeX 切换到 XeLaTeX 来渲染我的文档。不幸的是,如果缺少字体,字母就会被忽略(例如,当我忘记指定日语字体时),而不会出现任何错误(而且我似乎也找不到警告)。我会读取结果,但如果某些字符不可用,我更希望提前收到警告。有没有办法得到有关未渲染字符的警告?错误会更好。
答案1
日志应以以下形式列出所有缺失的字符:
Missing character: There is no <char> in font <font>
其中<char>
和<font>
分别是真实字符和 TeX 字体名称。我通常使用一个简单的grep
调用来检查日志中的此类消息。
答案2
这很简单。只需尝试:
\documentclass{article}
\usepackage{fontspec}
\newfontfamily\testfont[ExternalLocation]{persian-modern-regular}
\begin{document}
\setbox0=\hbox{\testfont A}
\ifdim\ht0=0pt Character A does not exist in font \else Character A exits in the font\fi
\end{document}
在上面的例子中,我使用了Persian Modern
没有拉丁字符的字体,所以我得到了一个高度为 0pt 的字符 A 的框。
另一个:
\documentclass{article}
\usepackage{fontspec}
% font spec loads "LAtin Modern" font which does not contain Persian characters
\begin{document}
\setbox0=\hbox{و}
\ifdim\ht0=0pt Character Vav does not exist in font \else Character Vav exits in the font\fi
\end{document}
编辑1:根据 Khaled 的评论“如果字体中缺少字形,XeTeX 将显示 .notdef 字形,大多数字体都有一个高度和宽度不为零的 .notdef 字形”。因此,我们可以对不太可能在每种字体中找到的脚本中的字符进行进一步测试。比如阿维斯陀语(一种古老的伊朗文字)。作为一名琐罗亚斯德教徒,只有少数 unicode 字体包含阿维斯陀语字符。所以让我们尝试一下(尽管可能有更好的方法):
\documentclass{article}
\usepackage{fontspec}
\newfontfamily\testfont[ExternalLocation]{amiri-regular}
\begin{document}
\setbox0=\hbox{\testfont A}
\setbox1=\hbox{\testfont \char"10B00} % this is Avestan character A
\ifvoid0
Font does not have character A
\else
\ifdim\dp0=\dp1
\ifdim\ht0=\ht1
\ifdim\wd0=\wd1
Font does not have character A
\fi\fi\else
Font has character A
\fi\fi
\end{document}
编辑2:似乎我之前的答案没有必要,因为 etex 提供了\iffontchar
具有以下语法的原语:
\iffontchar ⟨font⟩ ⟨code⟩ ⟨true text⟩ \else ⟨false text⟩ \fi
该原语\iffontchar
可用于检查字体中是否存在某个字形。为此,它采用字体和字符代码并执行测试。如果字符存在,则扩展 then 分支,否则扩展 else 分支。
例如:
\documentclass{article}
\usepackage{fontspec} % this loads Latin Modern font
\begin{document}
Font \iffontchar\font`ج has Persian character Jim\else does not have Persian character Jim\fi
\end{document}