unicode-math:如何在字体范围内包含多种字体样式和 Unicode 符号?

unicode-math:如何在字体范围内包含多种字体样式和 Unicode 符号?

我需要在编辑脚本字体。然而,此代码

\documentclass{article}

\tracinglostchars=3 % Make it an error if a glyph is missing from the current font

\usepackage{mathtools}
\usepackage[bold-style=TeX]{unicode-math}
\setmathfont[math-style=ISO]{Latin Modern Math}

\setmainfont{RedactedScript-Regular.ttf} 

\setmathfont{RedactedScript-Regular.ttf}%
\setmathfont{RedactedScript-Regular.ttf}%
[range = {
    up , it , bb , bbit , scr , cal , bfcal , frak , tt , 
    sfup ,  sfit , bfup , bfit , bfscr , bffrak , bfsfup , bfsfit, "002B, 
    "002D, "2796, "207B , "03B7 , "03BC , "03D5 , "03C1, "2264, "3D, "2212, "03BC
}] 


\begin{document}
    \[\phi\]
\end{document}

得到这个错误

Missing character: There is no ϕ (U+03D5) in font [redacted-script-regular.ttf]
:mode=base;language=dflt;!
.
\endmathdisplay ...admath \fi \endmathdisplay@a $$
                                                  \global \let \df@label \@e...
l.16    \[\phi\]

"03D5此外,尽管字体范围内存在,但错误消息的含义是什么?

答案1

与其使用不能涵盖您需要的字符的字体,您可能会发现在 Lua 中用 tham~或其他字符替换字符会更容易。

在此处输入图片描述

\documentclass{article}


\directlua{
function tilderise(n) 
for nn in node.traverse(n) do
if nn.id==0 or nn.id==1 then % hlist and vlist iterate over the lists
  tilderise(nn.head)
elseif nn.id==29 then  % if it is a glyph node change the glyph
  print ('\string\n glyph=' .. nn.char .. '/' .. nn.font) % debugging
  nn.char=126 % this is ~
  nn.font=15  % force a text font as the classic math fonts don't have a ~ in this slot
end
end
return n
end

luatexbase.add_to_callback('pre_output_filter',tilderise,'\string~ filter')
}



\begin{document}
abc XYZ
    \[\phi+\int\frac{a}{1+x}dx\]
\end{document}

如果您想要启动和停止,那么您需要一个不同的回调而不是基于完整页面的输出过滤器,但相同的代码有效:

在此处输入图片描述

\documentclass{article}


\directlua{
function tilderise(n) 
for nn in node.traverse(n) do
if nn.id==0 or nn.id==1 then % hlist and vlist iterate over the lists
tilderise(nn.head)
elseif nn.id==29 then  % if it is a glyph node change the glyph
print ('\string\n glyph=' .. nn.char .. '/' .. nn.font) % debugging
nn.char=126 % this is ~
nn.font=15  % force a text font as the classic math fonts don't have a ~ in this slot
end
end
return n
end

}


\def\starttilterise{\directlua{
luatexbase.add_to_callback('hpack_filter',tilderise,'\string~ filter')
luatexbase.add_to_callback('append_to_vlist_filter',tilderise,'\string~ filter')
}}
\def\stoptilterise{\directlua{
luatexbase.remove_from_callback('hpack_filter','\string~ filter')
luatexbase.remove_from_callback('append_to_vlist_filter','\string~ filter')
}}

\begin{document}
    \starttilterise
    abc XYZ
    \[\phi+\int\frac{a}{1+x}dx\]

    \stoptilterise
    abc XYZ
    \[\phi+\int\frac{a}{1+x}dx\]
    
\end{document}

答案2

请注意,我从您提供的 Google 字体链接下载的字体的名称RedactedScript-Regular.ttf与您在此处提供的名称不同。

如果您使用 fontforge 等字体编辑器查看该字体,您会发现它不包含大多数希腊字符。

这里突出显示了 U+03D5。

在此处输入图片描述

答案3

几乎可以肯定,中间的\setmathfont{RedactedScript-Regular.ttf},覆盖没有限定符的第一个数学字体range=,是一个错误。

你通常想要类似的东西

\defaultfontfeatures{Scale=MatchLowercase} % Or sometimes MatchUppercase
\setmathfont{SomeFallbackMathFont}
\setmathfont{SomeTextFont-Regular}[range=up]
\setmathfont{SomeTextFont-Italic}[range=it]
\setmathfont{SomeTextFont-Bold}[range=bfup]
\setmathfont{SomeTextFont-BoldItalic}[range=bfit]

但是,如果您的字体不包含该\phi字符,您可以尝试\varphi,或更改range=itrange=it/{Latin,latin}。这样,您的后备字体中的希腊字母将保持不变。

如果你最终想始终使用该\varphi符号\phi,你可以添加

\AtBeginDocument{\renewcommand\phi{\varphi}}

相关内容