这个问题是以下问题的后续问题
有一些建议,但我无法让以下 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}
由于我需要使用mathspec
XeTeX,因此不能使用 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}