xeCJK 破坏非中文字符

xeCJK 破坏非中文字符
\documentclass{article}
\usepackage{fontspec}
\usepackage{xeCJK}
\setCJKmainfont{AR PL UMing CN}
\begin{document}

something…

x’s

\end{document}

给出以下输出:

破碎的字符

显然这三个点显示得太高了,并且在撇号后面插入了一个额外的空格。

注释掉两xeCJK行相关的代码:

普通的

奇怪的是,在没有注释的fontspec版本中,xeCJK三个点和撇号会被忽略。我猜这里使用了一些非标准字符,然后用xeCJK? 来处理。我最好的解决方案是将它们替换为诸如...和 之类的替代字符'。只是我担心这只是冰山一角,在一本超过 300 页的书中,还会有更多惊喜,我可能不像发现这两个那样容易发现,而且日志文件也没有告诉我任何相关信息。而整个故事只是八个汉字单词……我该如何最好地解决这个问题?

事实上,在我的日志文件中,我有三个类似的例子

LaTeX Font Warning: Font shape `EU1/ARPLUMingCN(0)/m/sc' undefined
(Font)              using `EU1/ARPLUMingCN(0)/m/n' instead on input line 292.

显然没有 CJK 字体的任何it/ sl/sc形状,但这也帮不上什么忙。我可以增加xelatex日志文件中字体更改报告的详细程度吗?

答案1

字符 U+2026(水平省略号)和 U+2019(右单引号)确实会触发切换到 CJK 字体,因为它们被分配给字符类 3。将它们重新分配给类 0 似乎可以解决问题:

\documentclass{article}
\usepackage{fontspec}
\usepackage{xeCJK}
\setCJKmainfont{SimSun}

\AtBeginDocument{%
  \XeTeXcharclass`^^^^2026=0
  \XeTeXcharclass`^^^^2019=0
}

\begin{document}

something…else

x’s

x's

\end{document}

但是,您可以使用'(无向引号)来获取正确的单引号(或撇号),因为默认映射会在 XeTeX 执行与字符类相关的作业后发生更改。

在此处输入图片描述

您可以使用\makexeCJKinactive并重新启用自动字体切换功能\makexeCJKactive(或关闭您已设置前一个命令的组)来禁用它。

\documentclass{article}
\usepackage{fontspec}
\usepackage{xeCJK}
\setCJKmainfont{SimSun}

\makexeCJKinactive % it's active by default

\begin{document}

something…else

x’s

x's

\makexeCJKactive

something…else

\end{document}

在此处输入图片描述

如果你xeCJK只用来排版几个中文单词,你可以定义一个命令

\NewDocumentCommand{\textzh}{m}{%
  \begingroup\makexeCJKactive#1\endgroup
}

但在这种情况下使用xeCJK似乎是一把大锤,因为用声明字体系列和fontspec定义与上述类似的命令会更容易:

\newfontfamily{\zhfont}{SimSun}% or whatever
\DeclareTextFontCommand{\textzh}{\normalfont\zhfont}

两种情况下,\textzh{<Chinese text>}都会切换到中文字体。

相关内容