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(在您的情况下,xelatex
或lualatex
)。那么您不需要 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}'
(显然,所有内容都在一行中)...并且可能将其修改成某种脚本。