净化参考文献中的 U+301 感染和其他感染

净化参考文献中的 U+301 感染和其他感染

我经常会弄乱参考文献数据库中格式错误的 BibTeX 文件,这些文件充斥着诸如%或 之类的活动字符(通常在摘要中,虽然不会打印出来但无论如何都会产生错误),但我可以忍受这种不便,并用或&替换它们。\%\&

此外,由于某些 UTF8 字符无法通过 进行管理,因此会出现一些输入编码错误pdflatex。在参考文献中,此错误比在正文中更令人不安,但在最好的情况下,只会将一些希腊字母更改为γ。在其他情况下,是阴险的零宽度 U+200B,但我甚至可以搜索和替换这个字符。

对我来说更糟糕的是令人讨厌的 U+301,特别是当它不在辅音上而是隐藏在元音中作为正常的尖音符号时,可以使用 完美地进行管理inputenc,即正常e字符(U+0065)加上 U+301 看起来与 á、Á、í 等类型é(U+00E9)等等完全一样,因此很难检测到有毒的变音符号。

令人失望的是,在某些编辑器中搜索 U+0065 加 U+301 也会找到单个字符 U+00E9,反之亦然,所以我最终痛苦地搜索并用单个字符版本替换每个重音字母(单或双)。

所以问题具体是:有什么巧妙的方法可以清理.bib带有 U+301 波浪号的文件吗?

(当然,更通用的答案,涵盖对所有无法识别和活跃字符的自动清理,将受到欢迎。)

最小(不)工作示例:

\documentclass{article}
\begin{filecontents}{test.bib}
@article{xx,
author={González, M. and Ruíz, P.}
title={Mañana hará calor & bochorno con un 90% de humedad}
}   
\end{filecontents}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}
\begin{document}
Hello  \cite{xx}
\bibliography{test}
\bibliographystyle{plain}
\end{document}

答案1

为了消除未解答列表中日益增多的这个问题,并希望帮助新手解决这些问题,我自己回答了如何使用和测试,uconv 但我留下了社区维基答案。我在这里不是为了寻求声誉。;)

例如,在西班牙语键盘中,用户习惯于通过输入A+获得单个字符“á” ´ ,但实际上它们可以存储为两个组合字符,或者某些程序可以决定将单个字符转换为两个字符(因为它们最初被输入)。在 Unicode 术语中,这遵循所谓的“规范化形式 D”(NFD),其中“D”代表“规范分解”,相反的是规范化形式 C(NFC),其中 C 代表“组合”。这意味着规范分解后跟规范组合(还有更多的规范化形式,但这与这个问题无关)。

据称这与最终用户无关,应该担心,因为所谓的等价性应该在程序的核心中得到解决,但现实并不那么美好:pdflatex只使用 NFC 消化文本,而且似乎大多数 TeX\BibTeX 编辑器仍然不关心这个问题。

问题不仅仅在于带重音的元音。可能的组合字符列表非常长,例如 Å、ṩ 等,因此在这种情况下,搜索和替换每个字符并不是一个现实的解决方案。

有许多页面解释了什么是 NFC,许多页面解释了如何使用这种或那种编程语言来实现,一些页面指向了可以使用 NFC 输出的工具(例如,、msortucto) ,但对于仅转码文本文件毫无用处,还有一些rsync页面convmv指向了用于此目的的正确工具:

确保 NFC 的最简单方法是uconv在 Linux 中使用(或使用 Cygwin 的 Windows 中)

uconv -x any-nfc inputfile > ouputfile

例子:

x.tex文件仅包含字符串“más más”,其中第一个“á”是U+00E1(NFC),第二个是 U+0061 + U+301,但它们看起来相等:

$ cat x.tex
más más

尽管它们并不相等,但从十六进制显示中可以清楚地看出:

$ hd x.tex
00000000  6d c3 a1 73 20 6d 61 cc  81 73                |m..s ma..s|
0000000a

仅规范化为 C 形式:

$ uconv -x any-nfc x.tex > y.tex

测试结果:

$ hd y.tex
00000000  6d c3 a1 73 20 6d c3 a1  73                   |m..s m..s|
00000009

请不要混淆这个程序iconv也是用于转码文件的程序,但是AFAIK除 Mac OS X 版本外,不处理 UTF-8 中的分解字符。

另一个解决方案是在上述链接中使用简单的 perl 脚本,但自己制作的可执行文件留给最终用户进行“维护”工作(使其广泛可用、备份等)。

另一方面,对于单个字符的问题,使用自制脚本搜索和替换最常见的违规字符可能更划算,但同样,LaTeX 中无法识别的字符列表足够大,使其成为非常糟糕的清洁解决方案。也许一些来回转码会留下更多“外来字符”?我的意思是,例如将 UTF8 转换为 ISO8859-15,然后将 ISO8859-15 转换为仅包含预组合字符的 UTF-8。例如,这种方法可以丢失隐藏且危险的“带空格的零”,但我不知道在实际文档中丢失某些字符有多重要。如果您知道更好的方法,请在此处阅读。

相关内容