包标题警告:输入行 38 上的标题类型已设置为“quadro”

包标题警告:输入行 38 上的标题类型已设置为“quadro”

在以下最小示例中,有嵌套环境代码和quadro,其中都使用captionsetup。并且在构建示例时,我收到了警告:Package caption Warning: The caption type was already set to `quadro' on input line 38.See the caption package documentation for explanation

\captionsetup[quadro]{skip=1mm}我设法通过用替换该行来修复它\AtBeginEnvironment{quadro}{\captionsetup{skip=1mm}}

但我不明白发生了什么。阅读文档时,它说:

标题类型已设置为“htypei”。此警告通知您有关混合标题选项的信息。例如,如果您在图形环境中使用 \captionsetup{type=table} 或 \captionof{table}{. . . },这将导致同时使用该特定标题的两个选项集,一个用于图形(使用 \captionsetup[figure]{. . .} 指定),另一个用于表格(使用 \captionsetup[table]{. . . } 指定)。(您可以使用带星号的 \captionsetup*{type=. . .} 格式来隐藏此警告。)(请参阅第 3.2 节:设置选项)

为什么\captionsetup[quadro]{skip=1mm}用替换\AtBeginEnvironment{quadro}{\captionsetup{skip=1mm}}可以修复警告?

\documentclass[
brazilian,brazil,
12pt, % Padrão UFSC para versão final
a4paper, % Padrão UFSC para versão final
twoside, % Impressão nos dois lados da folha
chapter=TITLE, % Título de capítulos em caixa alta
section=TITLE, % Título de seções em caixa alta
]{abntex2}

\usepackage{caption}
\usepackage{listings}
\usepackage[newfloat,chapter]{minted}

\newenvironment{code}{
  \captionsetup{type=listing}
}{}

\AtBeginEnvironment{code}{\setcounter{listing}{\value{lstlisting}}
  \captionsetup{skip=0pt}
}

\def\listofquadrosname{List of Frames}
\def\quadrosname{Frame}
\DeclareFloatingEnvironment[fileext=loq,placement={!hbtp},name=\quadrosname,within=chapter,listname=\listofquadrosname]{quadro}

\captionsetup[quadro]{skip=1mm}
% \AtBeginEnvironment{quadro}{\captionsetup{skip=1mm}}

\begin{document}

\begin{quadro}[h]
\caption{Example}
    \begin{code}
    \caption{File}
    Something.
    \end{code}
\end{quadro}

\end{document}

答案1

\begin{quadro}标题类型设置为,quadro并且任何用 声明的选项\captionsetup[quadro]{...}都将被应用。

\begin{code}标题类型设置为(listings因为code是这样定义的)并且任何用声明的选项都\captionsetup[listings]{...}将被应用。

如果将 a 放在codea 内,quadro则最终会得到两种选项的混合,即用 声明的选项\captionsetup[quadro]{...}和用 声明的选项\captionsetup[listings]{...}。因此,常规 内的标题code看起来与 内的 内的标题不同,code后者放在 内quadro,例如:

\documentclass{article}
\usepackage{caption,newfloat}
\DeclareFloatingEnvironment{listing}
\DeclareFloatingEnvironment{quadro}
\newenvironment{code}{\captionsetup{type=listing}}{}

\captionsetup[quadro]{font=it}

\begin{document}

\begin{code}
\caption{Test}
\end{code}

\begin{quadro}
\begin{code}
\caption{Test}
\end{code}
\end{quadro}

\end{document}

尽管两者都是 的标题,但两个标题看起来却不同code

在大多数情况下,这是一种不想要的效果,也是用户不想得到的东西。所有标题都code应该以相同的方式格式化,至少这是普遍的期望。

因此,caption如果出现来自不同环境的选项混合的情况,软件包会发出警告。

现在来谈谈问题的第二部分:

如果\captionsetup[quadro]{...}不使用,警告就会消失。caption包知道quadro不再有任何特殊选项,因此里面的标题将以与放在里面的code标题相同的方式格式化。codequadro

但是这个文档怎么样:

\documentclass{article}
\usepackage{caption,newfloat}
\DeclareFloatingEnvironment{listing}
\DeclareFloatingEnvironment{quadro}
\newenvironment{code}{\captionsetup{type=listing}}{}

\begin{document}

\begin{code}
\caption{Test}
\end{code}

\begin{quadro}
\captionsetup{font=it}
\begin{code}
\caption{Test}
\end{code}
\end{quadro}

\end{document}

此代码的输出与上面的代码完全相同,但这里没有发出任何警告,为什么?因为在这种情况下,选项“font = it”是由用户明确放置在环境中的,因此此处包caption假定用户知道他在做什么。

与 相同\AtBeginEnvironment{quadro}{\captionsetup{font=it}}。由于caption软件包不知道 是否\captionsetup{font=it}是宏的一部分,它将此更改归类为“显式”(而非隐式),因此不会发出警告。

我希望这个答案能更清楚地解释为什么caption包会这样。如果还有任何问题,请随时提问。

相关内容