xeCJK 标点符号混乱

xeCJK 标点符号混乱

既不是问题也不是抱怨,但我发现我无法xeCJK在多语言文档(目前是法语+英语+中文)中使用,因为它会弄乱非中文部分的标点符号。例如,它会将“这个…那个”改为“这个…那个”,将“这个,那个”改为“这个,那个”,这很不方便。太糟糕了,因为这个包的其他方面都很好。

这是一个显示该问题的最小示例:

\documentclass {memoir}
\usepackage{polyglossia}
\usepackage{xeCJK} 
\setmainlanguage{french} 
\usepackage{fontspec} 
\setmainfont{TeX Gyre Pagella} 
\setCJKmainfont {STSong} 
\begin{document} 
This… that This, that 
\end{document}

输出如下:

代码输出

“这个,那个”问题仅在我将主要语言设置为法语时出现,而不是设置为英语时出现。无论主要语言是法语还是英语,都会出现“这个…那个”问题。

顺便说一句,如果这不是引起人们注意的不恰当的地方,请原谅我,但是软件包作者的电子邮件地址没有出现在文档中,我只是偶然发现了这个网站

答案1

这不是一个错误。

xeCJK将有歧义的标点符号视为 CJK 标点符号。省略号被视为 CJK 标点符号,因此它使用 STSong 字体(华文宋体),并且忽略后面的空格。

您可以使用\ldots\dots\textellipsis获得适合西方语言的省略号。(实际上,xeCJK特别使用 来修补这些宏\makexeCJKinactive。)其中任何一个都应该可以很好地与 配合使用xeCJK

This\dots that This, that

This\ldots that This, that

This\textellipsis that This, that

如果您只使用少量的 CJK 材料,Alan 的解决方案也是可取的。它有效,但缺点是您必须在chinese使用中文的每个地方手动指定环境。而且它还会禁用 的一些功能polyglossia

如果只使用几个中文单词而没有长句子,则不需要xeCJK此包。对 CJK 标点和空格的特殊处理有点过头了。xeCJK主要针对包含少量其他语言的 CJK 文档而设计。

类似的标点符号包括引号“ ”‘ ’,您应该使用传统的 TeX 格式`foo'``foo''


警告:xeCJK不应该与 一起使用polyglossiaxeCJK与之冲突polyglossia,因为它们都使用\XeTeXinterchartoks频繁,而且我找不到让它们一起工作的好方法。

xeCJK有一个\makexeCJKinactive,但在这里它没有帮助。\makexeCJKinactive只需设置\XeTeXinterchartokenstate=0然后的许多功能polyglossia也被禁用。您应该选择xeCJK和中的一个polyglossia

如果您决定不使用xeCJK,您可以设置:

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt

每次用中文都要手动设置中文字体,很适合临时排版几个中文单词,而且很安全,例如:

\documentclass{memoir}
\usepackage{polyglossia}
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt
\newfontfamily\stsong{STSong}
\newcommand\chinese[1]{{\stsong #1}}
\setmainlanguage{french} 
\setmainfont{TeX Gyre Pagella} 

\begin{document}
This… that This,
that «Chinese» % automatic spacing after « and before » obtained by polyglossia
\chinese{汉字}. % Chinese as normal text
\end{document}

但是,如果你有一些较长的中文文本,你应该使用xeCJK以便于字体切换和更好的标点符号。如果你使用来处理法语,如果你不小心,polyglossia标点符号的进度就会被打断。如果你坚持一起使用和,请使用\french@punctuationxeCJKpolyglossiaxeCJK polyglossia。这可能会产生较少的错误,但我没有做足够的测试,请自行承担风险。

\documentclass{memoir}
\usepackage{xeCJK}
\setCJKmainfont{STSong}
\usepackage{polyglossia} % It works fine only for simple text, but still dangerous
\setmainlanguage{french} 
\setmainfont{TeX Gyre Pagella} 

\begin{document}
This\ldots that This,
that «Chinese» % automatic spacing after « and before » obtained by polyglossia
文字. % Chinese handled by xeCJK

%%% Never use special puctuations handled by polyglossia together with CJK symbols!
%%% This shows a WRONG result, "文" is missing because of the « before it:
«文字»
\end{document}

在此处输入图片描述


目前我是 的活跃维护者xeCJK。如有任何关于 的问题xeCJK,您可以直接给我发电子邮件(leoliu.pku at gmail dot com)。

很抱歉xeCJK和不兼容。也许我会在将来的版本中polyglossia添加一些命令来安全禁用。xeCJK

答案2

这里至少有一个可能的解决方法,但根据您使用的特定语言,它可能不是最佳解决方案,因为xeCJKpolyglossia彼此并不真正兼容。在决定采用我的答案作为可能的解决方案之前,请先阅读 Leo 的答案。 xeCJK提供两个命令来打开和关闭其间距/标点符号代码。如果您决定这样做,您应该加载polyglossia xeCJK。如果您的主要语言不是中文,那么只需使用文档开头的命令并创建一个chinese有选择地打开它的环境。

但是,正如 Leo 的回答中指出的那样,这也会关闭任何特殊的标点符号处理(可能还有其他东西)polyglossia,因此它可能并不在所有情况下都起作用。

% !TEX TS-program = XeLaTeX

\documentclass {memoir} 
\usepackage{xeCJK} 
\usepackage{polyglossia} % use it AFTER xeCJK. But still dangerous. (comment by Leo)
\setmainlanguage{french} 
\usepackage{fontspec} 
\setmainfont{TeX Gyre Pagella} %
\setCJKmainfont {STSong}
\newenvironment{chinese}
{\makexeCJKactive} % punctuation functions from polyglossia are also
%                    disabled if you use this (by Leo)
{\par}
\begin{document}
\makexeCJKinactive
This… that This, that This. That. This; that.

\begin{chinese}
This… that This, that This. That. This; that.
\end{chinese}

This… that This, that This. That. This; that.
\end{document}

代码输出

相关内容