LaTeX 对 BOM(Unicode 的字节顺序标记)感到困惑。

LaTeX 对 BOM(Unicode 的字节顺序标记)感到困惑。

Unicode 采用以下惯例:字节顺序标记作为文本流开头的签名,标识其中使用的编码。文件开头的以下三个字节:EF BB BF,标识此文件为 UTF8 文件。Vi 和大多数文本编辑器都会优雅地忽略此签名。Open Office 也是如此,但它会在开头添加此签名。

现在,如果我使用 OpenOffic.org 打开 TeX 文件,并且我经常这样做(进行混合方向性编辑),则会添加签名,这会使 LaTeX 感到困惑,从而产生如下错误消息:

 ! LaTeX Error: Missing \begin{document}.

 See the LaTeX manual or LaTeX Companion for explanation.
 Type  H <return>  for immediate help.
 ...                                              

l.1 
 ��\documentclass{article}

而简单的文件转储不会显示问题。有没有办法消除这个问题,同时又不超出 latex 的范围?

答案1

inputenc 包只有在加载后才能工作,因此显然不能在文档一开始就工作。在此之前,只能使用 ASCII。

对于真正的 Unicode 处理,请使用支持 Unicode 的引擎,如 XeTeX 或 LuaTeX(在您的情况下,xelatexlualatex)。那么您不需要 inputenc(并且可能还想更改一些其他包)。

更新:从 2018 年 4 月的 LaTeX 版本开始,UTF-8 也是非 Unicode 引擎的 LaTeX 的默认编码。因此,此错误不再会发生(不过,对于非 Unicode 文档,您可能会收到不同的错误)。请参阅LaTeX 新闻 28(PDF)详情。

答案2

例如,您可以在输入文件之前更改三个有问题的字节的 \catcode:

pdflatex \catcode239=9 \catcode 187=9 \catcode 191=9 \input test-bom

然后您应该将文档中的 catcode 重置为 12。

答案3

随着即将发布的 LaTeX 版本(2018),BOM 问题将在内核级别得到解决,这样就不再需要在其他答案中尝试的繁琐工作(当然到目前为止这是必要的),即使对于 pdftex / 8bit-TeX 引擎也是如此。

答案4

即使您使用正确的输入编码,在输入其他文件时也会出现问题\input。例如,假设您有一个(可能生成的)文件BOM-problem.tex(其中包含 BOM 标记),并且您执行以下操作:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\begin{document}
    \input{BOM-problem.tex}
\end{document}

你会得到错误

BOM-problem.tex|1 error| Package inputenc Error: Unicode char  (U+FEFF)

我的解决方案是简单地添加

\DeclareUnicodeCharacter{FEFF}{}

在序言中---不再有错误或警告。

我经常在使用 LibreOffice 将文件保存为 UTF-8 时遇到这种情况 --- 因此我希望它至少有助于解决 OP 问题的子集。

如果问题是完整的 latex 文件前面有 bom,你可以(混合此解决方案和@Paŭlo Ebermann一个在上面的评论中)执行以下操作:

 pdflatex -jobname=filewithBOM \
 '\RequirePackage[utf8]{inputenc}\DeclareUnicodeCharacter{FEFF}{}\input{filewithBOM.tex}' 

(显然,所有内容都在一行中)...并且可能将其修改成某种脚本。

相关内容