##
我有时看到人们在定义/使用参数时使用双井号( )。
#1
普通参数和双符号参数之间有什么区别##1
?其使用有什么限制吗?如果有的话,您能列出这种类型参数的良好做法吗?
答案1
它允许在嵌套的宏定义中使用参数。
在
\def\a#1{\def\b#1{...}}
该宏\b
没有参数,因为#1
它属于\a
并且将被其参数替换。
然而,
\def\a#1{\def\b##1{...}}
\b
用参数定义。在扩展期间
#1
将被参数替换##
变成#
然后\b
就可以#1
代替原来的使用了##1
。
因此,对于每个嵌套级别,您需要将#
字符数加倍:
\def\a#1{\def\b##1{\def\c####1{...}}}
例子:
\documentclass{article}
\def\a#1{\def\b##1{#1 ##1}}
\begin{document}
\a{x} % consequence: \def\b#1{x #1}
\b{y} % prints: x y
\end{document}
在 LaTeX 语法中这将是:
\newcommand{\a}[1]{%
\newcommand{\b}[1]{#1 ##1}}
或者,由于\a
和\b
已经定义,如果你在小例子中尝试一下,你会看到,
\renewcommand{\a}[1]{%
\renewcommand{\b}[1]{#1 ##1}}