为什么这个 UTF-8 错误可以通过简单的 \clearpage 来解决

为什么这个 UTF-8 错误可以通过简单的 \clearpage 来解决

下面是一个示例,其中还包括问题的描述:

\documentclass{book}

\usepackage{CJKutf8}

\begin{document}
\begin{CJK*}{UTF8}{gbsn}

Some Chinese text.

一些中文
\section{一些中文}

Compiling this with pdflatex will generate the following common error:

%! PACKAGE INPUTENC ERROR: UNICODE CHAR \U8:Ɨ� NOT SET UP FOR USE WITH LATEX.

However, when a clearpage command is included at the end of the document
(i.e., to uncomment the line below), then the error will disappear and the
document compiles correctly.
%\clearpage  % This is important; otherwise there will be a nasty UTF-8 error.

If we delete section command, the document also compiles correctly
(even without clearpage).

\end{CJK*}
\end{document}

我的问题是:为什么该\clearpage命令可以解决问题?

答案1

当 latex 尝试排版页面标题时会发生这种情况。这种情况发生在页面输出时;如果CJK*环境在最后一页输出之前结束,则进行排版所需的定义就会消失,并且您会收到此错误。

如果您将内容添加\errorcontextlines=99到文档中(CJK*请在环境之外),您会清楚地看到这一点。此外,问题也消失了\pagestyle{empty}(同样的警告),这进一步支持了我的诊断。

您已经找到了适当的解决方法:添加\clearpage您所做的位置。

已编辑添加此版本的解决方法 – 感谢 egreg 在评论中提出的意见:

\AtBeginDocument{\csname CJK*\endcsname{UTF8}{gbsn}} 
\AtEndDocument{\clearpage\csname endCJK*\endcsname}

然后,当然,您要从CJK*文档主体中删除环境。

答案2

问题是 section 命令设置了页眉。问题是 CJK 环境在页眉排版之前结束,因此中文字符不再设置。使用\clearpage使 CJK 环境跨越两页,因此在页眉排版时处于活动状态,但显然只是一种解决方法。第二个问题是书籍类页眉使用 \Makeuppercase 设置,这可能会造成很多危害(这也是错误消息使用大写字母的原因之一)。

\documentclass{book}
\renewcommand{\sectionmark}[1]{\markright{\thesection.\ #1}} %no uppercase

\usepackage{CJKutf8}


\begin{document}
\begin{CJK*}{UTF8}{gbsn}

Some Chinese text.

一些中文
\section[\protect\begin{CJK*}{UTF8}{gbsn}一些中文\protect\end{CJK*}]
        {一些中文}

Compiling this with pdflatex will generate the following common error:

%! PACKAGE INPUTENC ERROR: UNICODE CHAR \U8:Ɨ� NOT SET UP FOR USE WITH LATEX.

However, when a clearpage command is included at the end of the document
(i.e., to uncomment the line below), then the error will disappear and the
document compiles correctly.
%\clearpage  % This is important; otherwise there will be a nasty UTF-8 error.

If we delete section command, the document also compiles correctly
(even without clearpage).

\end{CJK*}
\end{document}

相关内容