我有一个 Web 界面,可以生成发送给客户的 LaTeX 信件。这些信件是动态呈现的。有些客户的名字中有一些特殊字符,LaTeX 无法翻译,所以我经常遇到 unicode 错误。
*.tex-Template 包含\usepackage[utf8]{inputenc}
,但是我一直遇到 unicode 字符的问题。
以下是今天的两个错误消息:
Unicode char \\u8:\xc2\xb0 not set up for use with LaTeX.
Unicode char \\u8:\xe5\x8d\x97 not set up for use with LaTeX.
目前,我使用 Python 字典将一些已经识别为有问题的字符转换为正确的 LaTeX 代码。但这项工作永无止境。
有没有办法告诉 LaTeX 忽略全部与 unicode 相关的编译错误,例如告诉 LaTeX 将所有有问题的字符转换为一个?
-char?
答案1
您显示的错误消息形式表明使用的是较旧的乳胶版本,但对于所有版本,错误都来自此版本或具有相同名称的较旧版本。
\def\UTFviii@defined#1{%
\ifx#1\relax
\PackageError{inputenc}{Unicode\space char\space\expandafter
\UTFviii@splitcsname\string#1\relax
\MessageBreak
not\space set\space up\space
for\space use\space with\space LaTeX}\@eha
\else\expandafter
#1%
\fi
}
所以
\makeatletter
\def\UTFviii@defined#1{%
\ifx#1\relax
?%
\else\expandafter
#1%
\fi
}
\makeatother
加载 inputenc 后应该会消除错误。
答案2
你有一个XY问题。您实际上希望在后端使用现代 TeX 引擎,可能是 LuaTeX,它本身就理解 Unicode。传统的 8 位 TeX 不适合这项工作,并且永远无法满足您的要求。
没有一种字体可以支持所有的 Unicode,但您可以babel
在 LuaTeX 或ucharclasses
XeTeX 中检测大多数脚本并自动切换到合适的字体。如果没有语言标记,有时无法区分中文和日语,或俄语和保加利亚语,但大多数语言只要有合适的模板,就可以立即使用。
如果不这样做,您遇到的绝大多数 Unicode 错误将来自用户输入组合重音符,而 PDFTeX 无法理解这些重音符。您可以(合理地)做的最好的事情(如果您还没有这样做)是在将输入传递给 TeX 之前将其转换为 NFC 格式,同时对其进行清理。这会将尽可能多的组合重音符转换为预组合字符。您还可以删除后端不支持的任何 Unicode 字符,但许多字体会为您提供所需的后备字符。
如果您确实想添加对个别缺失 Unicode 字符的支持,最好的方法是使用newunicodechar
。这将允许您定义例如零宽度空格为{\hskip0}
和零宽度非连接符为{}
。理论上,您可以将所有不受支持的 Unicode 代码点转换为?
这种方式,但您最好在前端执行此操作并向用户提供更好的错误消息。