在以下最小示例中,有嵌套环境代码和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 放在code
a 内,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
标题相同的方式格式化。code
quadro
但是这个文档怎么样:
\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
包会这样。如果还有任何问题,请随时提问。