如何捕捉当前的数学风格?

如何捕捉当前的数学风格?

\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}}$

在此处输入图片描述表明狭窄的风格在下标和下下标中是活跃的。

相关内容