\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>}
都会切换到中文字体。