根据群组创建人物列表

根据群组创建人物列表

朋友们,考虑以下代码:

\documentclass{article}

\usepackage{graphicx}
\usepackage{lipsum}

\begin{document}

\listoffigures

\newpage

\lipsum[2]

\begin{figure}[h]
\centering
\includegraphics{imgs/shark.png}
\caption{A shark.}
\label{fig:shark}
\end{figure}

\lipsum[2]

\begin{figure}[h]
\centering
\includegraphics{imgs/duck.png}
\caption{A duck.}
\label{fig:duck}
\end{figure}

\lipsum[2]

\begin{figure}[h]
\centering
\includegraphics{imgs/elephant.png}
\caption{An elephant.}
\label{fig:elephant}
\end{figure}

\lipsum[2]

\end{document}

基本上,我有一些文本和三个数字,如输出所示:

我的文档

我还有一个\listoffigures

图片列表

我想知道是否可以基于组创建数字列表。例如,按栖息地对这些动物进行分组:

第一份数字列表

生活在水中的动物

1. 一条鲨鱼。 .................. 2

第二份图表

生活在陆地上的动物

2. 一只鸭子。....................2

3. 一头大象。...... 2

我还想知道是否有可能存在交集,例如鸭子可以同时出现在两个列表中。我在想是否有这样的神奇命令:

...
\magicalcommandhere{water}
\includegraphics{imgs/shark.png}
...
\magicalcommandhere{water,land}
\includegraphics{imgs/duck.png}
...    
\magicalcommandhere{land}
\includegraphics{imgs/elephant.png}
...
\magicallist{water}
\magicallist{land}
...

我正在考虑float第一次尝试的包装,但我不确定这是否是正确的选择。

有任何想法吗?

答案1

\documentclass[a4paper]{book}

\makeatletter
\newcommand\newkind[2]{%
  \protected\@namedef{div@#1}{\addto@kind{#1}}%
  \@namedef{div@head@#1}{#2}}
\protected\def\div@water{}
\protected\def\div@land{}
\def\divcaption#1#2{\caption{#2}% generate the caption and the number
  \def\div@list{#1}%
  \@for\next:=\div@list\do
    {\edef\div@write{\write\tf@divided{\csname div@\next\endcsname{%
       \unexpanded{\noexpand\contentsline{figure}}
       {\unexpanded{\noexpand\numberline}{\thefigure}{\ignorespaces
        \unexpanded{#2}}}{\unexpanded{\thepage}}}}}\div@write}
}
\newcommand{\categorize}[1]{\def\div@list{#1}%
  \@for\next:=\div@list\do{\global\@namedef{div@kind@\next}{}}
  \chapter{\listfigurename}
  \@input{\jobname.div}
  \@for\next:=\div@list\do{\expandafter\div@print\expandafter{\next}}
  \if@filesw
    \newwrite\tf@divided
    \immediate\openout\tf@divided=\jobname.div\relax
  \fi
}
\newcommand{\addto@kind}[2]{%
  \expandafter\g@addto@macro\csname div@kind@#1\endcsname{#2}}
\newcommand{\div@print}[1]{\section*{\@nameuse{div@head@#1}}\csname div@kind@#1\endcsname}
\makeatletter

\newkind{water}{Animals living in water}
\newkind{land}{Animals living on land}

\begin{document}
\frontmatter
\categorize{water,land}

\mainmatter
\chapter{Pippo}
\begin{figure}
\divcaption{water}{Whale}
\end{figure}
\begin{figure}
\divcaption{water,land}{Duck}
\end{figure}
\end{document}

当然这需要一些改进。

它的工作原理是定义一个新的输出流,我们在其中写入类似于文件的条目.lof,但作为合适宏的参数给出;例如,\divcaption{land}{Tiger}

\div@land{\contentsline{figure}{\numberline{1}{\ignorespaces Tiger}{2}}

假设它是第 2 页的图 1。\divcaption{water,land}{Frog}我们会得到两行:

\div@water{\contentsline{figure}{\numberline{2}{\ignorespaces Frog}{4}}
\div@land{\contentsline{figure}{\numberline{1}{\ignorespaces Frog}{4}}

命令读取文件的\categorize方式与读取图形列表的方式相同。此命令以逗号分隔的“种类”列表作为参数,按照我们希望的顺序列出它们。命令\div@water\div@land将它们的参数添加到每种类型的容器中,当文件完全读入时,容器将展开,从而打印标题,然后是条目。类型是预先用定义的\newkind{name}{header}

答案2

借助该caption包,您可以实现您的愿望。这个想法是为每个类别声明一个新的标题类型,然后使用\captionof\addcontentsline决定相应条目应放在哪个列表中。一个小例子:

\documentclass{article}
\usepackage{caption}

\DeclareCaptionType[fileext=wat]{water}[Figure][Animals that live in water]
\DeclareCaptionType[fileext=lan]{aland}[Figure][Animals that live in land]

\begin{document}
\listoffigures
\listofwaters
\listofalands

\begin{figure}[!ht]
  \centering
  A shark
  \captionof{water}{A shark}
  \addcontentsline{lof}{figure}{\protect\numberline{\thewater}A shark}
  \label{fig:shark}
  \stepcounter{aland}
  \stepcounter{figure}
\end{figure}

\begin{figure}[!ht]
  \centering
  A duck
  \captionof{aland}{A duck}
  \addcontentsline{wat}{figure}{\protect\numberline{\thealand}A duck}
  \addcontentsline{lof}{figure}{\protect\numberline{\thealand}A duck}
  \label{fig:duck}
  \stepcounter{water}
  \stepcounter{figure}
\end{figure}

\begin{figure}[!ht]
  \centering
  An elephant
  \captionof{aland}{An elephant}
  \addcontentsline{lof}{figure}{\protect\numberline{\thealand}An elephant}
  \label{fig:elephant}
  \stepcounter{water}
  \stepcounter{figure}
\end{figure}

\end{document}

请注意,您必须手动增加计数器以保持编号方案。

相关内容