组合环境

组合环境

我使用两个(将来可能会有更多)几乎相同的环境,其定义为

%%% REMARK ENVIROMENT 

\newcounter{remark}[chapter]
\def\theremark{\thesection\cyan{.\arabic{remark}}\blackink}
\newenvironment{remark}[2][]{\refstepcounter{remark}\par\medskip 
\noindent
\mdfsetup{
    frametitleaboveskip=-0.5\ht\strutbox,
    frametitlealignment=\raggedright }
\begin{mdframed}[hidealllines=true,backgroundcolor=black!10]
\cyan\hrulefill\blackink \\
\colorbox{cyan}{\textbf {\whiteink{\large{REMARK~\theremark}
\rule[-6pt] {0ex}{4ex} }\blackink #1}} 
\smallskip $\quad$ \textbf {#2} \\
\cyan\hrulefill\blackink
}{${}$\\\cyan\hrulefill\blackink\end{mdframed}}

%%% DEFINITION ENVIROMENT 

\newcounter{definition}[section]
\def\thedefinition{\thesection\cyan{.\arabic{definition}}\blackink}
\newenvironment{definition}[2][]{\refstepcounter{definition}\par\medskip  
\noindent
\mdfsetup{
    frametitleaboveskip=-0.5\ht\strutbox,
    frametitlealignment=\raggedright }
\begin{mdframed}[hidealllines=true,backgroundcolor=black!10]
\cyan\hrulefill\blackink \\
\colorbox{cyan}{\textbf {\whiteink{\large{DEFINITION~\thedefinition}   
\rule[-6pt]{0ex}{4ex} }\blackink #1}} \smallskip $\quad$ \textbf {#2} \\
\cyan\hrulefill\blackink
}{${}$\\\cyan\hrulefill\blackink\end{mdframed}}

(唯一改变的是环境的标签和(也许)颜色)。是否可以将它们组合在一个环境中(或从另一个环境中使用它们)并以某种方式选择我想要使用的那个(可能通过附加参数?)如果环境在多个功能上不同于其名称怎么办?非常感谢。

答案1

总是最好给一个最小工作示例当提出问题时,因为这通常有助于解释你想要什么——并且它为人们提供了一些可遵循的代码来开始。

下面的代码结合了你的两个环境。既然你说你可能喜欢改变我使用的环境的颜色,\NewDocumentEnvironment那么解析包使用两个可选参数来定义环境。例如,你现在可以这样写:

\begin{definition}(blue!10)[really]{wonderful}
  Here is a really wonderful definition
\end{definition}

第一个可选参数用括号括起来,用于设置背景颜色,第二个可选参数是您前一个可选参数。

以下是 MWE 代码产生的部分输出:

在此处输入图片描述

完整代码如下:

\documentclass{book}
\usepackage{xcolor}
\usepackage{mdframed}
\usepackage{xparse}
\usepackage{etoolbox}
\mdfsetup{
    frametitleaboveskip=-0.5\ht\strutbox,
    frametitlealignment=\raggedright
}
\newcommand\blackink{\color{black}}
\newcommand\whiteink{\color{white}}
\newcommand\cyan{\color{cyan}}

\newcounter{remark}[chapter]
\newcounter{definition}[section]
\renewcommand\theremark{\thesection\cyan{.\arabic{remark}}\blackink}
% usage:
% \begin{MasterEnvironment}{remark/definition}{bg colour}{optional}{rmk/def}
\NewDocumentEnvironment{MasterEnvironment}{ m m m m }{%
  \refstepcounter{#1}\par\medskip
  \noindent
  \begin{mdframed}[hidealllines=true,backgroundcolor=#2]
 \cyan\hrulefill\blackink \\
  \colorbox{cyan}{\textbf{\whiteink{\large{\uppercase{#1}~\csuse{the#1}}
  \rule[-6pt] {0ex}{4ex} }\blackink #3}}
  \smallskip $\quad$ \textbf {#4} \\
  \cyan\hrulefill\blackink
}{${}$\\\cyan\hrulefill\blackink\end{mdframed}}

%%% REMARK ENVIROMENT
% usage: \begin{remark}(bg colour)[optional]{remark}...\end{remark}
\NewDocumentEnvironment{remark}{ D(){black!10} O{} m }%
  {\begin{MasterEnvironment}{remark}{#1}{#2}{#3}}
  {\end{MasterEnvironment}}

%%% DEFINITION ENVIROMENT
% usage: \begin{definition}(bg colour)[optional]{definition}...\end{definition}
\NewDocumentEnvironment{definition}{ D(){black!10} O{} m }%
  {\begin{MasterEnvironment}{definition}{#1}{#2}{#3}}
  {\end{MasterEnvironment}}

\begin{document}
\chapter{A walk in the woods}
\section{A nice section}
\begin{definition}{wonderful}
  Here is a wonderful definition
\end{definition}

\begin{definition}[really]{wonderful}
  Here is a really wonderful definition
\end{definition}

\begin{definition}(blue!10){wonderful}
  Here is a wonderful definition
\end{definition}

\begin{remark}{wonderful}
  Here is a wonderful remark
\end{remark}

\begin{remark}[really]{wonderful}
  Here is a really wonderful remark
\end{remark}

\begin{remark}(blue!10){wonderful}
  Here is a wonderful remark
\end{remark}

\end{document}

几点说明:

  • definition和环境remark都有两个可选参数,它们将给予的所有内容传递给MasterEnvironment,其中有四个强制参数。
  • 第一个参数用于MasterEnvironment设置要使用的名称和计数器:即,要么definition,要么remark。稍后\uppercase用于将名称全部大写。
  • 我已经使用\csuse电子工具箱包将计数器打印为\csuse{the#1}。您可以\csname the#1\endcsname在这里使用,但我认为这\csuse会使代码更易于阅读。
  • 的定义在两个方面有点奇怪。首先,\theremark计数器被定义为,因此它与计数器同步递增,但使用的是部分计数器。其次,数字打印在,但当在环境中使用时,它会打印在带有背景的内,这意味着您看不到。由于它在 OP 中是这样写的,所以我保留了它,因为这可能实际上是想要的……但也许不是。\thesection\cyan{.\arabic{remark}}\blackinkremark\newcounter{remark}[chapter]chapter\theremarkremarkcyan\theremarkdefinition\colorboxcyan\arabic{remark}
  • 由于\blackink\whiteink\cyan在问题发布的代码中没有定义,所以我定义了粗略的近似值。
  • 我已经移动了\mdfsetup{...}环境定义的外部。除此之外,我没有改变环境,mdframed因为我认为它按预期运行

相关内容