如何在 \hbox_set 中转换数学样式?

如何在 \hbox_set 中转换数学样式?

这个问题是以下问题的后续问题

有一些建议,但我无法让以下 MWE 与构造一起工作\ThisStyle{...\SavedStyle...}。我想保存一些内容数学或者水平盒子中的文本,同时保持正确的数学样式。目前,如果将所有内容放入我的盒子中,则所有内容都是双脚本样式。

% !TeX program = xelatex
\documentclass[11pt]{scrartcl}

\usepackage{xparse,scalerel,parskip}

\ExplSyntaxOn\makeatletter

% - #1: Box-Register
% - #2: Content
\cs_new:Npn \tobiw_set_text_or_math_hbox:nn #1#2 {
   \mode_if_math:TF {
      \ThisStyle {
      \hbox_gset:Nn #1 {
         \(
            \SavedStyle
            #2
         \)
      }
      }
   } {
      \hbox_gset:Nn #1 {
         #2
      }
   }
}
\cs_generate_variant:Nn \tobiw_set_text_or_math_hbox:nn { Nn, NN }


\NewDocumentCommand { \boxtest } { m } {
   \tobiw_set_text_or_math_hbox:Nn \l_tmpa_box { #1 }
   \box_use:N \l_tmpa_box
}

\makeatother\ExplSyntaxOff

\begin{document}

\boxtest{Box}

$a \boxtest{a}$

$a^2 a^{\boxtest{2}}$

$\frac{2}{3} \boxtest{\frac{2}{3}}$

\[\frac{2}{3} \boxtest{\frac{2}{3}}\]

\end{document}

由于我需要使用mathspecXeTeX,因此不能使用 LuaTeXs\mathstyle原语。

答案1

我只是把它\ThisStyle作为第一件事\boxtest,而将它留在\SavedStyle原处。

\SavedStyle和没有必要\ThisStyle成为同一个宏的一部分,只要\SavedStyle在 的参数中有效调用即可\ThisStyle

我花了一点时间才发现 Tobi 的代码到底出了什么问题。重申一下我下面的评论,原作者\hbox在 的范围内生成\ThisStyle,但试图在 的参数之外使用它\ThisStyle。该宏\ThisStyle是 的美化版本\mathchoice,它将在所有 mathstyles 中生成框,并在最后一刻选择使用哪一个。通过在参数\hbox之外使用生成的\ThisStyle(即\box_use:N \l_tmpa_box),原作者在 之外使用它\mathchoice,因此只使用\hbox生成的 4 个 es 中的最后一个,它将始终是\scriptscriptstyle

% !TeX program = xelatex
\documentclass[11pt]{scrartcl}

\usepackage{xparse,scalerel,parskip}

\ExplSyntaxOn

% - #1: Box-Register
% - #2: Content
\cs_new:Npn \tobiw_set_text_or_math_hbox:nn #1#2 {
   \mode_if_math:TF {
%      \ThisStyle {
      \hbox_gset:Nn #1 {
         \(
            \SavedStyle
            #2
         \)
      }
%      }
   } {
      \hbox_gset:Nn #1 {
         #2
      }
   }
}
\cs_generate_variant:Nn \tobiw_set_text_or_math_hbox:nn { Nn, NN }


\NewDocumentCommand { \boxtest } { m } {\ThisStyle{%
   \tobiw_set_text_or_math_hbox:Nn \l_tmpa_box { #1 }
   \box_use:N \l_tmpa_box
}}

\ExplSyntaxOff

\begin{document}

\boxtest{Box}

$a \boxtest{a}$

$a^2 a^{\boxtest{2}}$

$\frac{2}{3} \boxtest{\frac{2}{3}}$

\[\frac{2}{3} \boxtest{\frac{2}{3}}\]

\end{document}

在此处输入图片描述

答案2

由于\ThisStyle解决\SavedStyle方案需要作者/用户进行大量的思考(即…),我决定使用 LuaTeX,它有一个简单的原语,\mathstyle用于保存当前数学样式的整数。然后保存当前数学样式就很容易了:

% !TeX program = lualatex
\documentclass[11pt,parskip]{scrartcl}

\usepackage{xparse}
\usepackage{amsmath}
\usepackage{xcolor}
\usepackage{tikz}

\ExplSyntaxOn\makeatletter

\cs_new_eq:NN \tobi_saved_math_style: \textstyle
\cs_new:Npn \tobi_save_math_style: {
   \int_case:nn { \mathstyle } {
      { \displaystyle } { \cs_set_eq:NN \tobi_saved_math_style: \displaystyle }
      { \textstyle } { \cs_set_eq:NN \tobi_saved_math_style: \textstyle }
      { \scriptstyle } { \cs_set_eq:NN \tobi_saved_math_style: \scriptstyle }
      { \scriptscriptstyle } { \cs_set_eq:NN \tobi_saved_math_style: \scriptscriptstyle }
   }
}


% - #1: Box register
% - #2: font switches (always outside math)
% - #3: box content
\cs_new:Npn \tobi_set_text_or_math_hbox:nnn #1#2#3 {
   \mode_if_math:TF {
      \tobi_save_math_style:
      \hbox_gset:Nn #1 {
         #2
         \(
            \m@th
            \tobi_saved_math_style:
            #3
         \)
      }
   } {
      \hbox_set:Nn #1 {
         #2 #3
      }
   }
}
\cs_generate_variant:Nn \tobi_set_text_or_math_hbox:nnn { Nnn, NNN, NnN, NNn }


\tikzset {
   highlight~node/.style = {
      fill = yellow, inner~sep = \z@,
   },
}

% - #1: content (text or math)
\NewDocumentCommand{ \highlight }{ m }{
   \tobi_set_text_or_math_hbox:Nnn \l_tmpa_box { \bfseries \boldmath } { #1 }
   \begin{tikzpicture} [ baseline = (N.base) ]
      \node [ highlight~node ] (N) {
         \box_use:N \l_tmpa_box
      };
   \end{tikzpicture}
}


\ExplSyntaxOff\makeatother

\begin{document}

\highlight{High}light

$super^{\highlight{super}^{\highlight{script}}}$

$\highlight{\frac{text}{style}}$

\[\highlight{\frac{display}{style}}\]

\end{document}

LuaTeX 的 \mathstyle 在 \frac (de)nominator 中的值后续问题。

相关内容