朋友们,考虑以下代码:
\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}
请注意,您必须手动增加计数器以保持编号方案。