mathtools 包提供了许多命令,例如,\mathmbox
这些命令可保留当前的数学样式。该过程似乎涉及很多\expandafter
s、\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
是为了表明指数的格式正确(而您的代码却不正确)。
答案2
你需要通过二参数\math@sbox
,第一个是要使用的数学样式。
\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}
答案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}