上划线、分隔符,再上划线

上划线、分隔符,再上划线

后续问题:可拉伸分隔符忽略上划线

考虑以下代码:

$\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
}

相关内容