Unicode 字符 {U+200B}

Unicode 字符 {U+200B}

当我尝试引用两位以上的作者时,我得到了这样的结果:

! Package inputenc Error: Unicode char ​ (U+200B)
(inputenc)                not set up for use with LaTeX.

\documentclass[a4paper,oneside,BCOR=10mm,12pt,titlepage]{scrreprt} 
\usepackage[polutonikogreek,ngerman,english]{babel}
\usepackage[maxlevel=4,autostyle,german=guillemets]{csquotes}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[style=mla]{biblatex}
\DeclareMultiCiteCommand{\parencites}[\mkbibparens]{\parencite}{\multicitedelim‌​}

\begin{document}

\parencites[cf.][]{key1}{key2}{key3}

\end{document}

答案1

U+200B 是零宽度空间,如下所示:

elim‌​}

从此行末尾

\DeclareMultiCiteCommand{\parencites}[\mkbibparens]{\parencite}{\multicitedelim‌​}

是 (使用这个unicode转换器

  U+0065 LATIN SMALL LETTER E     e
  U+006c LATIN SMALL LETTER L     l
  U+0069 LATIN SMALL LETTER I     i
  U+006d LATIN SMALL LETTER M     m
  U+200c ZERO WIDTH NON-JOINER     ‌
  U+200b ZERO WIDTH SPACE     ​ 
  U+007d RIGHT CURLY BRACKET     } } \rbrace

删除该行并重新输入,不要在m和之间添加不可见的控制字符}

答案2

这是 U+200B 和 LaTeX 的热门问题之一,因此我将在这里发布解决方案。

请看以下示例:

\tracinglostchars=2
\documentclass{article}
\pagestyle{empty}
\begin{document}f​l f‌l fl\end{document}

在 LuaLaTeX 中,它编译为:

拉丁现代字体示例

第一个 fl 没有连字符,因为我插入了 U+200B,一个零宽度空格。第二个没有连字符,因为我插入了 U+200C,一个零宽度非连接符。这些可能是你故意复制的原始来源:零宽度空格可能意味着潜在的换行符,例如在斜线后,而零宽度非连接符会禁用连字符。例如,Elf‌in 中的 fi 或 Half‌ling 中的 fl(根据像我这样的学究的说法)不应该连字符,因为它们属于复合词的不同部分。几乎没有人会费心去做这件事,但在其他一些语言中,这更为常见。

如果您尝试在 PDFLaTeX 中编译它,您将收到以下错误消息:

! Package inputenc Error: Unicode character ​ (U+200B)
(inputenc)                not set up for use with LaTeX.

有几种方法可以解决这个问题。

手动清理来源

这是本网站大多数人推荐的。您的编辑器可能有办法显示特殊字符,以便您可以删除它们。但说真的,这不是计算机的工作吗?

在编辑器中清理源代码

对于不可见的零宽度字符,这更难,但您可以从字符映射中复制零宽度空格,打开搜索和替换对话框,然后将字符粘贴到搜索字段中。然后,您可以用类似ZWS或 的内容替换它{\hskip 0pt}

使用 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}f​l f‌l fl\end{document}

虽然该\DeclareUnicodeCharacter命令在中inputenc,但自 2018 年起,LaTeX 内核已默认加载它。因此,我们可以跳过声明它。

相关内容