是否可以将选项传递给 tcolorboxenvironment?

是否可以将选项传递给 tcolorboxenvironment?

在下面的 MWE 中,我theorem通过thmtools包定义一个定理环境,并将该环境嵌入 tcolorbox 中,指定黄色背景。

\documentclass{article}

\usepackage{amsthm}
\usepackage{thmtools}

\declaretheoremstyle[
  headfont=\sffamily\bfseries,
]{theorem}

\declaretheorem[
  style=theorem,
  name=Theorem,
]{theorem}

\usepackage{tcolorbox}
\tcolorboxenvironment{theorem}{colback=yellow}

\begin{document}

% \begin{theorem}[name={foo}, tcolorbox={colframe=red}] <-- maybe like this?
% \begin{theorem}[name={foo}]{colframe=red} <-- or like this?
\begin{theorem}[name={foo}]
  This is a theorem.
\end{theorem}

\end{document}

如果某些选项尚未包含在第二个参数中,那么是否可以将它们传递tcolorbox给该环境(在 MWE 中) ?colframe=red\tcolorboxenvironment

我知道tcolorbox有一个定理库,但我想使用两个独立的工具来完成两个独立的工作(声明定理和将其装箱)。

答案1

你可以这样做,但要采用间接的方式。

我没有定义,而是theorem定义并去做\tcolorboxenvironment{theorem}{colback=yellow}innertheorem

\tcolorboxenvironment{innertheorem}{noibeoptions}

其中noibeoptions是本地定义的样式。 的可选参数theorem将解析选项(我用 来做expl3,但也可以用 Ti 来做Z 解析)并将name其用作定理的通常可选参数,任何其他键都将传递给\tcbset定义局部样式。

\documentclass{article}

\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{xparse}

\declaretheoremstyle[
  headfont=\sffamily\bfseries,
]{theorem}

\declaretheorem[
  style=theorem,
  name=Theorem,
]{innertheorem}

\usepackage{tcolorbox}
\tcolorboxenvironment{innertheorem}{colback=yellow,noibeoptions}

\ExplSyntaxOn
\NewDocumentEnvironment{theorem}{O{}}
 {
  \keys_set:nn { noibe/theorem } { #1 }
  \__noibe_tcbset:V \l__noibe_theorem_options_clist
  \tl_if_empty:NTF \l__noibe_theorem_name_tl
   { \begin{innertheorem} } { \begin{innertheorem}[\l__noibe_theorem_name_tl] }
 }
 {
  \end{innertheorem}
 }
\keys_define:nn { noibe/theorem }
 {
  name .tl_set:N = \l__noibe_theorem_name_tl,
  unknown .code:n = \clist_put_right:Nx \l__noibe_theorem_options_clist { \l_keys_key_str = #1 },
 }
\clist_new:N \l__noibe_theorem_options_clist
\cs_new_protected:Nn \__noibe_tcbset:n
 {
  \tcbset{noibeoptions/.style={#1}}
 }
\cs_generate_variant:Nn \__noibe_tcbset:n { V }
\ExplSyntaxOff

\begin{document}

\begin{theorem}[name={foo},colframe=red]
  This is a theorem.
\end{theorem}

\begin{theorem}[name={foo},colback=red]
  This is a theorem.
\end{theorem}

\end{document}

我猜想这可以被抽象化以避免以相同的方式为每个定理定义一个新的环境。

在此处输入图片描述

答案2

恐怕这无法合理地完成\tcolorboxenvironment,因为如果它允许这样的事情,那可能会破坏包装环境的语法。\tcolorboxenvironment非常通用;它不假设包装环境接受可选参数,也不假设该可选参数使用“key=value 语法”等。

但是,你可以定义自己的环境来包装theorem并接受额外的可选参数指定要传递给的键tcolorbox

\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{xparse}
\usepackage{tcolorbox}

\declaretheoremstyle[
  headfont=\sffamily\bfseries,
]{theorem}

\declaretheorem[
  style=theorem,
  name=Theorem,
]{theorem}

\ExplSyntaxOn
\NewDocumentEnvironment { mytheorem } { !O{} !O{} }
  {
    \tcolorbox [colback=yellow, #2]
    % The 'theorem' env from thmtools doesn't like blank optional args
    \tl_if_blank:nTF {#1}
      { \begin{theorem} }
      { \begin{theorem}[#1] }
  }
  {
    \end{theorem}
    \endtcolorbox
  }
\ExplSyntaxOff

\begin{document}

\begin{mytheorem}[name=foo]
  This is a theorem.
\end{mytheorem}

\begin{mytheorem}[name=bar][colframe=red]
  This is another theorem.
\end{mytheorem}

\begin{mytheorem}[][colback=blue!20]
  This is a third theorem.
\end{mytheorem}

\begin{mytheorem}
  This is a fourth theorem.
\end{mytheorem}

\end{document}

在此处输入图片描述

相关内容