我有一个大型文档,其中我使用了很多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
就足够了。