防止在宏定义中的宏调用中替换“宏参数”

防止在宏定义中的宏调用中替换“宏参数”

我遇到了以下代码的错误Illegal parameter number in definition of \setuplateloadedpackages.。它似乎newcommand无法识别传递给它的“宏参数”crefformat不是它自己的,而是稍后由 cleveref 替换的占位符。我也尝试过\setuplateloadedpackages使用\def和进行定义\let,但无济于事。

\newcommand*{\setuplateloadedpackages}{
    % Configure styles for references.
    \crefformat{section}{\S#2#1#3}
    \crefformat{subsection}{\S#2#1#3}
    \crefformat{subsubsection}{\S#2#1#3}
    \crefrangeformat{section}{\S\S#3#1#4 to~#5#2#6}
    \crefmultiformat{section}{\S\S#2#1#3}{ and~#2#1#3}{, #2#1#3}{ and~#2#1#3}
}

答案1

就这个问题而言,其工作原理非常\crefformat{<counter>}{<code>}相似\def<macroname>{<code>}:,,#1就像普通的宏参数一样工作。#2#3

为了让 TeX 在嵌套宏定义时正确地选择参数所属的宏,你需要将#s每个嵌套级别的 加倍,如中所述参数中的双井号(数字符号,哈希字符)##1 是什么意思?

因为你必须说

\newcommand*{\setuplateloadedpackages}{%
  \newcommand*{\myfoo}[1]{Aha! ##1!}%
}

为了使 LaTeX\setuplateloadedpackages正确地定义\myfoo为采用单个参数并生成的宏Aha! <argument>!,您还必须说

\newcommand*{\setuplateloadedpackages}{%
  % Configure styles for references.
  \crefformat{section}{\S##2##1##3}%
  \crefformat{subsection}{\S##2##1##3}%
  \crefformat{subsubsection}{\S##2##1##3}%
  \crefrangeformat{section}{\S\S##3##1##4 to~##5##2##6}%
  \crefmultiformat{section}{\S\S##2##1##3}{ and~##2##1##3}{, ##2##1##3}{ and~##2##1##3}%
}

相关内容