LuaTeX 的 \mathstyle 在 \frac (de)nominator 中的值

LuaTeX 的 \mathstyle 在 \frac (de)nominator 中的值

此问题已在 2017/06/15 版本中修复(可在 CTAN 上获取)。

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

虽然我使用 LuaTeX 的原语作为答案发布在那里的代码\mathstyle在 a 的 (de)nominator 内部不起作用\frac。如果 a\frac恰好出现在\textstyle(de)nominator 中,则实际上设置为\scriptstyle(据我所知),但\mathstylestell 等于 2。

在此处输入图片描述

% !TeX program = luatex
\documentclass{article}

\usepackage{parskip,xparse,xcolor}
\usepackage{amsmath,lualatex-math}

\ExplSyntaxOn\makeatletter

\cs_new:Npn \tobi_save_math_style: {
   \int_case:nn { \mathstyle } {
      { \displaystyle } { \tl_set:Nn \l_tobi_saved_math_style_tl { \displaystyle } }
      { \textstyle } { \tl_set:Nn \l_tobi_saved_math_style_tl { \textstyle } }
      { \scriptstyle } { \tl_set:Nn \l_tobi_saved_math_style_tl { \scriptstyle } }
      { \scriptscriptstyle } { \tl_set:Nn \l_tobi_saved_math_style_tl { \scriptscriptstyle } }
   }
}

\NewDocumentCommand { \boxtest }{ m }{
   \mode_if_math:TF {
      % aktuellen Mathemodus ermitteln und für später sichen
      \tobi_save_math_style:
      % Box mit entsprechender Formel speichern
      \hbox_gset:Nn \l_tmpa_box {
         \begingroup
            \(
               \m@th
               \tl_use:N \l_tobi_saved_math_style_tl
               #1
            \)
         \endgroup
      }
   } {
      \hbox_set:Nn \l_tmpa_box { #1 }
   }
   \fbox { \box_use:N \l_tmpa_box }
   [\tl_to_str:n { \mathstyle } = \mathstyle; saved style = \tl_to_str:N \l_tobi_saved_math_style_tl] % for testing!
}

\cs_new:Npn \tobi_genfrac:nnnn #1#2#3#4 {
%   \colorlet { l_tobi_current_color_before_frac } { . }
%   \begingroup
%      \color { #2 }
      \genfrac { } { } { } { #1 } {
%         \color { l_tobi_current_color_before_frac }
         #3
      } {
%         \color { l_tobi_current_color_before_frac }
         #4
      }
%   \endgroup
}

\RenewDocumentCommand { \frac } { O{.} m m } {
   \tobi_genfrac:nnnn { } { #1 } { #2 } { #3 }
}

\makeatother\ExplSyntaxOff

\begin{document}

OK: $a^2 = a^{\boxtest{2}}$

OK: $\displaystyle \frac{1}{2} = \frac{\boxtest{1}}{2}$

OK: $\frac{1}{2} = \boxtest{\frac{1}{2}}$

OK: $\displaystyle \frac{1}{2} = \boxtest{\frac{1}{2}}$

wrong: $\frac{1}{2} \neq \frac{\boxtest{1}}{2}$

wrong: $\genfrac{}{}{}{}{1}{2} \neq \genfrac{}{}{}{}{\boxtest{1}}{2}$

\end{document}

那么...在这种情况下是否也能捕捉到正确的风格?

更新:我添加了一个使用的示例\genfrac,该示例在我的实际文档中用于获取彩色分数线。

答案1

\frac{a}{b}本质上{a \over b},中缀的最大问题\over是它使跟踪当前样式变得困难,luatex 不会改变这一点。

\mathstyle为了获得您需要的版本\Ustack{a \over b} ,因此在 latex 中您必须重新定义\frac并使用相关命令\Ustack

一种可能性就是以这种方式加载lualatex-math重新定义的内容。\frac

答案2

这就是我想出的……

% !TeX program = luatex
\documentclass{article}

\usepackage{parskip,xparse,xcolor}
\usepackage{amsmath,lualatex-math}

\ExplSyntaxOn\makeatletter

\cs_new:Npn \tobi_save_math_style: {
   \int_case:nn { \mathstyle } {
      { \displaystyle             } { \tl_set:Nn \l_tobi_saved_math_style_tl { \displaystyle             } }
      { \crampeddisplaystyle      } { \tl_set:Nn \l_tobi_saved_math_style_tl { \crampeddisplaystyle      } }
      { \textstyle                } { \tl_set:Nn \l_tobi_saved_math_style_tl { \textstyle                } }
      { \crampedtextstyle         } { \tl_set:Nn \l_tobi_saved_math_style_tl { \crampedtextstyle         } }
      { \scriptstyle              } { \tl_set:Nn \l_tobi_saved_math_style_tl { \scriptstyle              } }
      { \crampedscriptstyle       } { \tl_set:Nn \l_tobi_saved_math_style_tl { \crampedscriptstyle       } }
      { \scriptscriptstyle        } { \tl_set:Nn \l_tobi_saved_math_style_tl { \scriptscriptstyle        } }
      { \crampedscriptscriptstyle } { \tl_set:Nn \l_tobi_saved_math_style_tl { \crampedscriptscriptstyle } }
   }
}

\NewDocumentCommand { \boxtest }{ m }{
   \mode_if_math:TF {
      % aktuellen Mathemodus ermitteln und für später sichen
      \tobi_save_math_style:
      % Box mit entsprechender Formel speichern
      \hbox_gset:Nn \l_tmpa_box {
         \begingroup
            \(
               \m@th
               \tl_use:N \l_tobi_saved_math_style_tl
               #1
            \)
         \endgroup
      }
   } {
      \hbox_set:Nn \l_tmpa_box { #1 }
   }
   \fbox { \box_use:N \l_tmpa_box }
%   [\tl_to_str:n { \mathstyle } = \mathstyle; saved style = \tl_to_str:N \l_tobi_saved_math_style_tl] % for testing!
}

% from amsmath.dtx, ll. 696--701
\DeclareRobustCommand{\genfrac}[6]{{%
\@mathstyle{#4}%
\genfrac@choice o{#1}%
{\Ustack{\begingroup#5\endgroup\ifx @#3@\@@over\else\@@above\fi#3\relax#6}}%
\genfrac@choice c{#2}%
}}

\cs_new:Npn \tobi_genfrac:nnnn #1#2#3#4 {
%   \colorlet { l_tobi_current_color_before_frac } { . }
%   \begingroup
%      \color { #2 }
      \genfrac { } { } { } { #1 } {
%         \color { l_tobi_current_color_before_frac }
         #3
      } {
%         \color { l_tobi_current_color_before_frac }
         #4
      }
%   \endgroup
}

\RenewDocumentCommand { \frac } { O{.} m m } {
   \tobi_genfrac:nnnn { } { #1 } { #2 } { #3 }
}

\setlength{\fboxsep}{1pt}
\setlength{\fboxrule}{0.3pt}

\makeatother\ExplSyntaxOff

\begin{document}

OK: $a^2 = a^{\boxtest{2}}$

OK: $a^{2^2} = a^{2^{\boxtest{2}}}$

OK: $\displaystyle \frac{1}{2} = \frac{\boxtest{1}}{2}$

OK: $\frac{1}{2} = \boxtest{\frac{1}{2}}$

OK: $\displaystyle \frac{1}{2} = \boxtest{\frac{1}{2}}$

OK: $\frac{1}{2} = \frac{\boxtest{1}}{2}$

OK: $\frac{1}{2} = \frac{1}{\boxtest{2}}$

OK: $\genfrac{}{}{}{}{1}{2} = \genfrac{}{}{}{}{\boxtest{1}}{2}$

OK: $\binom{1}{2} = \binom{\boxtest{1}}{2}$

OK: $\binom{1}{2} = \binom{1}{\boxtest{2}}$

OK: $\displaystyle\binom{1}{2} = \binom{\boxtest{1}}{2}$

OK: $\displaystyle\binom{1}{2} = \binom{1}{\boxtest{2}}$

OK: $\sum_{n=1}^\infty = \sum_{\boxtest{n=1}}^{\boxtest{\infty}}$

OK: $\displaystyle\sum_{n=1}^\infty = \sum_{\boxtest{n=1}}^{\boxtest{\infty}}$
\end{document}

相关内容