我有一个 OpenType 字体,其中 #b5(微符号)未定义,但 #3bc(希腊小写字母 mu)已定义。由于该字体没有其他希腊字母,因此它有该字形的原因肯定主要是用作“微”,并且因为这是 Latin-1。我认为该字体應該将该字形作为字符 0xb5,但事实并非如此。
因为这样\textmu
不会渲染任何内容。我希望文本中的普通 #b5 字符使用该字形。查找这个问题我尝试过这个:
% -*- TeX-engine: luatex; -*-
\documentclass{article}
\usepackage{fontspec}
\directlua
{
local function patch(fontdata)
if string.match(fontdata.psname or "", "^Berling") then
fontdata.characters[0xb5] = fontdata.characters[0x3bc]
end
end
luatexbase.add_to_callback("luaotfload.patch_font", patch, "missing glyph")
}
\setmainfont{Berling}
\begin{document}
b5 = µ, 3bc = μ, textmu = \textmu
\end{document}
现在,无论我写入 0xb5 字符、0x3bc 字符(作为附加奖励)还是\textmu
在文件中,我都会得到相同的字形。
这是一个好的解决方案吗?还是有更好的方法?(在我的用例中,我不想更改字体文件。)我认为更好的一种方法是明确检查代码点是否未定义(而另一个已定义!),但我不知道该怎么做。但也许还有其他更好的方法?(首先,我尝试使用“替换”功能,但发现我只能用它来替换现存的特点。)
请注意,我不想停止其他字体的工作。例如,上面的建议
\textmu\ \& \texttt{\textmu}
以两种不同的字体显示该字符。仅重新定义\textmu
为始终显示字符 3bc 是行不通的。
答案1
您可以使用newunicodechar
:
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\newunicodechar{µ}{α}
\newunicodechar{μ}{β}
\setmainfont{DejaVu Serif}
\begin{document}
b5 = µ, 3bc = μ, textmu = \textmu
\end{document}
为了检查字形是否存在,您可以使用\iffontchar
,这是用于检查字形可用性的内置命令。这允许一个更独立于字体的解决方案,将所有可能性都考虑在内。在下面的 MWE 中,我使用 α 和 β 代替不同版本的 μ,以使示例更清晰。
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\setmainfont{DejaVu Serif}
\iffontchar\font`α
\iffontchar\font`β
\relax % both glyphs exist, do nothing
\else
% α exists but β doesn't, define β to be α
% and set \textmu to be α
\newunicodechar{β}{α}
\def\textmu{α}
\fi
\else % α does not exist
\iffontchar\font`β
% β exists but α doesn't, define α to be β
% and set \textmu to be β
\newunicodechar{α}{β}
\def\textmu{β}
\else % neither α or β exists
\GenericError{Glyph error}{No alpha or beta is defined in font}
\fi
\fi
\begin{document}
Text with α and β and \textmu
\end{document}