确保浮动元素按第一次引用的顺序显示

确保浮动元素按第一次引用的顺序显示

本网站和其他地方有很多关于确保浮动按照其在源文件中的放置顺序显示的问题。我想要的是不同的——我的所有浮动都位于文档的末尾,并且希望确保浮动按照其在源文件中的放置顺序显示引用使用\ref\autoref。使用类似endfloat包的东西是不够的,因为这需要我确保浮点数的源顺序与参考顺序相同。在编辑过程中很容易破坏此顺序。

有某种流程可以自动检查这一点并要求手动调整就足够了。只要我不必再手动检查图 13 是否在图 14 之前的输出文本中被引用即可。

答案1

注释掉该\figuresatendtrue论文将照常编译(带有图片)。否则,它们将按照参考文献的顺序放在最后。

\documentclass{article}
\usepackage{environ,etoolbox}
\usepackage{lipsum}
\usepackage{hyperref}

\newif\iffiguresatend
\figuresatendtrue

\makeatletter
\iffiguresatend

\NewEnviron{figureatend}[2][\fps@figure]{%
  % #1 = placement options
  % #2 = key
  \global\expandafter\def\csname figureatend@store@#2\expandafter\endcsname
    \expandafter{\BODY\label{#2}}}

\providecommand\@namelet[1]{\expandafter\let\csname#1\endcsname}
\def\figureatend@save{}
\def\figureatend@ref#1{%
    \g@addto@macro\figureatend@save{\figureatend@do{#1}}}
\def\figureatend@do#1{%
   \@ifundefined{figureatend@store@#1}{}{%
     \begin{figure}[p]\@nameuse{figureatend@store@#1}\end{figure}%
     \global\@namelet{figureatend@store@#1}\relax}}
\AtEndDocument{
  \ifx\figureatend@save\@empty\else
    \clearpage
    \figureatend@save
  \fi}

\pretocmd\@setref{\figureatend@ref{#3}}{}{}

\else

\newenvironment{figureatend}[2][\fps@figure]
  {\def\figureatendtemp{#2}\begin{figure}[#1]}
  {\label{\figureatendtemp}\end{figure}}

\fi


\begin{document}

\section{abc}\label{abc}

\ref{abc}--\ref{AAA}\lipsum[1] 

\begin{figureatend}{BBB}
\caption{Figure BBB}
\end{figureatend}

\begin{figureatend}{AAA}
\caption{Figure AAA}
\end{figureatend}

\ref{BBB}\ref{AAA}\autoref{AAA}

\end{document}

评论

这个想法是收集图形和参考资料的代码。每个命令\ref{label}(以及\autoref{label}是否hyperref加载)都会\figureatend@save通过添加\figureatend@do{label}来更新内部变量。最后我们将执行这个宏,稍后再看。

每个figureatend环境都以通常的定位规范作为可选参数;如果我们处于“endfigures”模式,它们将被忽略,但对于打印带有图形的文档很方便。强制参数是引用该图形的标签一定不能放置在 之后\caption,这与通常的格式相反。(在这种环境下拦截命令会非常困难,\label而且标签无论如何都是必需的。)

在结束图形模式下,环境的内容变成宏的替换文本\figureatend@store@label,其中label是环境的参数。

在运行结束时(使用\AtEndDocument),我们检查\figureatend@save宏是否为非空,并执行它,也就是我们执行

\figureatend@do{label}

对于label在 LaTeX 运行期间找到的每个宏(按出现的确切顺序)。宏\figureatend@do{label}只检查是否\figureatend@store@label已定义,如果已定义,则

\begin{figure}[p]
<的内容 figureatend 环境标签为 label> \label{label}\end{figure}

如果宏被定义;否则它不执行任何操作。

与往常一样,需要运行几次 LaTeX。

如果该\figuresatend行被注释掉,figureatend环境就仅仅成为一个环境,并且不会向相关的宏figure添加任何内容。\ref\@setref

相关内容