当我尝试引用两位以上的作者时,我得到了这样的结果:
! 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}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.
有几种方法可以解决这个问题。
手动清理来源
这是本网站大多数人推荐的。您的编辑器可能有办法显示特殊字符,以便您可以删除它们。但说真的,这不是计算机的工作吗?
在编辑器中清理源代码
对于不可见的零宽度字符,这更难,但您可以从字符映射中复制零宽度空格,打开搜索和替换对话框,然后将字符粘贴到搜索字段中。然后,您可以用类似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}fl fl fl\end{document}
虽然该\DeclareUnicodeCharacter
命令在中inputenc
,但自 2018 年起,LaTeX 内核已默认加载它。因此,我们可以跳过声明它。