如何在数学段上绘制带有标签的线,而不使用 MnSymbol 中的 \overlinesegment?

如何在数学段上绘制带有标签的线,而不使用 MnSymbol 中的 \overlinesegment?

这是我的代码:

\documentclass{acmart}
\usepackage{MnSymbol}
\newcommand*{\ohat}[2]{%
  \stackrel{\textcolor{gray}{#1}}{%
    \textcolor{gray}{%
      \overlinesegment{\textcolor{black}{%
        \vrule height 8pt depth 1pt width 0pt%
        #2%
      }}%
    }%
  }%
}
\begin{document}
$x = 42 \times \ohat{y}{5 + 8}$
\end{document}

其渲染效果如下:

在此处输入图片描述

是否可以做同样的事情,但没有MnSymbol?此包与amssymb其他一些ams*包冲突,因为这里讨论

答案1

如果可以使用单边括号而不是双边括号,\overbracket数学工具您可能对该包感兴趣。

下面,我使用\overbracket宏来定义一个名为 的用户宏\ohat,它将gray上括号和括号上方显示的材料设置为默认“颜色”。例如,$x = 42 \times \ohat{5+8}{y}$。可以通过指定替代颜色作为可选参数来覆盖默认颜色;例如,$x = 42 \times \ohat[blue]{5+8}{z}$

在此处输入图片描述

\documentclass{acmart}
\acmConference{}{}{}   % just for this example
\usepackage{mathtools} % for \overbracket macro
\usepackage{xcolor}    % for \textcolor macro

\newcommand\ohat[3][gray]{%
   \overbracket[0.4pt][2pt]{\textcolor{black}{#2}}^{\color{#1}#3}}
   
\begin{document}
$x = 42 \times \ohat{5+8}{y}$

\medskip
$x = 42 \times \ohat[blue]{5+8}{z}$
\end{document}

答案2

以下是导入所需符号的步骤。

首先看一下\overlinesegment

\DeclareRobustCommand{\overlinesegment}{\mathpalette{\overarrow@\linesegmentfill@}}

这表明该命令使用与相同的基础结构\xrightarrow。好的,现在我们需要\linesegmentfill@

\def\linesegmentfill@{\arrowfill@\leftfootline\relbar\rightfootline}

好的,我们需要\leftfootline\rightfootline

\Decl@Mn@Char\rightfootline          {MnSyA}{\mathrel}
\Decl@Mn@Char\upfootline             {MnSyA}{\mathrel}
\Decl@Mn@Char\leftfootline           {MnSyA}{\mathrel}
\Decl@Mn@Char\downfootline           {MnSyA}{\mathrel}

嗯,MnSymbol不太友好,因为它只列出符号并自动步进插槽编号。解决方法并不难,因为我们可以询问 TeX。

\documentclass{article}
\usepackage{MnSymbol}
\show\rightfootline
\show\leftfootline
\stop

控制台会告诉你

> \rightfootline=\mathchar"3478
> \leftfootline=\mathchar"347A.

我们知道需要找到MnSyA

\DeclareSymbolFont{MnSyA}         {U}  {MnSymbolA}{m}{n}
\SetSymbolFont{MnSyA}       {bold}{U}  {MnSymbolA}{b}{n}
\DeclareFontFamily{U}  {MnSymbolA}{}
\DeclareFontShape{U}{MnSymbolA}{m}{n}{
    <-6>  MnSymbolA5
   <6-7>  MnSymbolA6
   <7-8>  MnSymbolA7
   <8-9>  MnSymbolA8
   <9-10> MnSymbolA9
  <10-12> MnSymbolA10
  <12->   MnSymbolA12}{}
\DeclareFontShape{U}{MnSymbolA}{b}{n}{
    <-6>  MnSymbolA-Bold5
   <6-7>  MnSymbolA-Bold6
   <7-8>  MnSymbolA-Bold7
   <8-9>  MnSymbolA-Bold8
   <9-10> MnSymbolA-Bold9
  <10-12> MnSymbolA-Bold10
  <12->   MnSymbolA-Bold12}{}

我们已经拥有了我们需要的一切。

\documentclass{acmart}

\DeclareFontFamily{U}  {MnSymbolA}{}
\DeclareFontShape{U}{MnSymbolA}{m}{n}{
    <-6>  MnSymbolA5
   <6-7>  MnSymbolA6
   <7-8>  MnSymbolA7
   <8-9>  MnSymbolA8
   <9-10> MnSymbolA9
  <10-12> MnSymbolA10
  <12->   MnSymbolA12}{}
\DeclareFontShape{U}{MnSymbolA}{b}{n}{
    <-6>  MnSymbolA-Bold5
   <6-7>  MnSymbolA-Bold6
   <7-8>  MnSymbolA-Bold7
   <8-9>  MnSymbolA-Bold8
   <9-10> MnSymbolA-Bold9
  <10-12> MnSymbolA-Bold10
  <12->   MnSymbolA-Bold12}{}

\DeclareSymbolFont{MnSyA}         {U}  {MnSymbolA}{m}{n}
\SetSymbolFont{MnSyA}       {bold}{U}  {MnSymbolA}{b}{n}
\DeclareMathSymbol{\rightfootline}{\mathrel}{MnSyA}{"78}
\DeclareMathSymbol{\leftfootline}{\mathrel}{MnSyA}{"7A}

\makeatletter
\DeclareRobustCommand{\overlinesegment}{\mathpalette{\overarrow@\linesegmentfill@}}
\def\linesegmentfill@{\arrowfill@\leftfootline\relbar\rightfootline}
\makeatother

\newcommand*{\ohat}[2]{%
  \overset{\textcolor{gray}{#1}}{%
    \colorlet{currentcolor}{.}%
    \textcolor{gray}{%
      \overlinesegment{\textcolor{currentcolor}{%
        \vrule height 8pt depth 1pt width 0pt
        #2%
      }}%
    }%
  }%
}
\begin{document}
$x = 42 \times \ohat{y}{5 + 8}$
\end{document}

请注意\overset,还有\stackrel更好的色彩管理,所以如果当前颜色不是黑色,宏也会起作用。

在此处输入图片描述

相关内容