我使用两个(将来可能会有更多)几乎相同的环境,其定义为
%%% 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}}\blackink
remark
\newcounter{remark}[chapter]
chapter
\theremark
remark
cyan
\theremark
definition
\colorbox
cyan
\arabic{remark}
- 由于
\blackink
,\whiteink
和\cyan
在问题发布的代码中没有定义,所以我定义了粗略的近似值。 - 我已经移动了
\mdfsetup{...}
环境定义的外部。除此之外,我没有改变环境,mdframed
因为我认为它按预期运行