\begin{description}
\item[Public : ] Dans les clouds publics,
\item[Privé : ] Dans les clouds privés,
\end{description}
我不知道为什么我以前使用过这种语法,但还是会出现问题中提到的错误。
我该如何解决这个问题?
答案1
clouds
和publics
/之间有四个 U+200B 字符(零宽度空格)privés
。一个简单的解决方法是删除带有 的空格p
并重新输入。也许这些字符是由编辑器或某些复制/粘贴操作引入的。
答案2
这是 U+200B 和 LaTeX 的热门问题之一,因此我将在这里发布解决方案。
请看以下示例:
\tracinglostchars=2
\documentclass{article}
\pagestyle{empty}
\begin{document}fl fl fl\end{document}
在 LuaLaTeX 中,它编译为:
第一个 fl 没有连字符,因为我插入了 U+200B,一个零宽度空格。第二个没有连字符,因为我插入了 U+200C,一个零宽度非连接符。这些可能是你故意复制的原始来源:零宽度空格可能意味着潜在的换行符,例如在斜线之后,而零宽度非连接符会禁用连字符。例如,Elfin 中的 fi 或 Halfling 中的 fl(根据像我这样的学究的说法)不应该连字符,因为它们属于复合词的不同部分,但这在其他一些语言中更常见。
如果您尝试在 PDFLaTeX 中编译它,您将收到以下错误消息:
! Package inputenc Error: Unicode character (U+200B)
(inputenc) not set up for use with LaTeX.
有几种方法可以解决这个问题。
手动清理来源
这是本网站大多数人推荐的。您的编辑器可能有办法显示特殊字符,以便您可以删除它们。但说真的,这不是计算机的工作吗?
使用 Perl 清理源代码
以下单行 Perl 脚本将创建一个新的源文件,其中所有零宽度空格均被删除:
perl -CSD -pe "s/\N{U+200B}//gu" < U200B.tex > noU200B.tex
如果更容易记住,你也可以将其写成
perl -CSD -pe "s/\N{ZERO WIDTH SPACE}//gu" < U200B.tex > noU200B.tex
此-CSD
选项无条件选择 UTF-8,即使您没有将 UTF-8 作为默认语言环境。此-pe
选项在输入文件上运行给定的 Perl 脚本并打印到输出文件。该s
命令执行替换,是\N{...}
匹配零宽度空格的正则表达式,之间的空字段//
表示用任何内容替换,和gu
表示全局替换 unicode 字符串中的所有实例。然后,<
和>
运算符选择输入和输出文件。
其中任何一个都会生成一个编译为以下内容的文件:
也可以自动删除给定子集之外的所有字符。脚本
perl -CSD -pe "s/[^\p{Word}\p{Punct}\p{Symbol}\p{Mark}\p{PerlSpace}]//gu"
仅允许以下字符:Unicode“单词”字符、标点符号、符号、重音符号和几种空格。它会删除大多数不可见的字符。更严格的版本是
perl -CSD -pe "s/[^\p{ASCII}]//gu"
这将清除所有字符,但 TeX 中最初允许的 ASCII 除外(包括“
双反引号)。
是的,我们可以用一些东西来代替零宽度空格,而不是什么都不用。脚本
perl -CSD -pe "s/\N{ZERO WIDTH SPACE}/{\\\\hskip 0pt}/gu; s/\N{ZERO WIDTH NON-JOINER}/{}/gu"
给定上述 MWE 作为输入,产生以下输出:
\tracinglostchars=2
\documentclass{article}
\pagestyle{empty}
\begin{document}f{\hskip 0pt}l f{}l fl\end{document}
教 LaTeX 理解零宽度空格
如果问题是 U+200B“未设置为用于 LaTeX”,但它相当于 TeX 命令 -\hskip 0pt
或者\hspace{0pt}
是阻止连字并导致潜在换行的零宽度空格 - 我们可以设置字符以使用该命令。
\tracinglostchars=2
\documentclass{article}
\usepackage{iftex}
\pagestyle{empty}
\ifTUTeX
\usepackage{fontspec}
\else
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc} % The default since 2018
\DeclareUnicodeCharacter{200B}{{\hskip 0pt}}
\fi
\begin{document}fl fl fl\end{document}
虽然该\DeclareUnicodeCharacter
命令在中inputenc
,但自 2018 年起,LaTeX 内核已默认加载它。因此,我们可以跳过声明它。
答案3
这些错误很难调试,因为如果您有一个很长的文档,然后向具有非unicode字符的bibtex条目添加引用,那么很难知道哪个引用是问题所在以及在哪里查找。
我的解决方案如下:
pdflatex
在命令行中运行或执行其他任何命令。这将以“控制台”格式显示错误,如下所示:
Package inputenc Error: Unicode char ́ (U+301) not set up for use with LaTeX
然后我可以复制/粘贴有问题的字符(在我的情况下,是一些西班牙语文本上的奇怪重音)并将其粘贴到以下命令中:
rgrep ́
这使我能够在我的其中一个 .bib 文件中找到有问题的项目,然后我可以进行修复并继续我的生活。