CJK 中某些汉字出错

CJK 中某些汉字出错

我正在使用CJK包来排版繁体中文文本。当使用Big5编码,某些字符将会被破坏:

\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK*}{Bg5}{bsmi}
認識
\end{CJK*}
\end{document}

然后我得到

Runaway argument?
{ \end {CJK*} \end {document} 
! File ended while scanning use of \CJK@XX.
<inserted text> 
                \par 

如果我删除(第一个字符),那么一切都会正常。

有同样的效果。

类似但不相同的结果是

! Argument of \CJK@XX has an extra }.
<inserted text> 
                \par 
l.6 開

我猜问题出在背后的 catcode 机制上CJK。那么有人能帮我解决吗?

PS:我知道有ctexxeCJK等等luatex-ja。但我只需要测试CJK包,使用Big5编码。顺便说一句,GBK和UTF8没有这样的问题。

答案1

您的问题是由有问题的字符的第二个字节引起的。

我先列举几个复现该问题的字符(括号内的十六进制码是对应字符在Big5编码中的码点)。

  • ! File ended while scanning use of \CJK@XX.:認 (0xBB7B)、程 (0xB57B) 和臨 (0xC17B)
  • ! Argument of \CJK@XX has an extra }.: 開 (0xB67D)、稀 (0xB57D)、和飼 (0xB97D)

您可能会注意到,所有导致错误的字符! File ended while scanning use of \CJK@XX.的第二个字节都是 0x7B。在 ASCII 代码中,0x7B 表示{,这对 LaTeX 来说具有特殊含义。因此, 認 的一部分被解释为不平衡的左括号,因此出现错误。同样的解释也适用于! Argument of \CJK@XX has an extra }.因为 ASCII 代码中的 0x7D 表示}

有时,还会发生更奇怪的事情。下面的代码可以排版而不会出错,但输出却完全出乎意料(当然是 Big5 编码的)。

\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK*}{Bg5}{bsmi}
臨開
\end{CJK*}
\end{document}

意外的输出

考虑到褻在Big5编码中的码位是0xC1B6,出现这种情况也就不足为奇了。

为了克服这个限制,CJK软件包准备了一个实用程序bg5conv以及sjisconv(用于 Shift_JIS)和extconv(用于 Big5+ 和 GBK)。这些程序将字符转换为安全形式,以便与 LaTeX 兼容。

使用选项排版以下代码-shell-escape,您将获得所需的输出。

\RequirePackage{filecontents}
\begin{filecontents}{\jobname-input.tex}
認程臨開稀飼
\end{filecontents}
\immediate\write18{bg5conv <\jobname-input.tex> \jobname-processed.tex}
\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK}{Bg5}{bsmi}
  \input{\jobname-processed.tex}
\end{CJK}
\end{document}

bg4conv

如果您有条件,您还可以使用名为 的 shell 脚本包装器bg5pdflatex,它会转换整个源代码,然后运行 ​​pdfLaTeX。这不需要-shell-escape选项陈猛的评论

% Typeset this with bg5pdflatex or bg5latex.
\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK}{Bg5}{bsmi}
認程臨開稀飼
\end{CJK}
\end{document}

然而,我不确定这些是否是让原帖者满意的解决方案,而且我发现它们很不方便。

相关内容