使用 \newcommand 定义的字符串作为函数参数

使用 \newcommand 定义的字符串作为函数参数

我目前正在使用 LaTeX 制作海报,一切进展顺利。但是对于海报上的七个框中的每一个,我必须传递八个参数,这些参数将来可能会发生变化。我认为明智的做法是:

\newcommand{\details}{textborder=roundedsmall,borderColor=black,headerborder=open,linewidth=1,boxshade=plain,boxColorOne=box,headerColorOne=head1,headerColorTwo=head2}

进而:

\headerbox{Aims}{name=aims,column=0,below=background,\details}{
    Aims
}

然而这会引发一个错误

Package xkeyval Error: blabla (the contents of \details) undefined in families posterbox.

我已经检查过,\details用自定义命令的内容替换可以正常工作!

关于如何解决这个问题有什么想法吗?

答案1

一种方法是反转调用结构:

\newcommand\myhead[][2]{%
\headerbox{#2}{#1,textborder=roundedsmall,borderColor=black,
               headerborder=open,linewidth=1,boxshade=plain,boxColorOne=box,
               headerColorOne=head1,headerColorTwo=head2}}


..

\myhead[name=aims,column=0,below=background]{Aims}{
    Aims
}

如果你不想这样做,你需要在\details将 keyval 可选参数传递给宏之前进行扩展,一种方法是

\newcommand{\details}{textborder=roundedsmall,borderColor=black,
                       headerborder=open,linewidth=1,boxshade=plain,
                       boxColorOne=box,headerColorOne=head1,headerColorTwo=head2}

\edef\tmp{%
\noexpand\headerbox{Aims}{name=aims,column=0,below=background,\details}}
\tmp{
    Aims
}

相关内容