如何对列表进行“子级”编号,类似于子标题?

如何对列表进行“子级”编号,类似于子标题?

我认为我正在尝试做的事情可能很复杂,所以如果不是全部有可能的话,那就没问题了。我正在使用列表包,我做了类似的事情自定义列表编号在 tex.sx 的其他地方,列表编号为 2.a 2.b 2.c,但我希望它更好。我画了一张我想要实现的输出图(彩色框只是为了说明这个想法):

链接到我的绘图,因为新用户无法发布图片……

每个“子列表”都有一个字母,底部有一个数字,代表所有三个子列表。我希望能够引用子列表,以便文档中显示 8.a 或 8.(a) 或其他内容。

我尝试(但失败了)通过改编以下示例来做到这一点:副标题包中使用了图形和图像,但编译失败,提示“缺少数字,视为零”,可能是因为我不知道要用 subcaption 做什么。我尝试用 subcaption 执行的操作如下:

\usepackage{caption,subcaption}

...

\begin{figure}

  \begin{subfigure}
    \lstinputlisting[language=sql]{path/to/file1}
    \caption{Caption for first listing}
    \label{lst:file1}
  \end{subfigure}

  \begin{subfigure}
    \lstinputlisting[language=xml]{path/to/file2}
    \caption{Caption for second listing}
    \label{lst:file2}
  \end{subfigure}

  \caption{General caption for all 3}

\end{figure}

许多子标题似乎与将事物放在一起有关,但由于这些是列表,我希望它们像平常一样彼此叠放,并且仅使用子标题来尝试更改编号。我还有一个列表列表,如果其中的 a、b 和 c 列表在 #8 之后缩进,就像在目录中创建章节和子章节时一样,那就太好了。

任何帮助都将不胜感激。

答案1

\documentclass{article}

\usepackage{listings}
\AtBeginDocument{\DeclareCaptionSubType{lstlisting}}
\usepackage{caption,subcaption}

\begin{document}

\lstlistoflistings

\begin{figure}[!ht]
\captionsetup{type=lstlisting}
\begin{sublstlisting}{\linewidth}
\begin{lstlisting}
test listing one
\end{lstlisting}
\caption{Caption for first listing}
\label{lst:file1}
\end{sublstlisting}
\begin{sublstlisting}{\linewidth}
\begin{lstlisting}
test listing two
\end{lstlisting}
\caption{Caption for second listing}
\label{lst:file2}
\end{sublstlisting}
\caption{General caption for all 3}
\label{lst:general}
\end{figure}

As we can see in Listings~\ref{lst:file1} and~\ref{lst:file2}...

\end{document}

这个解决方案来自 Gonzalo Medina,其中技巧 1 至 4 已被另一个技巧所取代:

listings包定义了一些字幕所需的内容\AtBeginDocument,因此\DeclareCaptionSubType无法直接在 上运行lstlisting。不幸的是,该(sub)caption包还需要执行一些重要的事情\AtBeginDocument,并且\DeclareCaptionSubType必须在这些事情之前执行。所以总的来说我使用\AtBeginDocument{\DeclareCaptionSubType{lstlisting}} 正在加载listings包,但是加载(sub)caption包以使其工作。

这样,我们就不需要额外的计数器,不需要保存计数器,不需要手动增加计数器,不需要抑制列表条目,也不需要手动输入列表条目。

(如果列表不应该浮动,只需figure用环境替换环境minipage。)

PS:有关详细信息,\DeclareCaptionSubType请查看我的subcaption包文档。

答案2

如果要使用这种特殊结构一两次,则可以采用“手动”解决方案;下面的代码展示了这样的解决方案。

  1. \captionsetup(来自caption包)用于防止图形的一般标题进入图形列表,并将标题标签的名称“图形”更改为“列表”。
  2. \addcontentsline用于将标题添加到列表列表。
  3. 柜台lstlistings是阶梯式的。
  4. 在“伪造”环境开始时,使用临时计数器tmp存储计数器的值;然后为计数器分配正确的计数器值。在环境结束时,计数器将恢复为其先前存储的值。figurefigurefigurelstlistingfigure

    \documentclass{article}
    \usepackage{listings}
    \usepackage{caption,subcaption}
    
    \newcounter{tmp}
    
    \begin{document}
    
    \lstlistoflistings
    \listoffigures
    
    \begin{figure}[!ht]
    \setcounter{tmp}{\thefigure}
    \setcounter{figure}{\thelstlisting}
    \captionsetup{list=no,name=Listing}
    \begin{subfigure}{\linewidth}
    \begin{lstlisting}
    test listing one
    \end{lstlisting}
    \caption{Caption for first listing}
    \label{lst:file1}
    \end{subfigure}
    \begin{subfigure}{\linewidth}
    \begin{lstlisting}
    test listing two
    \end{lstlisting}
    \caption{Caption for second listing}
    \label{lst:file2}
    \end{subfigure}
    \caption{General caption for all 3}
    \label{lst:general}
    \addcontentsline{lol}{lstlisting}{\protect\numberline{\thefigure}General caption for all 3}
    \stepcounter{lstlisting}
    \setcounter{figure}{\thetmp}
    \end{figure}
    
    As we can see in Listings~\ref{lst:file1} and~\ref{lst:file2}...
    
    \end{document}
    

在此处输入图片描述

相关内容