我目前有几个环境,mdframed
它们之间有大量共享的选项。情况如下
\newmdtheoremenv[options0,options1]{env1}{Environment 1}
\newmdtheoremenv[options0,options2]{env2}{Environment 2}
\newmdtheoremenv[options0,options3]{env3}{Environment 3}
等,其中 等 的位置options0
有一系列不同的选项,如backgroundcolor=red!1
、leftmargin=0.5in
、 等。我不想options0
为每个环境重复写出 中的所有参数,我想知道是否可以使用宏来做到这一点。我试过了
\newcommand{\myopts}{options0}
\newmdtheoremenv[\myopts,options1]{env1}{Environment 1}
\newmdtheoremenv[\myopts,options2]{env2}{Environment 2}
\newmdtheoremenv[\myopts,options3]{env3}{Environment 3}
但它不起作用,告诉我有一个包 kvsetkeys 错误。有什么建议吗?
答案1
这是一件好事,因为它促进了一致性。但是,您的键值参数需要扩展才能使用键值对正确分配。为此,您至少有两个选择:
明确插入
\expandafter
s 以跳过构造,直到到达可选参数:\expandafter\newmdtheoremenv\expandafter[\myopts]{theorem}{Theorem}
使用隐式扩展内容
\begingroup\edef\x{\endgroup% \noexpand\newmdtheoremenv[\myopts]{theorem}{Theorem}}\x
以上魔法定义为除(包括)
\x
之外的所有内容的扩展。也就是说,只有是扩展的。如果我们假设 是使用 定义的\newmdtheoremenv
\endgroup
\myopts
\myopts
\newcommand{\myopts}{ outerlinewidth = 2 ,% roundcorner = 10pt ,% leftmargin = 40 ,% rightmargin = 40 ,% backgroundcolor = yellow!40 ,% outerlinecolor = blue!70!black ,% innertopmargin = \topskip ,% splittopskip = \topskip % }
\x
然后,定义(使用\edef
)之后,\x
类似于(从终端获取):\endgroup \newmdtheoremenv [ outerlinewidth = 2 ,roundcorner = 10pt ,leftmarg in = 40 ,rightmargin = 40 ,backgroundcolor = yellow!40 ,outerlinecolor = blue!7 0!black ,innertopmargin = \topskip ,splittopskip = \topskip ]{theorem}{Theorem }
这正是您所追求的。
答案2
当沃纳回答提出的问题时,我建议mdfdefinestyle
在谈论专门针对mdframed
环境的选项时使用一种方法。
在 中定义每个样式集合\mdfdefinestyle
,然后根据需要组合它们:
\newmdtheoremenv[style=myopts,style=options1]{env1}{Environment 1}
\newmdtheoremenv[style=myopts,style=options2]{env2}{Environment 2}
\newmdtheoremenv[style=myopts,style=options3]{env3}{Environment 3}
代码:
\documentclass{article}
\usepackage{xcolor}
\usepackage[framemethod=tikz]{mdframed}
\mdfdefinestyle{myopts}{%
outerlinewidth = 2 ,%
roundcorner = 10pt ,%
leftmargin = 40 ,%
rightmargin = 40 ,%
outerlinecolor = blue!70!black ,%
innertopmargin = \topskip ,%
splittopskip = \topskip %
}
\mdfdefinestyle{options1}{%
backgroundcolor = yellow!40,
}
\mdfdefinestyle{options2}{
backgroundcolor = blue!20,
frametitlerulecolor=blue,
roundcorner=0pt,
}
\mdfdefinestyle{options3}{%
backgroundcolor = red!20,
frametitle={Options 3 Title},
frametitlebackgroundcolor=olive!40,
frametitlerule=true,
roundcorner=4pt,
}
\newcommand{\myopts}{options0}
\newmdtheoremenv[style=myopts,style=options1]{env1}{Environment 1}
\newmdtheoremenv[style=myopts,style=options2]{env2}{Environment 2}
\newmdtheoremenv[style=myopts,style=options3]{env3}{Environment 3}
\begin{document}
\begin{env1}
This is \textbf{env1}.
\end{env1}
\begin{env2}
This is \textbf{env2}.
\end{env2}
\begin{env3}
This is \textbf{env3}.
\end{env3}
\end{document}