我尝试创建一个具有类似以下布局的浮动环境:
_____________________ ___________________
| | | |
| | | |
| | | |
_____________________ ___________________
(a) First sublisting (c) Third sublisting
__________________________________________
| |
| |
| |
__________________________________________
(b) Second sublisting
Listing 3.1: Main caption for all sublistings
我使用\usepackage{subcaption}
和\usepackage{lstlisting}
我目前的方法是将三个列表放在一个图中的子图中。之后我使用了几个技巧:
- 在图中,我
\captionof{lstlisting}{Main caption for all sublistings}
明确使用列表标题,而不是图形标题 - 虽然我使用了
\captionof{lstlisting}{...}
,但数字的计数器却增加了。因此,我在通过 的图形环境之后手动将其减少\addtocounter{figure}{-1}
。 - 虽然我使用了
\captionof{lstlisting}{...}
,但\autoref{}
这个图打印的是“图 3.1”,而不是“清单 3.1”。因此我必须通过以下方式引用它Listing \ref{...}
采用这种方法,列表布局正确,有副标题和主标题,并且处于浮动环境中。它们出现在正确的列表中(图片列表与列表列表),参考文献使用正确的命名。
我的问题是:有没有更简单的方法?手动修改数字索引并使用\ref
感觉\autoref
有点不对。
是否可以仅当图形环境的标题实际上是图形的标题时才告诉它增加其计数器?是否可以修改以在使用图形\autoref
时使用正确的引用?\captionof{lstlisting}{...}
例子
\documentclass[a4paper]{book}
\usepackage{subcaption}
\usepackage{listings}
\usepackage{hyperref}
\begin{document}
This is a reference to Listing~\ref{lst:mylisting}.
In contrast to this, autoref prints \autoref{lst:mylisting}.
\begin{figure}[tb]
\begin{subfigure}[t]{0.45\textwidth}
\renewcommand{\thesubfigure}{a}
\begin{lstlisting}
bla bla
\end{lstlisting}
\caption{First listing}
\end{subfigure}
\hfill
\begin{subfigure}[t]{0.45\textwidth}
\renewcommand{\thesubfigure}{c}
\begin{lstlisting}
bla bla
\end{lstlisting}
\caption{Third listing}
\end{subfigure}
\vspace{10mm}
\begin{subfigure}[t]{1\textwidth}
\renewcommand{\thesubfigure}{b}
\begin{lstlisting}
bla bla
\end{lstlisting}
\caption{Second listing}
\end{subfigure}
\captionof{lstlisting}{Main caption for all sublistings}
\label{lst:mylisting}
\end{figure}
% modify numbering of figures
\addtocounter{figure}{-1}
\begin{figure}[tb]
\caption{A following figure with correct numbering}
This is the figure content
\end{figure}
\listoffigures
\lstlistoflistings
\end{document}
答案1
我建议你设置一个正确的子标题类型,然后你就可以\subcaption
直接使用命令了。在包含列表的“图”中,只需声明使用\setcaptiontype
即可lstlisting
将其以正确的顺序与图分开。使用cleveref
你可以得到正确的参考。
\documentclass[a4paper]{book}
\usepackage{subcaption}
\usepackage{listings}
\usepackage{hyperref}
\usepackage{cleveref}
\AtBeginDocument{\DeclareCaptionSubType{lstlisting}}
\crefname{sublstlisting}{listing}{listings}
\Crefname{sublstlisting}{Listing}{Listings}
\begin{document}
This is a reference to Listing~\ref{lst:mylisting}.
In contrast to this, cleveref prints \cref{lst:mylisting} and \cref{sublst:b}.
\begin{figure}[tb]
\setcaptiontype{lstlisting}
\begin{minipage}[t]{0.45\textwidth}
\begin{lstlisting}
bla bla
\end{lstlisting}
\subcaption{First listing}
\label{sublst:a}
\end{minipage}
\hfill
\begin{minipage}[t]{0.45\textwidth}
\begin{lstlisting}
bla bla
\end{lstlisting}
\subcaption{Second listing}
\label{sublst:b}
\end{minipage}
\vspace{10mm}
\begin{minipage}[t]{1\textwidth}
\begin{lstlisting}
bla bla
\end{lstlisting}
\subcaption{Third listing}
\label{sublst:c}
\end{minipage}
\caption{Main caption for all sublistings}
\label{lst:mylisting}
\end{figure}
\begin{figure}[tb]
\caption{A following figure with correct numbering}
This is the figure content
\end{figure}
\listoffigures
\lstlistoflistings
\end{document}
请注意,列表子类型的声明必须推迟到文档的开头,因为那是相应浮点类型的首次定义。
我将让你使用计数器值来获取非标准的标签排序。