在下面的 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}