我想对部分进行交叉引用以使其成为符号,但使用给出的描述后,我收到错误报告,称使用的键盘字符在输入编码“utf8”中未定义。有什么办法可以解决?
答案1
如果您尝试使用该包在 LaTeX(下面带有标准 TeX 引擎)中排版 utf8 编码的测试,inputenc
则会发生以下情况:
- LaTeX 将通过读取正确数量的 8 位字符来解析 utf8 字符,该数量可能是一个或多个,具体取决于文档中的字符。
- 这将为 LaTeX 提供一个具有特定 Unicode 编号的 Unicode 字符(经过一些计算),例如
00A1
- 现在 LaTeX 将尝试排版此字符,但要做到这一点,需要有一个字体(已加载)实际上包含代表 unicode 字符的字形和...
- LaTeX 需要知道这个事实。
- LaTeX 通过大量以下形式的声明来了解这一点:
\DeclareUnicodeCharacter{00A1}{\textexclamdown}
。 - 这会将 Unicode 数字转换为 LaTeX 内部字符表示 (LICR)。
- 但如果没有字形可用于打印此字符,这将没有什么帮助。因此,该
inputenc
包仅设置已加载包含这些字符的字体的 unicode 字符。 - 例如,如果你
T1
通过 加载编码字体,\usepackage[T1]{fontenc}
那么 LaTeX 会在内部加载文件中定义的所有声明t1enc.dfu
。(每个已建立的 LaTeX 字体编码都有一个对应的.dfu
文件。) - 但是 unicode 涵盖了大量的字符,所以如果你碰巧在文档中放入了一个不属于 LaTeX 使用的任何字体编码的字符,那么你最终会收到错误消息,告诉你这个 unicode 字符没有设置。
那么针对特定的文档可以做什么来解决此问题呢?
- 第一步是确定 LaTeX 不认识的字符的 Unicode 编号(这应该出现在错误消息中)
- 第二步稍微复杂一些,就是确定是否有任何 TeX 字体实际包含此字符以及此字体的编码是什么。这里没有好的建议,但有一些文档描述了标准的 LaTeX 字体编码。
- 或者,可以尝试至少向文档添加
T1
和编码,因为这可能会解决问题(如果它是一种相当常见的“西方”字符)。TS1
- 还可能出现您可以“伪造”字符的情况,比如说,如果您有某种连字符(在unicode中有几种不同的连字符),而您的编辑器添加了一个LaTeX无法识别的连字符,您可以添加一个
\DeclareUnicodeCharacter
声明,其中第二个参数包含一个确实存在的替换字符。
否则,我担心唯一的答案是使用不同的字符或使用完全支持 Unicode 并可以本地访问具有大型字符集的 Unicode 字体的基于 TeX 的引擎。
在文档源代码中可以找到关于此内容的更详细的文档:utf8ienc.pdf
它位于 LaTeX 分发中,也可以从.dtx
文件生成。
答案2
我遇到了同样的问题,当时一个朋友想排版一本关于拉丁诗歌的书,并想直接使用带长度标记的元音,如ō和ŏ(隆加和短肌)。
我发现的诀窍已经被包裹起来了,newunicodechar
。
说
\usepackage{newunicodechar}
\newunicodechar{ō}{\={o}}
\newunicodechar{ŏ}{\u{o}}
和以下操作完全相同
\DeclareUnicodeCharacter{014D}{\={o}}
\DeclareUnicodeCharacter{014F}{\u{o}}
但免除了通过 Unicode 表进行搜索的负担。
当然,必须确保替换文本中的内容确实可以由我们正在加载的字体生成,这可能是“章节标记”的情况。
也可以看看宏以字符作为参数,使其处于活动状态,然后 \def 它。
使用这个包还有另一个好处;假设你想切换到 XeLaTeX 或 LuaLaTeX 来处理文档;然后像