\mathpalette
我正在尝试理解这个答案。下面重复一下:
\makeatletter
\newcommand{\raisemath}[1]{\mathpalette{\raisem@th{#1}}}
\newcommand{\raisem@th}[3]{\raisebox{#1}{$#2#3$}}
\makeatother
$\Pi_{\raisemath{2pt}{-}}$
当我这样做时\tracingmacros=1
,日志文件中有趣的部分是:
\raisemath #1->\mathpalette {\raisem@th {#1}}
#1<-2pt
\mathpalette #1#2->\mathchoice {#1\displaystyle {#2}}{#1\textstyle {#2}}
{#1\scriptstyle {#2}}{#1\scriptscriptstyle {#2}}
#1<-\raisem@th {2pt}
#2<--
\raisem@th #1#2#3->\raisebox {#1}{$#2#3$}
#1<-2pt
#2<-\displaystyle
#3<--
etc...
\raisem@th #1#2#3->\raisebox {#1}{$#2#3$}
#1<-2pt
#2<-\textstyle
#3<--
etc...
\mathpalette{\raisem@th{#1}}
从的定义中的代码来看\raisemath
,我认为\mathpalette
在本例中只给出了一个参数 。\raisem@th{2pt}
那么,第二个参数-
最终是如何传递给 的\mathpalette
?
答案1
\mathpalette
确实,宏中只给出了一个参数\raisemath
。第二个参数是\mathpalette
从输入流的其余部分中获取的。
这是一个展示相同设置的较小示例:
\documentclass{article}
\newcommand{\abcd}[1]{\defg{#1}}
\newcommand{\defg}[2]{#1-#2}
\begin{document}
\abcd{1234}{5678}
\end{document}
很明显,\abcd
只需要一个参数,因为定义只有[1]
- 基于输入的参数是{1234}
。因此,
\abcd{1234}{5678}
扩展为
\defg{1234}{5678}
并{5678}
保留在输入流中。现在,\defg
吞噬接下来的两个参数,第一个是{1234}
,第二个是{5678}
。
这是另一个实际的例子:
\documentclass{article}
\newcommand{\boldtext}{\textbf}
\begin{document}
\boldtext{abcd}
\end{document}
\boldtext
被定义为不接受任何参数。但是,我们知道\textbf
接受一个参数。因此,它足以用作 的\boldtext
替代,\textbf
而从技术上讲不必获取 的参数\textbf
。另一种定义它的方法(尽管不是必需的)是明确获取参数:
\newcommand{\boldtext}[1]{\textbf{#1}}
为什么不直接明确定义事物呢?这取决于你想用参数做什么。如果涉及类别代码更改,那么最好不是明确地获取参数。