按参考顺序对图片进行排序

按参考顺序对图片进行排序

我正在写一篇手稿,我有许多图表要放在补充信息部分 (SI)。我将引用每个图表,但我事先不知道引用它们的顺序。我希望 SI 中的图表按正文中的参考顺序排序。例如,如果我这样做

... something something figure \ref{fig_smile} something something figure \ref{fig_frown} ...

那么我希望在 SI 中,面带微笑的人物出现在皱眉的人物之前。

有没有办法自动完成这个操作?

答案1

一种使用 LuaLaTeX 的方法。其思路是,当语句中遇到每个标签时,将其存储在有序的 Lua 数组中\ref,并将每个图形的代码存储在以标签为键的关联数组中。存储所有标签和图形后,对有序标签数组进行循环,将图形输出到文档中。

为了使语法更简单并避免修改\ref,下面的 MWE 定义了一个新命令\siref,该命令使用 Lua 函数将标签存储table.insertreflist数组中,然后调用\ref自身。

此外,还定义了一个命令\sifigure,该命令有两个参数:标签和图形代码。此命令将代码存储在 Lua 数组中imglist,标签作为键。使用 将该代码传递给数组,\luaescapestring{\unexpanded{#2}}以确保图形代码中的反斜杠被转义,同时避免扩展,直到代码在 for 循环中实际传递回文档。

Lua 代码本身只包含两个列表变量和一个带有 for 循环的函数。在循环中,添加了图形环境和标签。可以通过将所有图形代码放在 的参数中来进一步简化\sifigure,在这种情况下,循环就变成了tex.sprint(imglist[lbl])

梅威瑟:

\documentclass{article}
\usepackage{graphicx}
\usepackage{luacode}
\begin{luacode}
reflist = {}
imglist = {}

function printlist()
   for _, lbl in ipairs(reflist) do
      tex.sprint("\\begin{figure}[h]" .. imglist[lbl] .. "\\label{" .. lbl .. "}\\end{figure}")
   end
end
\end{luacode}

\newcommand{\siref}[1]{%
\directlua{table.insert(reflist, "#1")}\ref{#1}%
}
\newcommand{\sifigure}[2]{%
\directlua{imglist["#1"] = "\luaescapestring{\unexpanded{#2}}"}%
}

\begin{document}
... something something figure \siref{fig_smile} something something figure \siref{fig_frown} ... something something figure \siref{fig_surprise} ...

\section*{Supplementary Information}
\sifigure{fig_frown}{\centering\includegraphics[width=3cm]{example-image}\caption{First in source}}
\sifigure{fig_smile}{\centering\includegraphics[width=3cm]{example-image-a}\caption{Second in source}}
\sifigure{fig_surprise}{\centering\includegraphics[width=3cm]{example-image-b}\caption{Third in source}}

\directlua{printlist()}
\end{document}

结果:

在此处输入图片描述

请注意,如果添加的标签已经存在,则图形将打印两次,并生成重复标签警告。您可以使用普通的\ref而不是\siref进行第二次和进一步的引用,或者编写一些额外的 Lua 代码来检查标签是否已经存在reflist(令人惊讶的是,Lua 似乎没有内置的数组成员函数)。

相关内容