如何在宏调用中展开宏

如何在宏调用中展开宏

如何在可选参数列表中扩展宏

\newcommand{\sss}{%
label={$\bullet$},topsep=0mm, parsep=0mm,% leftmargin=3mm,rightmargin=0cm,labelwidth=5mm,labelsep=3mm%
}

\begin{itemize}[\sss] 
\item gugus
\end{itemize}

这不起作用(没有给出任何好的调试信息)。那么扩展是错误的吗?

我怎样才能解决这个问题?

答案1

keyval 解析器通常不会扩展参数(否则诸如此类的事情会因为扩展过早font=\small而严重崩溃。\small

所以最简单的方法是使用

\newenvironment{sss}{%
\begin{itemize}[label={$\bullet$},topsep=0mm, parsep=0mm,% leftmargin=3mm,rightmargin=0cm,labelwidth=5mm,labelsep=3mm%
]}
{\end{itemize}}

\begin{sss}
\item gugus
\end{sss}

答案2

通常,键值解析器需要直接查看语法字符=,。因此,宏\sss应该展开一次。这可以通过大量的来完成\expandafter

\expandafter\begin\expandafter{\expandafter i\expandafter t ...\expandafter}\expandafter[\sss]

或者整个表达式可以扩展为宏:

\edef\next{%
  \noexpand\begin{itemize}[\unexpanded\expandafter{\sss}]%
}\next

这里,阻止了一次扩展之后\unexpanded的进一步扩展,以防止值扩展过早。\sss

相关内容