据我了解,\mathpalette
需要两个参数;第一个必须是一个宏 A,它本身需要两个参数。 A 将作为#1
命令传递,以在调用的位置重现数学环境; A 将作为传递给 调用的第二个参数\mathpalette
传递。例如:#2
\mathpalette
\newcommand\A[2]{\hbox{$\m@th#1(#2)$}}
...
$$\mathpalette\A2$$
将在与上一行(2)
相同的数学环境中显示。(此处,这是一个 displaystyle 环境。)2
到目前为止一切顺利。我的问题是我想使用像 A 这样需要额外参数的宏。我解决这个问题的策略是将 A 保留为 2 个参数的宏(令人满意\mathpalette
),但让 A 调用另一个宏,但只提供它想要的部分参数。其余参数应从调用后的流中的位置读取\mathpalette
。例如:
\newcommand\A[2]{\B#1#2}
\newcommand\B[3]{\hbox{$\m@th#1(#2,#3)$}}
...
$$\mathpalette\A23$$
\mathpalette
A
将使用 中的当前数学环境设置和#1
中的 来2
调用。#2
然后A
应将这些参数传递给B
,并B
应将其作为其第三个参数读取3
,从而产生输出(2,3)
。
但这不能编译。它给出错误:
! Argument of \B has an extra }.
我可以让它编译但坚持\expandafter
或\relax
处于定义的末尾\A
,但我不完全理解我在做什么,而且我的所有胡乱操作都无法让它提供所需的输出(2,3)
。
答案1
问题在于,\mathchoice
(用于定义\mathpalette
)需要四个将立即排版的子公式参数。
在你的例子中,
\newcommand\A[2]{\B#1#2}
\newcommand\B[3]{\hbox{$\m@th#1(#2,#3)$}}
$$\mathpalette\A23$$
我们知道可以
\mathpalette\A23
扩展为
\mathchoice{\A\displaystyle{2}}{\A\textstyle{2}}{\A\scriptstyle{2}}{\A\scriptscriptstyle{2}}3
,但\A\displaystyle{2}
无法排版,因为您无法扩展它。
要修复该问题,您应该\mathchoice
直接使用:
\documentclass{article}
\makeatletter
\newcommand\A[2]{%
\mathchoice
{\B\displaystyle{#1}{#2}}
{\B\textstyle{#1}{#2}}
{\B\scriptstyle{#1}{#2}}
{\B\scriptscriptstyle{#1}{#2}}}
\newcommand\B[3]{\hbox{$\m@th#1(#2,#3)$}}
\begin{document}
$ \A23 $
\end{document}
或者,您可以定义自己的变体\mathpalette
:
\documentclass{article}
\makeatletter
\newcommand\mathpalettetwo[3]{%
\mathchoice
{#1\displaystyle{#2}{#3}}
{#1\textstyle{#2}{#3}}
{#1\scriptstyle{#2}{#3}}
{#1\scriptscriptstyle{#2}{#3}}}
\newcommand\B[3]{\hbox{$\m@th#1(#2,#3)$}}
\begin{document}
$ \mathpalettetwo\B23 $
\end{document}
答案2
使用另一个级别:
\documentclass{article}
\makeatletter
\newcommand{\jim}[2]{\mathpalette\jiminner{{#1}{#2}}}
\newcommand{\jiminner}[2]{\mbox{$\m@th#1\jimsolve#2$}}
\newcommand{\jimsolve}[2]{(#1,#2)}
\makeatother
\begin{document}
$\jim{1}{2}\scriptstyle\jim{3}{4}\scriptscriptstyle\jim{5}{6}$
\end{document}
的两个参数\jim
被打包成一个参数\mathpalette
;然后\jiminner
将控制权传递给\jimsolve
。