使用 microtype 和 xeCJK 包时出错

使用 microtype 和 xeCJK 包时出错

我想在一个文档中使用microtype和包:xeCJK

\documentclass{scrreprt}
\usepackage{microtype}
\expandafter\let\csname xetex_suppressfontnotfounderror:D\endcsname
\suppressfontnotfounderror
% the above two lines are a necessary fix to a temporary problem
% of a package lagging behind in CTAN
\usepackage{xeCJK}
\setCJKmainfont{Source Han Sans}
\begin{document}
Hello world.
\end{document}

但一直出现这个错误:

!Undefined control sequence
<argument> \ifpdf 

                  \expandafter \@secondoftwo \else \expandafter \@firstoftwo...
l.7 \begin{document}

如果我删除 xeCJK 或 microtype,则不会出现错误。这些软件包在其各自的文档中均未列出不兼容问题。是我这边出了错误,还是有方法可以解决问题?

答案1

似乎是其中一个已加载的软件包中的一个错误,它没有定义,但你可以添加

\usepackage{ifpdf}

回到序言,让事情开始运转。

似乎是 的第 1174 行microtype.sty。一个可能的修复方法是添加\RequirePackage{ifpdf}如下内容:

        {\RequirePackage{ifpdf}\ifpdf\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}%

我会联系作者。

答案2

这个xeCJK包欺骗 LaTeX 让它认为已经CJKutf8.sty被加载了:

78 \clist_map_inline:nn { CJKulem , CJKvert , CJKpunct , CJKutf8 , CJK }
79   {
80     \xeCJK_if_package_loaded:nTF {#1}
81       { \msg_error:nnn { xeCJK } { incompatible-package } {#1} }
82       { \tl_const:cn { ver@ #1 . \c__xeCJK_package_ext_tl } { 9999/99/99 } }
83   }

接下来,microtype.sty

1165 \MT@addto@setup{%
1166   \@ifpackageloaded{CJK}{%
1167     \@ifpackagelater{CJK}{2006/10/17}% 4.7.0
1168       {\def\MT@orig@pickupfont{\CJK@ifundefined\CJK@plane}}%
1169       {\def\MT@orig@pickupfont{\@ifundefined{CJK@plane}}}%
1170     \g@addto@macro\MT@orig@pickupfont
1171       {{\expandafter\ifx\font@name\relax\define@newfont\fi}}%
1172     \@ifpackageloaded{CJKutf8}%
1173       {\@ifpackagelater{CJKutf8}{2008/05/22}% 4.8.0
1174         {\ifpdf\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}%
1175         {\@firstoftwo}}%
1176       {\@firstoftwo}%
[...]

问题就在这里显现出来,CJKutf8.sty因为

32 \RequirePackage{ifpdf}

但由于未输入包裹代码,因此包裹未读入。

软件包xeCJK应该加载ifpdf,因为问题是它的错。另一方面,microtype加载它也是非常合理的。

相关内容