我在 Windows 上的 MiKTeX 2.9 环境中使用 XeTeX。最近,我将 xeCJK 包添加到一个较大的文档中,以包含一段简短的中文段落。然而,这导致(除其他外)数字符号以错误的字体显示:它会自动切换到 MingLiU 而不是 Linux Libertine。以下是一个例子:
\documentclass{article}
\usepackage[no-math]{fontspec}
\usepackage[indentfirst=false]{xeCJK}
%\usepackage[fallback,indentfirst=false]{xeCJK}
\usepackage{amsmath}
\setmainfont[Mapping=tex-text,Variant=01]{Linux Libertine O}
\setCJKmainfont{MingLiU}
%\setCJKfallbackfamilyfont{rm}{Linux Libertine O}
\usepackage{xltxtra}
\usepackage[russian,ngerman,american]{babel}
\usepackage{ifthen}
\usepackage{fancyhdr}
\usepackage{setspace}
\usepackage{enumitem}
\usepackage{graphicx}
\usepackage{hyperref}
\begin{document}
漢語大詞典 Test test
\No 3
\end{document}
我能否以某种方式防止这种情况发生,例如通过在 \No 之前明确选择一种字体或通过停用 CJKmainfont 的自动选择(这只是一小段文字,我可以轻松地用宏将其括起来)?
除了“\No”之外,我还尝试了 textcomp 包中的 \textnumero,结果相同。
谢谢你!
答案1
这对我有用(不使用 xeCJK)
\documentclass{article}
\usepackage{amsmath}
\usepackage[no-math]{fontspec}
\setmainfont[Mapping=tex-text,Variant=01]{Linux Libertine O}
\newfontfamily\MingLiu{MingLiU.ttf}
\usepackage[russian,ngerman,american]{babel}
\begin{document}
{\MingLiu 漢語大詞典} Test test
\No 3
\end{document}
答案2
暂时停用 xeCJK 并重新定义\No
。
\documentclass{article}
\usepackage[no-math]{fontspec}
\usepackage[indentfirst=false]{xeCJK}
\setmainfont[Ligatures=TeX]{Lucida Grande}
\setCJKmainfont{Kaiti SC}
\usepackage{newunicodechar}
\newunicodechar{№}{{\makexeCJKinactive №}}
\let\No №
\begin{document}
漢語大詞典 Test test
№3 \No 3
漢語大詞典 Test test
\end{document}
我使用了 Lucida Grande 来更好地显示选择了正确的字体。
你可能只是重新\No
定义
\protected\def\No{{\makexeCJKinactive^^^^2116}}
而不是上面三行,但是直接使用Unicode字符是不行的。
答案3
似乎有一个错误,xeCJK
将№
(U+2116) 视为 CJK 全宽左标点。此错误出现在xeCJK
版本 3.0.3(ctex-kit 项目的 r323)中。我会修复它。
在修复此错误之前,您可以使用
\xeCJKDeclareCharClass{Default}{"2116}
来解决问题。
完整示例:
\documentclass{article}
\usepackage[indentfirst=false]{xeCJK}
\setmainfont[Mapping=tex-text,Variant=01]{Linux Libertine O}
\setCJKmainfont{MingLiU}
\xeCJKDeclareCharClass{Default}{"2116}
\begin{document}
漢語大詞典 Test test
\textnumero 3 №3
\end{document}
笔记:
Herbert 的解决方案确实有效,但它禁用了 的所有功能xeCJK
,包括正确的换行。如果您只需要排版几个 CJK 字符,那么这就是解决方案。但是,如果要排版多个段落,我认为这不是一个好方法。
egreg 的快速解决方案比 Herbert 的要好,但是newunicodechar
有点过度了。