了解 \mathpalette 的扩展

了解 \mathpalette 的扩展

\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}}

为什么不直接明确定义事物呢?这取决于你想用参数做什么。如果涉及类别代码更改,那么最好不是明确地获取参数。

相关内容