在 Latex 文档中插入任何 Unicode 字符

在 Latex 文档中插入任何 Unicode 字符

我对 XeLaTex 和 LuaLaTex 完全不熟悉,但我读到两者都允许用 UTF-8 编写 LaTeX 文档。

这实际上适用于一些unicode 字符,但不是全部。

请参阅以下示例文档:

\documentclass{scrartcl}

\usepackage{fontspec}

\setmainfont{Latin Modern Sans}

\begin{document}
A line with normal spaces.

A\,line\,with\,latex\,thin\,spaces.

A line with utf-8 thin spaces.

ÄÆÿ⇒☑ßдάრ你ん녕.
\end{document}

XeLaTeX 生成以下内容:

xetex pdf 输出

LuaLaTex 生成以下内容:

luatex pdf 输出

在日志文件中我看到以下几行:

XeLaTeX:

Missing character: There is no   in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no   in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no   in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no   in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no   in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no ⇒ in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no ☑ in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no д in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no ά in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no რ in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no 你 in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no ん in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!
Missing character: There is no 녕 in font Latin Modern Sans 10 Regular/OT:script
=latn;language=DFLT;mapping=tex-text;!

LuaLaTeX:

Missing character: There is no   (U+202F) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no   (U+202F) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no   (U+202F) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no   (U+202F) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no   (U+202F) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no ⇒ (U+21D2) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no ☑ (U+2611) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no д (U+0434) in font LatinModernSans:mode=node;scr
ipt=latn;language=DFLT;+tlig;!
Missing character: There is no ά (U+03AC) in font LatinModernSans:mode=node;scr
ipt=latn;language=DFLT;+tlig;!
Missing character: There is no რ (U+10E0) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no 你 (U+4F60) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no ん (U+3093) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!
Missing character: There is no 녕 (U+B155) in font LatinModernSans:mode=node;sc
ript=latn;language=DFLT;+tlig;!

因此,两者都缺少相同的字符。XeLaTeX 似乎用空格替换它们,而 LuaLaTex 则将它们省略。

有趣的是,尽管 XeLaTeX 在日志文件中仍然对它们提出抱怨,但它似乎实际上正确设置了狭窄的不间断空格(第三条输出行)。

现在,当我在 LibreOffice 中输入相同的输入行时,所有这些字符都以相同的字体正确显示:

自由办公室

所以看起来这个字体实际上提供这些字符。我尝试过的其他字体也存在同样的问题,所以这似乎不是字体问题。

那么,这里出了什么问题?

我需要做什么才能在输出中正确设置 LaTeX 文档中的任意 Unicode 字符?

更新

正如评论指出的那样,这实际上是字体问题。Latin Modern 并不包含所有字形。Google Noto 确实包含了一些(例如窄空格),但不是全部(例如 ⇒ 和 ☑ 仍然缺失)。

@LaTeXer 提到了“备用字体”。这实际上是我在这里需要的。经过一番研究,我发现这个问题并在某处引用ucharclasses 包

ucharclasses看起来像是一种“干净”的方法,但有一个缺点,我指定所有转换。它不允许我说“如果在主字体中找不到某个字符,请尝试在下一个后备字体中找到它”。如果可用,我更愿意使用主字体中的字形,因为它们看起来与其余字形更一致。此外,我需要找出我实际使用的 unicode 字符以及它们在哪些块中定义。

上面提到的 stackexchange 链接准确地描述了我所需要的。但不幸的是,似乎没有一个简单的解决方案。这个答案吸引了我,但似乎很不寻常。

那么,您推荐什么方法来处理这种“字体回退”?

更新 2

由于拉丁现代字体似乎没有窄间距,那么 LaTeX 在处理序列时会使用什么呢\,?它会自行计算所需间距吗?我认为这可能与字体中包含的可能字形不同。依靠 LaTeX 来计算这种窄间距会更好吗?还是提供该间距的字体(如 Google Noto)是更好的选择?

更新 3

由于 XeLaTeX 和 LuaLaTeX 都会悄无声息地失败,并且只会在日志文件中提及缺少的字形,那么当字形丢失时,是否可以选择让它们发出警告甚至错误,以便我能够意识到这个问题?

答案1

在 LuaLaTeX 中,可以使用combofontUlrike Fischer 的包来完成此操作。这允许指定后备字体,以及后备字体的后备字体。

MWE,主要取自combofont 手动的

\documentclass{scrartcl}
\usepackage{combofont}
\usepackage{fontspec}
\setmainfont{Latin Modern Sans}
\setupcombofont{multiscript-regular}
 {
  {file:lmsans10-regular.otf:\combodefaultfeat} at #1pt,
  {file:DejaVuSans.ttf} at #1pt,
  {file:NotoSansCJK-Regular.ttc(0)} at #1pt
 }
 {
   {} ,
   fallback,
   fallback
 }
\DeclareFontFamily{TU}{multiscript}{}
\DeclareFontShape {TU}{multiscript}{m}{n} {<->combo*multiscript-regular}{}
\begin{document}
A line with normal spaces.

A\,line\,with\,latex\,thin\,spaces.

A line with utf-8 thin spaces.

ÄÆÿ⇒☑ßдάრ你ん녕.

\rule{\textwidth}{1pt}

\fontfamily{multiscript}\selectfont
A line with utf-8 thin spaces.

ÄÆÿ⇒☑ßдάრ你ん녕.
\end{document}

结果:

在此处输入图片描述

请注意,您需要指定要使用哪些字体作为后备字体。此外,Noto Sans CJK 是一种.ttc字体,即 TrueType 集合,您需要为其指定集合中的索引。JP-Regular 是集合中的第一个字体,因此索引为 0。您可以通过不同的方式找到这些索引,例如通过查看 的输出fc-list


关于薄空间:\,定义为

\relax \ifmmode \mskip \thinmuskip \else \thinspace \fi

因此,如果在数学模式下,则为\mskip,如果在文本模式下,则为\thinspace。并且\thinspace定义为\kern .16667em,它取决于当前字体大小(1em是“正常”字符的大小,它随字体大小而变化,并在字体文件中定义)。如果字体设计合理,则使用时结果很可能很好\,


关于缺少字符的警告:您可以\tracinglostchars=2在序言中设置,使警告显示在终端输出中,而不仅仅是在日志文件中(来自当字符缺失时让 xetex 发出警告)。

相关内容