如何创建保留当前风格的特殊数学宏?

如何创建保留当前风格的特殊数学宏?

mathtools 包提供了许多命令,例如,\mathmbox这些命令可保留当前的数学样式。该过程似乎涉及很多\expandafters、\mathpalette\m@th。以下 MWE 编译,但上标不应可见,并且是。此外,我如何创建一个双参数宏(如\savebox),其中只有第二个参数处于数学模式?

\documentclass{amsart}

\makeatletter
\newcommand{\mathsbox}{\expandafter\mathpalette\expandafter\math@sbox}
\newcommand{\math@sbox}[1]{\sbox0{$\m@th #1$}}
\makeatother

\begin{document}
\begin{equation*}
  x^{\mathsbox{2}} = a
\end{equation*}

\end{document}

答案1

\mathpalette需要两个参数,第一个参数应该是两个论点宏。使用你的代码,调用

\mathsbox{2}

扩展为

\expandafter\mathpalette\expandafter\math@sbox{2}

什么\expandafter都不做,所以你得到

\mathpalette\math@sbox{2}

现在,\math@sbox用单个参数来定义,这很糟糕。根据\mathpalette

% latex.ltx, line 4289:
\def\mathpalette#1#2{%
  \mathchoice
    {#1\displaystyle{#2}}%
    {#1\textstyle{#2}}%
    {#1\scriptstyle{#2}}%
    {#1\scriptscriptstyle{#2}}}

你现在得到

  \mathchoice
    {\math@sbox\displaystyle{2}}%
    {\math@sbox\textstyle{2}}%
    {\math@sbox\scriptstyle{2}}%
    {\math@sbox\scriptscriptstyle{2}}}

这将排版四个数学子公式,扩展每个参数;第一个变成

\sbox0{$\m@th\displaystyle$}{2}

其余三个也类似。所以\box0设置为一个包含空公式的框。

即使你\math@sbox用两个参数来定义,你也不会得到任何真正有用的东西,因为\box0结果会是无效的。

如果您想以定义时当前的样式正确地保存框,您可以使用该mathstyle包(但它有一些怪癖,要小心)。

\documentclass{amsart}
\usepackage{mathstyle}

\makeatletter
\newcommand{\mathsavebox}[2]{%
  \global\setbox#1=\hbox{$\m@th\currentmathstyle#2$}%
}
\makeatother

\newsavebox{\mybox}

\begin{document}
\begin{equation*}
  x^{\mathsavebox{\mybox}{2}} = a^{\usebox{\mybox}}{}^2
\end{equation*}

\end{document}

{}^2是为了表明指数的格式正确(而您的代码却不正确)。

enter image description here

答案2

你需要通过参数\math@sbox,第一个是要使用的数学样式。

Sample output

\documentclass{amsart}

\makeatletter
\newcommand{\mathsbox}{\expandafter\mathpalette\expandafter\math@sbox}
\newcommand{\math@sbox}[2]{\sbox0{$\m@th #1#2$}}
\makeatother

\begin{document}

\begin{equation*}
  x^{\mathsbox{2}} = a
\end{equation*}

\end{document}

添加\tracingmacros=1将在日志文件中显示传递给每个宏的参数。请参阅https://tex.stackexchange.com/a/34412/15925以便很好地描述 的工作原理\mathpalette

答案3

\ThisStyle{...\SavedStyle...}该包的功能可以scalerel将当前的数学样式扩展到通常会丢失的地方,例如盒子。但是,要将保存的数据传输到组外\ThisStyle\xdef必须使用。

\documentclass{amsart}
\usepackage{scalerel,amsmath}
\newcommand{\mathsbox}[1]{\ThisStyle{\xdef\xyz{\fbox{$\SavedStyle#1$}}}}
\begin{document}
\begin{equation*}
  x^{\mathsbox{2}} = a \quad\text{What was saved and boxed earlier?} \xyz
\end{equation*}
\end{document}  

enter image description here

答案4

如果要将当前数学样式中的某些内容保存到框中,则必须使用 LuaTeX。它提供了\mathstyle可用于查询当前数学样式的原语。

% arara: lualatex
\documentclass{amsart}

\makeatletter
\DeclareRobustCommand\getmathstyle[1]{%
  \ifcase \mathstyle
    \let#1=\displaystyle
  \or
    \let#1=\crampeddisplaystyle
  \or
    \let#1=\textstyle
  \or
    \let#1=\crampedtextstyle
  \or
    \let#1=\scriptstyle
  \or
    \let#1=\crampedscriptstyle
  \or
    \let#1=\scriptscriptstyle
  \or
    \let#1=\crampedscriptscriptstyle
  \fi
}

\DeclareRobustCommand\mathsbox[1]{%
  \getmathstyle\currentmathstyle
  \global\setbox0=\hbox{$\m@th\currentmathstyle#1$}%
}
\makeatother

\begin{document}

$\mathsbox{\int}$ \box0

\[\mathsbox{\int}\] \box0

\end{document}

enter image description here

相关内容