我认为我正在尝试做的事情可能很复杂,所以如果不是全部有可能的话,那就没问题了。我正在使用列表包,我做了类似的事情自定义列表编号在 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
如果要使用这种特殊结构一两次,则可以采用“手动”解决方案;下面的代码展示了这样的解决方案。
\captionsetup
(来自caption
包)用于防止图形的一般标题进入图形列表,并将标题标签的名称“图形”更改为“列表”。\addcontentsline
用于将标题添加到列表列表。- 柜台
lstlistings
是阶梯式的。 在“伪造”环境开始时,使用临时计数器
tmp
存储计数器的值;然后为计数器分配正确的计数器值。在环境结束时,计数器将恢复为其先前存储的值。figure
figure
figure
lstlisting
figure
\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}