使用 LuaLaTeX 在 OpenType 字体中使用 \textmu 的另一个字形

使用 LuaLaTeX 在 OpenType 字体中使用 \textmu 的另一个字形

我有一个 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}

相关内容