在 tcolorbox 中有条件地设置“范围内的数字”

在 tcolorbox 中有条件地设置“范围内的数字”

我定义tcolorbox列表如下:

\newtcblisting[auto counter,
               number within=chapter,
               crefname={Lis.}{Lis.},
               ...

它在书籍中运行良好,但在较小的文档中我需要关闭它number within。我尝试过以下方法:

  • \@ifundefined{chapter}{}{number within=chapter},}但这令人困惑pgfkeys

  • number within=\@ifundefined{chapter}{???}{chapter},但我不知道该用什么,???所以密钥仍然未设置(我试过\pgfkeysnovalue,但没有运气)。

  • \@ifundefined{chapter}{}{\tcbset{new/number within=chapter}}但这似乎没有任何效果。

对于我想做的事情,正确的方法是什么?

以下是代码示例。如果文档是一本书,而不是一篇文章,那么它将起作用。目标是以某种方式使用\@ifundefined{chapter}某个地方来禁用number within没有章节时的设置:

\documentclass{article} % works when book
\usepackage{tcolorbox,cleveref}
\tcbuselibrary{skins,listings,breakable}

\newtcblisting[auto counter,
               number within=chapter,
               crefname={Lis.}{Lis.},
               Crefname={Listing}{Listings},
               list inside=lis
              ]{code}[1][]{%
              comment={Listing~\thetcbcounter: #1},
              listing and comment}

\begin{document}

\begin{code}[bar]
foo
\end{code}
\end{document}

答案1

定义一个新的通用实用程序键/utils/ifundefined={<csname>}{<options if true>}{<options otherwise>}

\documentclass{article}
\usepackage{tcolorbox,cleveref}
\tcbuselibrary{skins,listings,breakable}

\makeatletter
\pgfkeys{
  /utils/ifundefined/.code n args={3}{%
    \@ifundefined{#1}{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}%
  }
}
\makeatother

\newtcblisting[
  auto counter,
  /utils/ifundefined={chapter}{}{number within=chapter},
  crefname={Lis.}{Lis.},
  Crefname={Listing}{Listings},
  list inside=lis
]{code}[1][]{
  comment={Listing~\thetcbcounter: #1},
  listing and comment
}

\begin{document}
\section{Test}

\begin{code}[bar]
foo
\end{code}

\begin{code}[bar]
foo
\end{code}
\end{document}

在此处输入图片描述

使用文档类report代替article在此处输入图片描述

答案2

为键系列定义合适的样式new

\documentclass{article}
\usepackage{tcolorbox,cleveref}
\tcbuselibrary{skins,listings,breakable}

\makeatletter
\tcbset{
  new/.cd,
  number within highest/.estyle={
    number within = \@ifundefined{chapter}{section}{chapter}
  }
}

\newtcblisting[
  auto counter,
  number within highest,
  crefname={Lis.}{Lis.},
  Crefname={Listing}{Listings},
  list inside=lis
]{code}[1][]{
  comment={Listing~\thetcbcounter: #1},
  listing and comment
}

\begin{document}

\section{Test}

\begin{code}[bar]
foo
\end{code}

\end{document}

在此处输入图片描述

答案3

以前面的答案为起点,我得出了以下结论:

\@ifundefined{chapter}{\tcbset{new/.cd,number within if chapter/.style={}}}{
\tcbset{new/.cd,number within if chapter/.style={number within = chapter}}}

我仍然觉得这可以简化,但至少目前看来是可行的。

相关内容