在 XeLaTeX 中,\XeTeXcharglyph
和\iffontchar
都可用于检查字体是否包含特定字形。在 LuaLaTeX 中,\iffontchar
似乎是唯一的选择。以下是两者的使用方式:
\ifnum\XeTeXcharglyph`#1>0\found\else\notfound\fi
\iffontchar\font`#1\found\else\notfound\fi
有什么理由比\XeTeXcharglyph
更青睐 吗\iffontchar
?
答案1
如果你看一下这两个命令的定义xetex.web
,你会发现它们几乎是一样的。
主要区别在于,它\iffontchar
接受两个参数(字体和字形),并且始终返回布尔值,而它\XeTeXcharglyph
根据当前活动字体检查字形,如果当前字体不是 AAT、OTF 或 Graphite,则可能会引发错误。这实际上是一个强有力的理由反对使用\XeTeXcharglyph
,因为它无法处理 8 位字体。
内部都使用map_char_to_glyph
。
if_in_csname_code: b:=is_in_csname;
if_font_char_code:begin scan_font_ident; n:=cur_val; scan_usv_num;
if is_native_font(n) then
b:=(map_char_to_glyph(n, cur_val) > 0)
else begin
if (font_bc[n]<=cur_val)and(font_ec[n]>=cur_val) then
b:=char_exists(char_info(n)(qi(cur_val)))
else b:=false;
end;
end;
XeTeX_map_char_to_glyph_code:
begin
if is_native_font(cur_font) then begin
scan_int; n:=cur_val; cur_val:=map_char_to_glyph(cur_font, n)
end else begin
not_native_font_error(last_item, m, cur_font); cur_val:=0
end
end;
\XeTeXcharglyph
在 Plain TeX 中失败的 MWE :
\the\XeTeXcharglyph`a
\bye
! Cannot use \XeTeXcharglyph with cmr10; not a native platform font.
l.1 \the\XeTeXcharglyph
`a