\addcontentsline 的奇怪行为

\addcontentsline 的奇怪行为

使用最新的 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使用顺序是:\addcontentslinecaption

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}

相关内容