![为所有缺失字符定义后备字体](https://linux22.com/image/448082/%E4%B8%BA%E6%89%80%E6%9C%89%E7%BC%BA%E5%A4%B1%E5%AD%97%E7%AC%A6%E5%AE%9A%E4%B9%89%E5%90%8E%E5%A4%87%E5%AD%97%E4%BD%93.png)
我需要访问 Emoji 字符,用于我目前正在编写的一个小程序包。当标准字体中没有随机字符时,是否有办法在 XeLaTeX 中使用后备字体?
在我的 MWE 中,我尝试了与此处描述的类似的东西:https://tex.stackexchange.com/a/224585/205359
我的 MWE:
\documentclass{scrartcl}
\usepackage{fontspec}
\usepackage{newunicodechar}
\newfontfamily{\fallbackfont}{Segoe UI Emoji}
\DeclareTextFontCommand{\textfallback}{\fallbackfont}
\newcommand{\fallbackchar}[2][\textfallback]{%
\newunicodechar{#2}{#1{#2}}%
}
\fallbackchar{
答案1
使用 expl3 的 Xelatex 和 Lualatex 解决方案。
该方法定义了“默认”字体:它将代码点块信息存储为 expl3 序列变量中的一组记录,通过充当查找表的 expl3 属性列表将这些块聚合到块集中,然后通过另一个属性列表将字体分配给该块集。
因此:任何不属于定义集合的字形都可以在后备中进行排版。
首先,定义集合。
首先,加载一些包含代码块信息的序列。为了更快地查找,2 位代码点范围进入 2 位列表,3 位进入 3 位列表,依此类推,直到找到所需的范围。记录格式为<start codepoint> <delimiter> <end codepoint> <delimiter> <block name>
,其中<delimiter>
为;
。
\mfsloadaseq{list2digits}{
32;99;Basic Latin
}
\mfsloadaseq{list3digits}{
100;127;Basic Latin
,128;255;Latin-1 Supplement
,256;383;Latin Extended-A
,384;591;Latin Extended-B
,592;687;IPA Extensions
,688;767;Spacing Modifier Letters
,768;879;Combining Diacritical Marks
,880;999;Greek and Coptic
}
\mfsloadaseq{list4digits}{
1000;1023;Greek and Coptic
,1024;1279;Cyrillic
,1328;1423;Armenian
,2304;2431;Devanagari
,4256;4351;Georgian
,7312;7359;Georgian Extended
,7936;8063;Greek Extended
}
\mfsloadaseq{list5digits}{
11520;11567;Georgian Supplement
,43232;43263;Devanagari Extended
,66432;66463;Ugaritic
,77824;78895;Egyptian Hieroglyphs
}
\mfsloadaseq{list6digits}{
129280;129535;Supplemental Symbols and Pictographs
}
接下来,将块分组为块集:
\mfsloadaprop{block2blockset}{
Basic Latin=latin
,Latin-1 Supplement=latin
,Latin Extended-A=latin
,Latin Extended-B=latin
... etc
}
块集名称将成为字体切换命令的一部分。
接下来,将块集名称链接到其字体。
\mfsloadaprop{blockset2font}{
latin=Noto Serif
,greek=Alexander
,cyrillic=Charis SIL
,armenian=Noto Serif Armenian
,georgian=Noto Serif Georgian
,symbols=Segoe UI Emoji
,devanagari=Shobhika
,ugaritic=Noto Sans Ugaritic
,egyptian=Noto Sans Egyptian Hieroglyphs
}
接下来,一些字体需要fontspec
设置字体选项。这些选项也进入属性列表,因为它们在块集名称和选项设置之间是一一对应的。为了绕过属性列表语法中的=
and ,使用代替,和代替。当在字体命令中实际使用时,and会转换回and 。,
key=value,...
value
;
=
-
,
;
-
=
,
\mfsloadaprop{blockset2fontoptions}{
latin=Colour;blue-Scale;2
,devanagari=Script;Devanagari
,greek=Colour;violet-Scale;1.5
}
已定义一个命令\ftext
,可以接受文本输入并按要求应用字体。该命令还可以接受一些(基本)格式开关(和空格),保护它们免受发生的字符串化过程的影响,然后将它们重新插入到输出中。
因此,根据定义,
\ftext{