我试图做到这一点,当我定义 tcolorbox 定理环境时,我不必在后面输入两个额外的花括号\begin{environment}{}{}
。
如果我不添加花括号,环境中的文本的前两个字母就会被吸收到花括号所在的位置。
问题可能源于 tcbtheorem 的定义?请参阅下面的 MWE
\documentclass[12pt]{report}
\usepackage[most]{tcolorbox}
\newtcbtheorem[number within = chapter]{dfn}{Definition}%
{
enhanced,
before title = {\stepcounter{dfn}},
colback=blue!10,
colframe=blue!35!black,
fonttitle=\bfseries,
top=3mm,
attach boxed title to top left={xshift = 5mm, yshift=-1.5mm},
boxed title style = {colback=blue!35!black}
}{dfn}
\newcounter{dfn}
\begin{document}
\begin{dfn}
abc
\end{dfn}
\begin{dfn}{}{}
abc
\end{dfn}
\end{document}
答案1
使用 indeed 定义的环境\newtcbtheorem
需要两个强制参数:
\begin{dfn}{}{}
Text of the definition
\end{dfn}
第一个参数是标题,第二个参数是标签。调用如下函数
\begin{dfn}{Nice one}{}
Text of the definition
\end{dfn}
标题将设置为“Nice one”,并且没有标签。
\begin{dfn}{Nice one}{nice}
Text of the definition
\end{dfn}
\ref{dfn:nice}
您可以通过(冒号前的前缀是的最后一个参数)来引用定义的编号\newtcbtheorem
。
您也可以将标题留空并设置标签
\begin{dfn}{}{nice}
Text of the definition
\end{dfn}
它就是这样儿的。
您可以围绕这些定理定义一个包装器,这样您就可以使用不同的、在我看来更方便的语法。
\documentclass[12pt]{report}
\usepackage[most]{tcolorbox}
\newtcbtheorem[number within = chapter]{dfninner}{Definition}%
{
enhanced,
before title = {\stepcounter{dfn}},
colback=blue!10,
colframe=blue!35!black,
fonttitle=\bfseries,
top=3mm,
attach boxed title to top left={xshift = 5mm, yshift=-1.5mm},
boxed title style = {colback=blue!35!black}
}{dfn}
\newcounter{dfn}
\ExplSyntaxOn
\NewDocumentEnvironment{dfn}{O{}}
{
\keys_set:nn { hushus/tcb } { #1 }
\hushus_tcb_begin:nVV {dfninner} \l__hushus_tcb_title_tl \l__hushus_tcb_label_tl
}
{
\end{dfninner}
}
\cs_new_protected:Nn \hushus_tcb_begin:nnn
{
\begin{#1}{#2}{#3}
}
\cs_generate_variant:Nn \hushus_tcb_begin:nnn { nVV }
\keys_define:nn { hushus/tcb }
{
title .tl_set:N = \l__hushus_tcb_title_tl,
label .tl_set:N = \l__hushus_tcb_label_tl,
}
\ExplSyntaxOff
\begin{document}
\begin{dfn}
abc
\end{dfn}
\begin{dfn}[title=Nice,label=nice]
abc
\end{dfn}
\ref{dfn:nice}
\end{document}
先前代码的抽象,允许使用标准tcolorbox
语法并处理您想要定义的所有环境的修改。
\documentclass[12pt]{report}
\usepackage[most]{tcolorbox}
\ExplSyntaxOn
\NewDocumentCommand{\betternewtcbtheorem}{O{}mmmm}
{
\newtcbtheorem[#1]{#2inner}{#3}{#4}{#5}
\NewDocumentEnvironment{#2}{O{}}
{
\keys_set:nn { hushus/tcb } { ##1 }
\hushus_tcb_begin:nVV {#2inner} \l__hushus_tcb_title_tl \l__hushus_tcb_label_tl
}
{
\end{#2inner}
}
\cs_if_exist:cF { c@#5} { \newcounter{#5} }
}
\cs_new_protected:Nn \hushus_tcb_begin:nnn
{
\begin{#1}{#2}{#3}
}
\cs_generate_variant:Nn \hushus_tcb_begin:nnn { nVV }
\keys_define:nn { hushus/tcb }
{
title .tl_set:N = \l__hushus_tcb_title_tl,
label .tl_set:N = \l__hushus_tcb_label_tl,
}
\ExplSyntaxOff
\betternewtcbtheorem[number within = chapter]{dfn}{Definition}%
{
enhanced,
before title = {\stepcounter{dfn}},
colback=blue!10,
colframe=blue!35!black,
fonttitle=\bfseries,
top=3mm,
attach boxed title to top left={xshift = 5mm, yshift=-1.5mm},
boxed title style = {colback=blue!35!black}
}{dfn}
\begin{document}
\begin{dfn}
abc
\end{dfn}
\begin{dfn}[title=Nice,label=nice]
abc
\end{dfn}
\ref{dfn:nice}
\end{document}
发生了什么事?这个想法是\betternewtcbtheorem
定义一个“内部”环境,该环境将由具有所需名称的人调用。
在上面的例子中,所需的名称是dfn
,因此我们首先调用\newtcolorbox
传递参数,但inner
名称后附加。接下来dfn
定义环境,采用可选参数,该参数应包含具有键值语法的内容。
允许的键是title
和label
。dfn
调用时,我们将值传递到适当的位置。由于这些值存储在标记列表变量中,因此我定义了一个函数
\hushus_tcb_begin:nnn
这将调用\begin{dfninner}{<title>}{<label>}
,但我需要传递两个变量的内容,所以这是变体的位置,
\hushus_tcb_begin:nVV
它像往常一样采用第一个带括号的参数,但其他两个应该是标记列表变量,其内容传递给主函数,就好像它们是带括号的参数一样。
最后的润色:如果之前不存在计数器,则根据 的最后一个参数定义一个计数器\newtcbtheorem
。
答案2
您可以使用可选参数定义一个新环境,并检查是否提供了值。
\documentclass[12pt]{report}
\usepackage{xparse}
\usepackage[most]{tcolorbox}
\newtcbtheorem[number within = chapter]{dfn}{Definition}%
{
enhanced,
before title = {\stepcounter{dfn}},
colback=blue!10,
colframe=blue!35!black,
fonttitle=\bfseries,
top=3mm,
attach boxed title to top left={xshift = 5mm, yshift=-1.5mm},
boxed title style = {colback=blue!35!black}
}{dfn}
\newcounter{dfn}
\NewDocumentEnvironment{DFN}{d()d()}{\begin{dfn}{\IfValueT{#1}{#1}}{\IfValueT{#2}{#2}}}{\end{dfn}}
\begin{document}
\begin{dfn}
abc
\end{dfn}
\begin{DFN}
abc
\end{DFN}
\begin{dfn}{}{}
abc
\end{dfn}
\begin{DFN}(q)(s)
abc
\end{DFN}
\end{document}