我定义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}
答案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}}}
我仍然觉得这可以简化,但至少目前看来是可行的。