使用最新的 TeXlive 2012(包含所有更新),这个小文档将生成一个奇怪的 AUX 文件:
\documentclass{book}
\usepackage[list=on]{subcaption}
% Suppress writing the definition of \caption@xref to the AUX file (does not help)
\makeatletter
\let\caption@@@xlabel\@empty
\makeatother
% Show the order of \addcontentsline use
\let\xxxxx\addcontentsline
\renewcommand\addcontentsline[3]{%
\typeout{#1 - #2}%
\xxxxx{#1}{#2}{#3}}
\begin{document}
\listoffigures
\begin{figure}
\centering
\subcaptionbox{\label{A}}{A}
\subcaptionbox{\label{B}}{B}
\caption{X}
\end{figure}
\end{document}
从重新定义的输出中可以看到,包的\addcontentsline
使用顺序是:\addcontentsline
caption
lof - figure
lof - subfigure
lof - subfigure
但 AUX 文件随后包含:
\relax
\@writefile{lof}{\contentsline {subfigure}{\numberline {a}{\ignorespaces \caption@gobble {A}\relax }}{1}}
\@writefile{lof}{\contentsline {subfigure}{\numberline {b}{\ignorespaces \caption@gobble {B}\relax }}{1}}
\newlabel{A}{{1a}{1}}
\newlabel{sub@A}{{a}{1}}
\newlabel{B}{{1b}{1}}
\newlabel{sub@B}{{b}{1}}
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces X\relax }}{1}}
因此,AUX 文件内代码行的顺序与使用顺序不一致\addcontentsline
。
有人知道这里发生了什么以及如何解决这个问题?
附言:由于某种我还不明白的原因,示例文档在使用我的caption
软件包的 v3.2f 时运行良好,但在版本 v3.3 上失败——尽管我没有改变延迟子图 LOF 条目的算法。
答案1
如果你使用
\renewcommand\addcontentsline[3]{%
\immediate\write20{!!#1 - #2}%
\write20{??#1 - #2}%
\xxxxx{#1}{#2}{#3}}
你得到
!!lof - figure
!!lof - subfigure
!!lof - subfigure
??lof - subfigure
??lof - subfigure
??lof - figure
立即写入反映了执行的顺序,但 toc 需要延迟写入才能获取页码,这反映了\write
框中节点的顺序\shipout
编辑:在这种情况下,主要问题是子标题目录线被延迟到图形之外,这意味着它们位于第 1 页的主要垂直列表中,因此位于图形框中的主标题之前,因此在第 2 页上发出(如果您[p]
按照评论中的建议添加)。
您可以强制将文字放在图形内,但我不确定为什么包会延迟它,所以这可能会破坏某些东西
\documentclass{book}
\usepackage[list=on]{subcaption}
% Suppress writing the definition of \caption@xref to the AUX file (does not help)
\makeatletter
\let\caption@@@xlabel\@empty
% Show the order of \addcontentsline use
\let\xxxxx\addcontentsline
\renewcommand\addcontentsline[3]{%
\immediate\write20{!!#1 - #2}%
\write20{??#1 - #2}%
\xxxxx{#1}{#2}{#3}}
%\showoutput
\begin{document}
\listoffigures
%\tracingall
xxx
{%
\begin{figure}[p]
\centering
\subcaptionbox{\label{A}zzz}{Accc}
\subcaptionbox{\label{B}}{B}
\caption{X}
%%%% Keep writes inside the float
\caption@subcontentslines
\global\let\caption@subcontentslines\@empty
\end{figure}
}
\end{document}