我有许多具有非常相似定义的环境,下面就是其中一个例子。
\newcounter{definition}
\newenvironment{definition}[1][]{%
\refstepcounter{definition}
\global\mdfdefinestyle{definition}{linecolor=grey60, linewidth=3pt, skipabove=2\parskip, skipbelow=0.4\parskip, topline=false, rightline=false, bottomline=false}
\ifstrempty{#1}%
{\begin{mdframed}[style=definition]
{\bfseries{Definition~\thedefinition}\newline}
\relax}
{\begin{mdframed}[style=definition]
{\bfseries{Definition~\thedefinition}} \,(#1)\newline\relax
}}{\end{mdframed}}
\renewcommand\thedefinition{\arabic{chapter}.\arabic{section}.\arabic{definition}}
其他环境与此非常相似,但例如用theorem
代替每个definition
。如何定义一个“骨架”环境,该环境采用环境名称并正确定义一个与之对应的新环境(包括更改\thedefinition
为\thetheorem
和),但不依赖于许多其他包(我正在尝试学习如何自己编写所有宏Definition~
,Theorem~
这样我就不必过分依赖包)?
除此之外,设置它是否有一个简单的扩展,以便我可以将\linewidth
每个框线定义为这个骨架环境的参数,以便定理环境具有更大的左线并且也包含右线?
当然,如果环境数量很少,我可以像之前那样分别定义它们,但如果有大量环境可以一次性全局更改,我会非常有兴趣看看这段代码会是什么样子。我确信这是该软件包中amsthm
默认定理风格的一个功能,但我不知道去哪里检查他们实现的代码(如果有人能为我指出正确的方向,我将不胜感激!)。
答案1
我不确定原始定义的所有方面是否正确(例如不能\global
加前缀)但要参数化它只需使用定义和和和。mdfdefinestyle
#1
\csname thedefinition\endcsname
\thedefinition
##1
#1
\newcommand\mythmdef[1]{%
\newcounter{#1}%
\newenvironment{#1}[1][]{%
\refstepcounter{#1}%
\global\mdfdefinestyle{#1}{linecolor=grey60, linewidth=3pt, skipabove=2\parskip, skipbelow=0.4\parskip, topline=false, rightline=false, bottomline=false}%
\ifstrempty{##1}%
{\begin{mdframed}[style=#1]%
{\bfseries{\MakeUppercase#1~\csname the#1\endcsname}\newline}%
\relax}%
{\begin{mdframed}[style=#1]%
{\bfseries{\MakeUppercase#1~\csname the#1\endcsname}} \,(##1)\newline\relax
}}{\end{mdframed}}%
\expandafter\renewcommand\csname the#1\endcsname{\arabic{chapter}.\arabic{section}.\arabic{#1}}}
那么你就可以走了
\mythmdef{definition}