![“列表的列表”,类似于 \listoftables 或 \listoffigures?](https://linux22.com/image/312022/%E2%80%9C%E5%88%97%E8%A1%A8%E7%9A%84%E5%88%97%E8%A1%A8%E2%80%9D%EF%BC%8C%E7%B1%BB%E4%BC%BC%E4%BA%8E%20%5Clistoftables%20%E6%88%96%20%5Clistoffigures%EF%BC%9F.png)
虽然这看起来有点抽象,但我希望以某种方式在文档开头创建一个列表列表,并为每个列表添加标签。这容易做到吗?目前我的项目布局如下:
.
├── Portrait.pdf
├── Portrait.tex
├── img
| ├── img01.png
| └── ...
└── tex
├── sec01.tex
├── sec02.tex
└── ...
列表位于各个部分文件中。
谢谢!
答案1
我可能的解决方案是使用设施来为和计数器tocloft
生成(由自动定义)。\listof...
enums
items
\newlistof
此外,通过使用,可以\xapptocmd
从xpatch
写入\listofenums
和条目。\listofitems
\addcontentsline
目前有一个缺点:无法定义一个标题用于\listof...
入口。
\documentclass{article}
\usepackage{xpatch}
\usepackage{enumitem}
\usepackage{tocloft}
\usepackage{blindtext}
\newcommand{\listofenumname}{List of enumerations}
\newcommand{\listofitemsname}{List of items}
\newlistof[section]{enums}{loe}{\listofenumname}
\newlistof[section]{items}{loi}{\listofitemsname}
\xapptocmd{\enumerate}{\refstepcounter{enums}\addcontentsline{loe}{section}{\protect\numberline{\theenums}~Enumeration}}{}{}
\xapptocmd{\enumerate}{\refstepcounter{items}\addcontentsline{loi}{section}{\protect\numberline{\theitems}~Itemize list}}{}{}
\begin{document}
\listofenums
\listofitems
\section{A section}
\begin{enumerate}
\item First
\item \blindtext
\end{enumerate}
\blindtext[3]
\begin{enumerate}
\item First item of second enumerate
\end{enumerate}
\section{Another section}
\begin{itemize}
\item First item of first itemize
\end{itemize}
\end{document}
编辑这是另一个解决方案xparse
方案黑客enumerate
/环境itemize
(enumitem
目前需要)——它允许为枚举或列表指定标题itemize
,作为由一对分隔的可选参数(...)
。如果没有这样的对,则没有标题:
\documentclass{article}
\usepackage{xparse}
\usepackage{letltxmacro}
\usepackage{enumitem}
\usepackage{tocloft}
\usepackage{blindtext}
\newcommand{\listofenumname}{List of enumerations}
\newcommand{\listofitemsname}{List of items}
\newlistof[section]{enums}{loe}{\listofenumname}
\newlistof[section]{items}{loi}{\listofitemsname}
\LetLtxMacro\origenumerate\enumerate
\let\origendenumerate\endenumerate
\LetLtxMacro\origitemize\itemize
\let\origenditemize\enditemize
\RenewDocumentEnvironment{enumerate}{o+d()}{%
\IfValueTF{#1}{%
\origenumerate[#1]%
}{%
\origenumerate%
}%
\refstepcounter{enums}%
\IfValueTF{#2}{%
\addcontentsline{loe}{section}{\protect\numberline{\theenums}~#2}%
}{%
% No entry to the loe
}%
}{%
\origendenumerate%
}
\RenewDocumentEnvironment{itemize}{o+d()}{%
\IfValueTF{#1}{%
\origitemize[#1]%
}{%
\origitemize%
}%
\refstepcounter{items}%
\IfValueTF{#2}{%
\addcontentsline{loi}{section}{\protect\numberline{\theitems}~#2}%
}{%
% No entry to the loi
}%
}{%
\origenditemize%
}
\begin{document}
\listofenums
\listofitems
\section{A section}
\begin{enumerate}[label={\alph*)}](Some enum)
\item First
\item \blindtext
\end{enumerate}
\blindtext[3]
\begin{enumerate} % This won't appear in the list, since there is no `(...)` title.
\item First item of second enumerate
\end{enumerate}
\section{Another section}
\begin{itemize}(My first itemize)
\item First item of first itemize
\end{itemize}
\end{document}
答案2
我从未对列表这样做过,但我对教科书草稿这样做过,以便在书的后面提供从练习到答案的简单链接。对我来说,我使用了软件包newfile
,它允许我基本上复制练习的 TOC、LOT 和 LOF 机制。对于每个练习,我将练习本身打印在当前页面上,然后将答案发送到另一个文件;exercises.exer
然后我定义了一个命令,当调用它时\printexercises
会输入。我在书的末尾调用了它。exercises.exer
\printexercises
对于您的情况,我假设您没有重新定义列表,而是使用标准 LaTeX 列表。在这种情况下,在每个\begin{itemize}
或其他命令之后,输入类似\listoflists{List Name}
. 的命令\listoflists
,应该定义如下内容:
\documentclass{article}
\usepackage{newfile}
\def\listoflists#1{%
\addtostream{lol}{%
\hbox to\linewidth{%
#1%
\hfil%
\thepage%
}%
}%
}%
\def\printlistoflists{%
\newinputstream{lolin}%
\openinputfile{listoflists.lol}{lolin}%
\section*{List of Lists}%
\readstream{lolin}%
\closeinputstream{lolin}%
\newoutputstream{lol}
\openoutputfile{listoflists.lol}{lol}
}%
\begin{document}
\printlistoflists
\begin{itemize}\listoflists{List 1}
\item First
\item Second
\end{itemize}
\newpage
\begin{itemize}\listoflists{List 2}
\item Third
\item Fourth
\end{itemize}
\end{document}
可能有更简单的方法可以做到这一点,但对我来说,这种方法总是非常有效。当然,您需要为列表设置样式;上面的代码只是将其放在文档的左边距,并在右边距添加页码。您还可以对标题进行任何您想做的事情;上面的代码只是使其成为一个未编号的部分。与 TOC 和朋友一样,这是一个两遍解决方案。
如果您不想手动指定 LOL 条目,则必须重新定义itemize
和enumerate
环境;但由于您无论如何都必须输入名称,所以这可能会减少工作量。