“列表的列表”,类似于 \listoftables 或 \listoffigures?

“列表的列表”,类似于 \listoftables 或 \listoffigures?

虽然这看起来有点抽象,但我希望以某种方式在文档开头创建一个列表列表,并为每个列表添加标签。这容易做到吗?目前我的项目布局如下:

.
├── Portrait.pdf
├── Portrait.tex
├── img
|   ├── img01.png
|   └── ...
└── tex
    ├── sec01.tex
    ├── sec02.tex
    └── ...

列表位于各个部分文件中。

谢谢!

答案1

我可能的解决方案是使用设施来为和计数器tocloft生成(由自动定义)。\listof...enumsitems\newlistof

此外,通过使用,可以\xapptocmdxpatch写入\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/环境itemizeenumitem目前需要)——它允许为枚举或列表指定标题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 条目,则必须重新定义itemizeenumerate环境;但由于您无论如何都必须输入名称,所以这可能会减少工作量。

相关内容