使用 \mathpalette 和接受更多参数的宏

使用 \mathpalette 和接受更多参数的宏

据我了解,\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$$

\mathpaletteA将使用 中的当前数学环境设置和#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

在此处输入图片描述

相关内容