\mathchoice
有助于区分数学风格:
\mathchoice
{<something in \displaystyle>}
{<something in \textstyle>}
{<something in \scriptstyle>}
{<something in \scriptscriptstyle>}
如何使用\mathchoice
来捕捉当前的数学风格?以下方法不起作用:
\documentclass{article}
\makeatletter
\newcommand{\getmathstyle}{%
\mathchoice
{\global\def\curmathstyle{\displaystyle}}
{\global\def\curmathstyle{\textstyle}}
{\global\def\curmathstyle{\scriptstyle}}
{\global\def\curmathstyle{\scriptscriptstyle}}
}
\makeatother
\begin{document}
\ttfamily
$\getmathstyle$ \meaning\curmathstyle\par
$\displaystyle\getmathstyle$ \meaning\curmathstyle\par
$\scriptstyle\getmathstyle$ \meaning\curmathstyle\par
$\scriptscriptstyle\getmathstyle$ \meaning\curmathstyle
\end{document}
答案1
我可能应该发布这个答案(\mathchoice 的正确使用),但我只会引用它。它被改编成scalerel
包,我在其中介绍了语法
\ThisStyle{...\SavedStyle...}
也可以嵌套为
\ThisStyle{...\SavedStyle...\ThisStyle{...\SavedStyle...}...}
调用\ThisStyle
保存当前的数学样式,稍后可以通过 调用\SavedStyle
。最后值得注意的一点是,这种方法使用了 TeX 原语\mathchoice
,它不会遭受其他人注意到的与该mathstyle
包相关的许多兼容性问题。
Werner 在这里要求 MWE,所以这里有一个,其中引入了一个数学符号(三重堆叠下标),它在 中工作得很好\textstyle
。但是,按照最初的定义,数学样式的变化不能迁移到堆栈中,因为它是在 LaTeX 框构造内形成的。因此,为了将数学样式带入堆栈,引入了包中的上述语法scalerel
:
\documentclass{article}
\usepackage{scalerel}
\usepackage[usestackEOL]{stackengine}[2013-09-11]
\stackMath\setstackgap{S}{1pt}
\parindent 0in\parskip 1em
\begin{document}
A unique symbol in textstyle math\\
$A_{\Shortunderstack{a \\ b \\ c}}$
However, the stack doesn't see the scriptstyle\\
$\scriptstyle A_{\Shortunderstack{a \\ b \\ c}}$
Now it does:\\
\def\subterm{\ThisStyle{ A_{\Shortunderstack{%
\SavedStyle a \\ \SavedStyle b \\ \SavedStyle c}}}}
$\textstyle\subterm$
$\scriptstyle\subterm$
$\scriptscriptstyle\subterm$
In these cases, the subscript is one reduced from\\ the main text:\\
\def\subterm{A_{\ThisStyle{\Shortunderstack{%
\SavedStyle a \\ \SavedStyle b \\ \SavedStyle c}}}}
$\textstyle\subterm$
$\scriptstyle\subterm$
\end{document}
这些宏的实际构造scalerel.sty
很简单。它使用\mathchoice
在调用时定义一个开关,该开关\ThisStyle
定义\m@switch
为四个唯一字母之一,具体取决于当前的数学样式。然后它继续使用\ThisStyle
参数中的\mathchoice
。在该参数中遇到时\SavedStyle
,它使用\m@switch
字符构造宏名,方法是将开关字符添加到字符串的末尾\@mstyle
。这四个变体\@mstyleD
、、\@mstyleT
和\@mstyleS
只是\@mstyles
重新调用在调用时保存的数学样式\ThisStyle
。
\def\@mstyleD{\displaystyle}
\def\@mstyleT{\textstyle}
\def\@mstyleS{\scriptstyle}
\def\@mstyles{\scriptscriptstyle}
%
\def\SavedStyle{\csname @mstyle\m@switch\endcsname}
%
\newcommand\ThisStyle[1]{%
\ifmmode%
\def\@mmode{T}\mathchoice%
{\edef\m@switch{D}#1}%
{\edef\m@switch{T}#1}%
{\edef\m@switch{S}#1}%
{\edef\m@switch{s}#1}%
\else%
\def\@mmode{F}%
\edef\m@switch{T}#1%
\fi%
}
答案2
这mathstyle
包裹提供了一种利用当前数学风格的方法,并将其重新定义\mathchoice
为开关。因此,以下是一种可能的解决方案:
\documentclass{article}
\usepackage{mathstyle}% http://ctan.org/pkg/mathstyle
\makeatletter
\newcommand{\getmathstyle}{
\global\edef\curmathstyle{\expandafter\@gobble\mathchoice{\@@displaystyle}{\@@textstyle}{\@@scriptstyle}{\@@scriptscriptstyle}}
}
\makeatother
\begin{document}
\ttfamily
\verb|\textstyle|: $xyz\getmathstyle$ \meaning\curmathstyle \par
\verb|\displaystyle|: $\displaystyle xyz\getmathstyle$ \meaning\curmathstyle \par
\verb|\scriptstyle|: $\scriptstyle xyz\getmathstyle$ \meaning\curmathstyle \par
\verb|\scriptscriptstyle|: $\scriptscriptstyle xyz\getmathstyle$ \meaning\curmathstyle
\end{document}
\mathpalette
充当服务器\mathchoice
(参见的奥秘\mathpalette
),并且可以用一种稍微优雅的方式提取数学样式:
%...
\usepackage{mathstyle}% http://ctan.org/pkg/mathstyle
\newcommand{\getmathstyle}{%
\mathpalette{\global\let\curmathstyle}{\relax}%
}
%...
答案3
LuaTeX 提供了一个\mathstyle
原语,它针对不同的数学风格采用以下值:
- 0 = 显示
- 1 = 狭窄显示
- 2 = 文本
- 3 = 拥挤的文字
- 4 = 脚本
- 5 = 拥挤的脚本
- 6 = 脚本脚本
- 7 = crampedscriptscript
以下是一个示例用法:
\starttext
\startlines
$\displaystyle \sum_{k=0}^n (a_k + b_k): \mathstyle$
$\crampeddisplaystyle \sum_{k=0}^n (a_k + b_k): \mathstyle$
$\textstyle \sum_{k=0}^n (a_k + b_k): \mathstyle$
$\crampedtextstyle \sum_{k=0}^n (a_k + b_k): \mathstyle$
$\scriptstyle \sum_{k=0}^n (a_k + b_k): \mathstyle$
$\crampedscriptstyle \sum_{k=0}^n (a_k + b_k): \mathstyle$
$\scriptscriptstyle \sum_{k=0}^n (a_k + b_k): \mathstyle$
$\crampedscriptscriptstyle \sum_{k=0}^n (a_k + b_k): \mathstyle$
\stoplines
\stoptext
这使
您可以使用以下方式根据当前的数学风格执行某些操作
\ifcase\mathstyle
...
\or
...
\or
... % etc.
\fi
一个有趣的用法是
$\mathstyle_{\mathstyle_{\mathstyle}}$
这表明狭窄的风格在下标和下下标中是活跃的。