tcbtheorem 环境的正文被纳入选项

tcbtheorem 环境的正文被纳入选项

我试图做到这一点,当我定义 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定义环境,采用可选参数,该参数应包含具有键值语法的内容。

允许的键是titlelabeldfn调用时,我们将值传递到适当的位置。由于这些值存储在标记列表变量中,因此我定义了一个函数

\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}

相关内容