我需要在编辑脚本字体。然而,此代码
\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
答案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=it
为range=it/{Latin,latin}
。这样,您的后备字体中的希腊字母将保持不变。
如果你最终想始终使用该\varphi
符号\phi
,你可以添加
\AtBeginDocument{\renewcommand\phi{\varphi}}