![条件加载 tocloft 导致错误](https://linux22.com/image/240941/%E6%9D%A1%E4%BB%B6%E5%8A%A0%E8%BD%BD%20tocloft%20%E5%AF%BC%E8%87%B4%E9%94%99%E8%AF%AF.png)
在寻找自定义目录的方法时,我偶然发现了此建议使用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 起什么作用?