默认环境作为其他环境的骨架

默认环境作为其他环境的骨架

我有许多具有非常相似定义的环境,下面就是其中一个例子。

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

相关内容