带有子列表和标题以及浮动环境的列表

带有子列表和标题以及浮动环境的列表

我尝试创建一个具有类似以下布局的浮动环境:

_____________________  ___________________
|                    | |                 |
|                    | |                 |
|                    | |                 |
_____________________  ___________________
(a) First sublisting   (c) Third sublisting

__________________________________________
|                                        |
|                                        |
|                                        |
__________________________________________
             (b) Second sublisting

Listing 3.1: Main caption for all sublistings

我使用\usepackage{subcaption}\usepackage{lstlisting}

我目前的方法是将三个列表放在一个图中的子图中。之后我使用了几个技巧:

  1. 在图中,我\captionof{lstlisting}{Main caption for all sublistings}明确使用列表标题,而不是图形标题
  2. 虽然我使用了\captionof{lstlisting}{...},但数字的计数器却增加了。因此,我在通过 的图形环境之后手动将其减少\addtocounter{figure}{-1}
  3. 虽然我使用了\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}

请注意,列表子类型的声明必须推迟到文档的开头,因为那是相应浮点类型的首次定义。

我将让你使用计数器值来获取非标准的标签排序。

相关内容