重新定义 tcolorbox 定理以使参数可选

重新定义 tcolorbox 定理以使参数可选

我有一个大型文档,其中我使用了很多mdframed使用定义的自定义定理环境\newmdtheoremenv,例如

\usepackage[framemethod=tikz]{mdframed}
\mdfdefinestyle{myshadedthm}{backgroundcolor=gray!20,linewidth=0pt,innerleftmargin=1ex,innerrightmargin=0.5ex}
\newmdtheoremenv[style=myshadedthm]{thm}[prop]{\protect\theoremname}

它们与可选的标题参数一起使用,例如

\begin{thm}[Title]
    Body
\end{thm}  

我想在这些环境中切换到使用命令,tcolorbox例如\newtcbtheorem

\usepackage[most]{tcolorbox}
\newtcbtheorem{thm}{Theorem}{colback=gray!20,fonttitle=\bfseries}{th}

问题是这个环境有两个必需参数

\begin{thm}{Title}{Label}
    Body
\end{thm}  

这意味着我不能简单地在序言中用一个定义替换另一个定义。我不知道如何重新定义环境,以便它可以接受一个可选的标题参数,然后将其提供给环境tcolorbox。最好将标签参数也设为可选的,这样我仍然可以选择使用它,而不会破坏现有代码。有人能帮忙吗?

答案1

底层命令是\NewDocumentCommand如此,因此不灵活性并不是真正必要的(并且在\NewTColorBox这些命令调用的地方没有发现)。

最安全的方法可能是将其定义thm为内部定理环境的简单包装器,它可以以通常的方式运行。您可以通过直接破解某些东西来避免这种情况(就像我最初做的那样),但只能依靠内部expl3宏。由于这正是您在 LaTeX 3 中不应该做的事情(也是 LaTeX 2e 中许多打包混乱的原因),因此如果更新破坏了所有内容,您就没有理由抱怨。而且,毕竟,重点是现有文档的向后兼容性,因此破坏它们似乎不是最好的选择。

\documentclass[]{standalone}

\usepackage[most]{tcolorbox}

\NewTcbTheorem{ithm}{Theorem}{colback=gray!20,fonttitle=\bfseries}{th}
\NewDocumentEnvironment {thm} { O{} }
{%
  \begin{ithm}{#1}{}%
}{%
  \end{ithm}%
}

\begin{document}
\begin{thm}
    Body
\end{thm}  
\begin{thm}[Optional Title]
    Body
\end{thm}  
\end{document}

[由于 Okular 错误而省略了图像,但第一张图片的标题为“定理 1”,第二张图片的标题为“定理 2:可选标题”。]

答案2

我不会使用\newtbctheorem或类似的东西:环境的语法很笨拙,更不用说交叉引用了。

\documentclass{article}
\usepackage[many]{tcolorbox}

\newtheorem{thm}{Theorem}
\tcolorboxenvironment{thm}{colback=gray!20}

\begin{document}

\begin{thm}\label{A}
Pigs can fly.
\end{thm}  

\begin{thm}[Interesting]\label{B}
Pigs can't fly.
\end{thm}  

\ref{A} and \ref{B}

\end{document}

在此处输入图片描述

如果您有多个类似定理的环境需要相同处理,则可以避免代码重复。

\documentclass{article}
\usepackage[many]{tcolorbox}

\newtheorem{thm}{Theorem}
\newtheorem{lem}[thm]{Lemma}
\newtheorem{cor}[thm]{Corollary}
\newtheorem{prop}[thm]{Proposition}

\ExplSyntaxOn
\NewDocumentCommand{\tcbwrap}{mm}
 {
  \clist_map_inline:nn { #1 } { \tcolorboxenvironment{##1}{#2} }
 }
\ExplSyntaxOff
\tcbwrap{thm,lem,cor,prop}{colback=gray!20}

\begin{document}

\begin{thm}\label{A}
Pigs can fly.
\end{thm}

\begin{lem}
Whatever.
\end{lem}

\begin{thm}[Interesting]\label{B}
Pigs can't fly.
\end{thm}

\begin{cor}
Contradiction!
\end{cor}

\ref{A} and \ref{B}

\end{document}

在此处输入图片描述

调整选项。fonttitle无需设置。most仅在真正需要时使用;通常many就足够了。

相关内容