后续问题:可拉伸分隔符忽略上划线
考虑以下代码:
$\left\{ f \right\} \; \left\{ \overline{f} \right\}$
在这种情况下,输出并不令人满意,因为右侧示例中的括号被延伸以覆盖上划线,从而产生不同的括号高度。在上述问题中,@Steven B. Segletes 提出了一个解决方案:
\newcommand\noverline[1]{\vphantom{#1}\smash{\overline{#1}}}
$\left\{ f \right\} \; \left\{ \noverline{f} \right\}$
到目前为止一切顺利。现在我想在整个括号集上方引入一条上划线,但两条上划线排版在同一高度,因此外面的一条(我希望它稍微高一点)完全覆盖了里面的一条:
\newcommand\noverline[1]{\vphantom{#1}\smash{\overline{#1}}}
$\noverline{\left\{ f \right\} \; \left\{ \noverline{f} \right\}}$
有没有什么线索可以实现这一点?在我目前正在排版的文档中,我需要嵌套分隔符和上划线,最多 3 层,因此我担心一次性解决方案无法解决问题。提前致谢!
答案1
这里我展示了 5 次。第一个例子展示了\left...\right
问题,第 2 个示例展示了该问题的修复方法可拉伸分隔符忽略上划线。
当前问题如示例 3 所示,修复\vphantom
方法见示例 4,\myoverline
修复方法见示例 5,如上划线厚度,并修改为采用可选的实数作为上线偏移量。
\documentclass{book}
\usepackage{stackengine}
\usepackage{scalerel}
\parskip 1ex \relax
\parindent 0pt\relax
\newcommand\noverline[1]{\vphantom{#1}\smash{\overline{#1}}}
\newcommand\myoverline[2][1.2]{\ThisStyle{%
\setbox0=\hbox{$\SavedStyle#2$}%
\stackengine{#1\LMpt}{$\SavedStyle#2$}{\rule{\wd0}{.4\LMpt}}{O}{c}{F}{F}{S}%
}}
\begin{document}
Original, with problem:\\
$\left\{ f \right\} \; \left\{ \overline{f} \right\}$
Referenced \verb|\noverline|:\\
$\left\{ f \right\} \; \left\{ \noverline{f} \right\}$
problem in current question:\\
$\noverline{\left\{ f \right\} \; \left\{ \noverline{f} \right\}}$
Vphantom superscript:\\
$\noverline{\left\{ f \right\}^{\vphantom{x}} \; \left\{ \noverline{f} \right\}}$
With \verb|\myoverline| and \verb|\noverline|:\\
$\myoverline[1.9]{\left\{ f \right\} \; \left\{ \noverline{f} \right\}}$
\end{document}
最终结果是,我们现在可以省去并用 替换对它\overline
的引用,这样现在可以采用可选参数(并且可以跨数学风格工作)。\noverline
\myoverline
\noverline
\myoverline
\documentclass{book}
\usepackage{stackengine}
\usepackage{scalerel}
\newcommand\noverline[2][1.2]{\vphantom{#2}\smash{\myoverline[#1]{#2}}}
\newcommand\myoverline[2][1.2]{\ThisStyle{%
\setbox0=\hbox{$\SavedStyle#2$}%
\stackengine{#1\LMpt}{$\SavedStyle#2$}{\rule{\wd0}{.4\LMpt}}{O}{c}{F}{F}{S}%
}}
\begin{document}
$\noverline[1.9]{\left\{ f \right\} \; \left\{ \noverline{f} \right\}}$
$\scriptscriptstyle\noverline[1.9]{\left\{ f \right\} \; \left\{ \noverline{f} \right\}}$
\end{document}
注意:如果希望较小的数学样式上划线保持与显示样式一样粗(原始的情况\overline
),则只需在 的定义中将.4\LMpt
长度更改为。.4pt
\myoverline
答案2
五年后我带着一个(在我看来)更好的答案回到这个问题;欢迎发表评论。
\tl_const:Nn \wine_log@olshrink {0.6mu}
\tl_const:Nx \wine_log@olshrinkfw {\exp_not:N \tex_mkern:D \muskip_eval:n {\wine_log@olshrink}}
\tl_const:Nx \wine_log@olshrinkbw {\exp_not:N \tex_mkern:D \muskip_eval:n {-\wine_log@olshrink}}
\dim_new:N \wine_log@olht
\dim_new:N \wine_log@olprev
\dim_new:N \wine_log@olnat
\dim_new:N \wine_log@oltemp
\box_new:N \wine_log@olbox
\box_new:N \wine_log@phantom
\cs_new:Npn \wine_log_overline:nn #1 #2 {
\ensuremath{
\group_begin:
\dim_set:Nn \wine_log@olprev {\wine_log@olht}
\dim_zero:N \wine_log@olht
\dim_gzero:N \wine_log@oltemp
\hbox_set:Nn \wine_log@olbox {\ensuremath {#2}}
\dim_set_eq:NN \wine_log@olht \wine_log@oltemp
\dim_set:Nn \wine_log@olnat {\box_ht:N \wine_log@olbox}
\box_set_ht:Nn \wine_log@olbox {
\dim_max:nn {\wine_log@olht} {\box_ht:N \wine_log@olbox}
}
\hbox_set:Nn \wine_log@olbox {
\ensuremath {\wine_log@shortened_overline:n {\box_use_drop:N \wine_log@olbox}}
}
\dim_gset:Nn \wine_log@oltemp {
\dim_max:nn {\wine_log@olprev} {\box_ht:N \wine_log@olbox}
}
\bool_if:nF {#1} {
\box_set_ht:Nn \wine_log@olbox {\wine_log@olnat}
}
\box_use_drop:N \wine_log@olbox
\group_end:
}
}
\cs_new:Npn \wine_log@shortened_overline:n #1 {
\wine_log@olshrinkfw
\tex_overline:D {\wine_log@olshrinkbw #1 \wine_log@olshrinkbw}
\wine_log@olshrinkfw
}