我想在一个文档中使用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
加载它也是非常合理的。