我正在使用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:我知道有ctex
,xeCJK
等等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}
如果您有条件,您还可以使用名为 的 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}
然而,我不确定这些是否是让原帖者满意的解决方案,而且我发现它们很不方便。