此问题已在 2017/06/15 版本中修复(可在 CTAN 上获取)。
虽然我使用 LuaTeX 的原语作为答案发布在那里的代码\mathstyle
在 a 的 (de)nominator 内部不起作用\frac
。如果 a\frac
恰好出现在\textstyle
(de)nominator 中,则实际上设置为\scriptstyle
(据我所知),但\mathstyle
stell 等于 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}