我在用
\usepackage{imakeidx}
\usepackage{hyperref}
以及获取图表列表的命令\listoffigures
。有些图表是双栏的,有些是单栏的,而且 LaTeX 并不总是将它们连续放置。图表列表中的图表按页面顺序排列。
但是,我更希望按图表编号而不是页码对列表进行排序,而且对于我使用的图表数量来说,更改任何图表的编号都是不切实际的。
这是图表列表前两页的视图:
请注意,按页面排序时图号顺序不正确(第 28 页)。
这种情况能改变吗?怎样改变?
答案1
当然,David Carlisle 已经在评论中提到了正确的解决方案,即使用软件包fixltx2e
或足够新的 LaTeX 内核(现在fixltx2e
默认应用更改)。除其他优点外,这将确保图形在输出中的显示顺序与您在输入中指定的顺序相同。
但是,如果您喜欢 LaTeX 默认的做法,即以独立顺序输出单列和双列图形,则可以只按图形编号对图形列表进行排序,而不更改文档主要部分中的输出。下面的代码通过在调用lof
之前对文件的行进行排序来实现这一点\listoffigures
。用于排序的键是第二个参数的第二项\contentsline
,恰好是图形编号。可以使用类似的代码按标题或您喜欢的任何其他标准对图形进行排序。
\documentclass{article}
\usepackage[margin=2cm]{geometry}
\usepackage{imakeidx}
\usepackage{hyperref}
\usepackage{lipsum}
%%%%%%%%%%%%%%%%%%% Sorting a file
\usepackage{catchfile}
\usepackage{expl3, xparse}
\ExplSyntaxOn
\tl_new:N \l_sortfile_tl % The contents of file #1.
\seq_new:N \l_sortfile_seq % The contents, split at the delimiter #2.
\tl_new:N \l_sortfile_first_tl % Part of the file #1 before first #2.
\iow_new:N \l_sortfile_iow % The output goes there.
\tl_new:N \l_sortfile_a_tl % Used for sorting
\tl_new:N \l_sortfile_b_tl % Used for sorting
\cs_new_protected:Npn \sortfile:nnn #1#2#3
{
\IfFileExists {#1}
{ \CatchFileDef { \l_sortfile_tl } {#1} { } }
{ }
\seq_set_split:NnV \l_sortfile_seq {#2} \l_sortfile_tl
\seq_pop:NN \l_sortfile_seq \l_sortfile_first_tl
\seq_sort:Nn \l_sortfile_seq { #3 {##1} {##2} }
\iow_open:Nn \l_sortfile_iow {#1}
\tl_if_empty:NF \l_sortfile_first_tl
{ \iow_now:Nx \l_sortfile_iow { \exp_not:V \l_sortfile_first_tl } }
\seq_map_inline:Nn \l_sortfile_seq
{ \iow_now:Nn \l_sortfile_iow { #2 ##1 } }
\iow_close:N \l_sortfile_iow
}
\cs_new_protected:Npn \sortfile_contents_sort:nn #1#2
{
\tl_set:Nx \l_sortfile_a_tl { \tl_item:nn {#1} {2} }
\tl_set:Nx \l_sortfile_b_tl { \tl_item:nn {#2} {2} }
\int_compare:nNnTF
{ \tl_item:Nn \l_sortfile_a_tl {2} }
> { \tl_item:Nn \l_sortfile_b_tl {2} }
{ \sort_return_swapped: }
{ \sort_return_same: }
}
\DeclareDocumentCommand{\sortfile}{mmm}
{ \sortfile:nnn {#1} {#2} {#3} }
\DeclareDocumentCommand{\contentssort}{mm}
{ \sortfile_contents_sort:nn {#1} {#2} }
\ExplSyntaxOff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\sortfile{\jobname.lof}{\contentsline}{\contentssort}
\listoffigures
\twocolumn
\lipsum[1-5]
\begin{figure}\footnotesize\lipsum[2]\caption{First figure}\end{figure}
\lipsum[6]
\begin{figure*}\footnotesize\lipsum[2]\caption{Second figure}\end{figure*}
\lipsum[7]
\begin{figure}\footnotesize\lipsum[2]\caption{Third figure}\end{figure}
\lipsum[8]
\begin{figure}\footnotesize\lipsum[2]\caption{Fourth figure}\end{figure}
\lipsum[9-15]
\end{document}