条件加载 tocloft 导致错误

条件加载 tocloft 导致错误

在寻找自定义目录的方法时,我偶然发现了此建议使用tocloft。根据建议(和文档),我设置了一个条件,用于测试是否存在subfig并适当地加载包。

这个最小[非]工作示例:

\documentclass{article}
\@ifpackageloaded{subfig}
    {\usepackage[titles,subfigure]{tocloft}}
    {\usepackage[titles]{tocloft}}

\begin{document}
    \tableofcontents
    \section{Section 1}
    Hello 1
    \section{Section 2}
    Hello 2
    \section{Section 3}
\end{document}

产生几个错误,包括:

./tocloft.tex:3: You can't use `\spacefactor' in vertical mode.
\@->\spacefactor 
Removing the call to `\@ifpackageloaded` and explicitly specifying 

Missing character: There is no è in font cmex10!
/usr/local/texlive/2011/texmf-dist/tex/latex/tocloft/tocloft.sty:35: You can't 
use `\spacefactor' in vertical mode.
\@->\spacefactor 

寻找解决方案时,TeX FAQ 表明这是使用包的结果“...没有采取‘预防措施’的内部命令”。明确调用\usepackage[titles,subfigure]{tocloft}或 可以\usepackage[titles]{tocloft}像宣传的那样工作,这也是我目前解决问题的方法。不过,作为安全预防措施,我希望实现条件加载。

为了进一步了解 (La)TeX 内部结构,我想知道导致此错误的根本原因。这是我 (MacTeX 2011) 安装特有的问题吗?还是其他人可以重现此问题?此外,在这种特定情况下可以做些什么来修复它?也许是软件包的当前维护者可以对此提供一些见解。

答案1

这里的问题很常见。 的使用@仅限于样式文件。如果您想在文档序言(或其他地方)中使用它,则需要使用

\makeatletter
...
\makeatother

对。因此,在你的序言中,使用

\makeatletter
\@ifpackageloaded{subfig}
    {\usepackage[titles,subfigure]{tocloft}}
    {\usepackage[titles]{tocloft}}
\makeatother

阅读条目宏名称中的 @ 和 @\spacefactor 投诉关于 TeX FAQ,以及讨论\makeatletter 和 \makeatother 起什么作用?

相关内容