我可以将一组可选参数转换为宏吗?

我可以将一组可选参数转换为宏吗?

我目前有几个环境,mdframed它们之间有大量共享的选项。情况如下

\newmdtheoremenv[options0,options1]{env1}{Environment 1}
\newmdtheoremenv[options0,options2]{env2}{Environment 2}
\newmdtheoremenv[options0,options3]{env3}{Environment 3}

等,其中 等 的位置options0有一系列不同的选项,如backgroundcolor=red!1leftmargin=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

这是一件好事,因为它促进了一致性。但是,您的键值参数需要扩展才能使用键值对正确分配。为此,您至少有两个选择:

  1. 明确插入\expandafters 以跳过构造,直到到达可选参数:

    \expandafter\newmdtheoremenv\expandafter[\myopts]{theorem}{Theorem}
    
  2. 使用隐式扩展内容

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

enter image description here

代码:

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

相关内容