xeCJK:增加选项处理引号的样式
Unicode 中的引号、省略号、间隔号的编码是中西文共用的,xeCJK 会设置这几个字符使用中文字体。 我建议增加一个选项允许切换这几个符号使用西文字体,这样可以在以西文为主的文章中插入汉字而不影响引号的字形。
\documentclass{article}
\usepackage{xeCJK}
\setCJKmainfont{SimSun}
\begin{document}
a``a''a'a\par
a“a”a’a
\end{document}
使用 xelatex 排版的结果是:

去掉 xeCJK 相关的命令后,使用 pdflatex 排版的效果是:

另外,建议 ctex 的文档类在设置 scheme=plain 时,引号等符号使用西文的字形。
中西文的标点符号码位共享的确让人头疼。不过,在第一例中,仍然可以通过 TeX 本身的合字获取西文字体的标点:两个 U+0060 `` 对应西文的左双引号、三个 U+002D --- 对应西文的 em dash(我的这条评论)等等。书写长篇西文时,个人并没有通过输入法获取 U+201C “、U+2014 — 这些字符的经验,基本都是按照 TeX 原生的习惯书写。如果只为插入少数几个汉字,直接搭配 \makexeCJKactive/\makexeCJKinactive 感觉就可以了。
CTeX 文档类选项 scheme 主要涉及汉化,而 scheme = plain 时“只提供了中文支持功能”,感觉跟标点符号有些不沾边。同样地,如果引擎是 XeLaTeX,用 \makexeCJKactive/\makexeCJKinactive 也应该够了。
以下一个简单的 switch 也可以考虑:
% !TeX program = XeLaTeX
% !OS = Windows 8.1
\documentclass{article}
\usepackage{xeCJK}
\setCJKmainfont{SimSun}
\ExplSyntaxOn
\NewDocumentCommand \xeCJKUseLatinPunct { }
{
\xeCJKDeclareCharClass { HalfLeft }
{
"2018 , "201C
}
\xeCJKDeclareCharClass { HalfRight }
{
"00B7 , "2019 , "201D , "2013 , "2014 , "2025 , "2026 , "2027 , "2E3A
}
}
\ExplSyntaxOff
\begin{document}
a``a''a'a中文\par
a“a”a’a中文\par
\xeCJKUseLatinPunct
a“a”a’a中文\par
\xeCJKResetPunctClass
a“a”a’a中文
\end{document}

@RuixiZhang42 啊我没注意到 xeCJKactive 这个选项,感谢提供的 switch!
这个问题的原由是学校论文的模板,某留学生在正文中使用英文写的,并且使用了 unicode 引号和撇号。但是论文的封面页必须用中文,所以依赖 xeCJK,所以才出现了这个问题。
我认为在西文中使用 U+201C “ 等符号是没什么问题的,因为现在很多编辑器都有“smart quote”功能,而且在 mac 下可以用 option + [ / ] / { / } / - 输入 “ / ‘ / ” / ’ / – 等 unicode 字符。
关于 scheme = plain “只提供了中文支持功能”,我认为是在加了 \usepackage[UTF8,scheme=plain]{ctex} 前后不应该造成西文的变化,包括西文的标点符号,不应该进行汉化处理。
@zepinglee 倒也不是标点汉化。一切都是码位共享惹的祸,总得把这些共享的标点归为某一类。另,\makexeCJKinactive 了之后汉字就完全不能处理了,所以自造的 \xeCJKUseLatinPunct 还是比较方便。我个人还是偏向 TeX 原生的书写习惯。
注:源代码稍作了修改,不把共用标点归入 Default 类,而是相应地归入 HalfLeft 与 HalfRight 类。
嗯,确实是 unicode 的锅,但是这里正因为是 ambiguous 才有必要做个接口供用户选择。
顺便发现 https://github.com/CTeX-org/ctex-kit/blob/54b341ca9c28049e84c3a6a69c1a4d58b6612f1a/xeCJK/xeCJK.dtx#L8616 的 ambiguous 拼错了
顺便发现
Line 8616 in 54b341c
\prop_const_from_keyval:Nn \c_@@_ambigious_char_prop 的 ambiguous 拼错了
给这个拼写错误单独开了一个 issue(#390),并提交了一个 pull request(#391)来修复它。