箭头下方的深度较小、最小长度较短且箭头较小?

箭头下方的深度较小、最小长度较短且箭头较小?

我使用下箭头来amsmath修饰消息的方向,如$\underleftarrow{\mathsf{msg}}$( ) 和$\underrightarrow{\mathsf{msg}}$( )。我正在寻找更好的下箭头,有以下几种含义:

  • 整个建筑的深度较小。 下箭头为消息名称增加了深度。我经常在多行结构中使用这些,例如align*,额外的深度会影响明显的间距。例如,比较以下使用下箭头和下划线的版本。
    在此处输入图片描述
    使用\smash[b]确实消除了增加的深度,但出于某种原因,也会将箭头向下移动:
    在此处输入图片描述
  • 较短的最小箭长。 使用标准下箭头时,由单个字母组成的消息名称会被箭头覆盖。例如, $\underleftarrow{\mathsf{p}}$produces 在此处输入图片描述
  • 较小的箭头。 在我看来,箭头对于我的用例来说太大了。

有没有更符合这三个标准的左下箭头和右下箭头? 有没有办法可以构造自己的下箭头?

以下是 MWE,希望它有用:

\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{equation*}
  \begin{aligned}[t]
    &\mathsf{bit_0} \bullet \underleftarrow{\mathsf{inc}} \\
    &\mathsf{bit_1} \bullet \underleftarrow{\mathsf{p}}
  \end{aligned}\quad
  \begin{aligned}[t]
    &\mathsf{bit_0} \bullet \smash[b]{\underleftarrow{\mathsf{inc}}} \\
    &\mathsf{bit_1} \bullet \smash[b]{\underleftarrow{\mathsf{p}}}
  \end{aligned}
\end{equation*}
\end{document}

答案1

我不知道amsmath会使\underleftarrow编译速度减慢多少,也不知道它会如何影响 TikZ,但这里有一个使用 PGF 并避免 TikZ 的解析过程的解决方案。

建议的解决方案只使用一个,\pgfpicture它使用一个在框中排版后测量箭头下方的数学内容

\edef\pgf@math@fam{\the\fam}%

然后

\sbox\pgfutil@tempboxa{$\fam\pgf@math@fam#1#2$}%

其中,已保存的字体设置再次被设置,并结合\mathpalette将当前数学样式转发给\@pgfunderleftarrow

框的宽度存储在\pgfutil@tempdimb其中,然后用于绘制线条(我们\wd\pgfutil@tempboxa也直接使用)。

这样可以让 TeX 按原样排版数学内容,但同时尽可能精确地测量它。后来我意识到,即使是原始版本也\underleftarrow不会保留数学系列字体设置(如\mathsf),所以也许你想再次更改它。

\the\fam技巧由埃格尔在一个2013-07-31 的聊天消息

对于单个符号来说它应该可以工作。

它似乎也适用于多个符号。


箭头的原始定义to

\pgfarrowsdeclare{to}{to}
{ … }{
  \pgfutil@tempdima=0.28pt%
  \advance\pgfutil@tempdima by.3\pgflinewidth%
  \pgfsetlinewidth{0.8\pgflinewidth}
  \pgfsetdash{}{+0pt}
  \pgfsetroundcap
  \pgfsetroundjoin
  \pgfpathmoveto{\pgfqpoint{-3\pgfutil@tempdima}{4\pgfutil@tempdima}}
}

\pgfutil@tempdima最重要的部分是设置\pgfpathmoveto坐标的值4\pgfutil@tempdima构成了箭头的垂直高度。\pgfutil@tempdima的定义中\@pgfunderleftarrow用于计算这个高度(我们不能从一些宏中提取它,比如左边和右边的延伸)。

为了让箭头弧触及数学内容的底部,我们将使用:

\pgfutil@tempdima=0.28pt%
\advance\pgfutil@tempdima by.3\pgflinewidth%
\pgfutil@tempdima-4\pgfutil@tempdima
\advance\[email protected]\pgflinewidth

最后一行添加箭头线的线宽的一半(设置为0.8\pgflinewidth)。

那么为什么我做了不同的事情,即 \pgfutil@tempdima=0.28pt% \advance\pgfutil@tempdima by.8\pgflinewidth% \pgfutil@tempdima-4\pgfutil@tempdima

因为我没有做对(.5而不是.4在乘以因子之前添加线宽4),但它看起来是正确的。

当然,如果您认为看起来更好,您可以改变因素和附加值。

未加星号的版本\pgfunderleftarrow不会增加行的深度(除了数学内容本身的深度)。如果需要这种深度(查看一下),可以使用加\frac星号的版本。\pgfunderleftarrow*

代码

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgf}
\makeatletter
\newcommand*{\pgfunderleftarrow}{%
  \@ifstar
    {\let\ifpgf@depth\iftrue\mathpalette\@pgfunderleftarrow}
    {\let\ifpgf@depth\iffalse\mathpalette\@pgfunderleftarrow}%
}
\newcommand*{\@pgfunderleftarrow}[2]{%
  #2%
  \edef\pgf@math@fam{\the\fam}%
  \pgfpicture
    \pgfsetbaseline{0pt}%                 % "baseline = 0pt"
    \pgf@relevantforpicturesizefalse      % "overlay"
    \pgfsetroundcap                       % "line cap = round"
    \pgfsetarrowsend{to}%                 % "arrows = -to"
    \pgfutil@tempdima=0.28pt%
    \advance\pgfutil@tempdima by.8\pgflinewidth%
    \pgfutil@tempdima-4\pgfutil@tempdima
    \sbox\pgfutil@tempboxa{$\m@th\fam\pgf@math@fam#1#2$}%
    \advance\pgfutil@tempdima-\dp\pgfutil@tempboxa
    \pgfutil@tempdimb\wd\pgfutil@tempboxa
    \pgfpathmoveto{\pgfqpoint{0pt}{\pgfutil@tempdima}}%
    \pgfpathlineto{\pgfqpoint{-\pgfutil@tempdimb}{\pgfutil@tempdima}}%
    \pgfusepath{stroke}%                  % "draw"
    \ifpgf@depth
      \pgf@relevantforpicturesizetrue
      \pgfpathmoveto{\pgfqpoint{0pt}{-\pgfutil@tempdimb}}%
      \pgfusepath{use as bounding box}%
    \fi
  \endpgfpicture
}
\makeatother
\begin{document}
\begin{gather*}
  \mathsf{bit_0} \bullet \underleftarrow{\mathsf{inc}} \\
  \mathsf{bit_1} \bullet \underleftarrow{\mathsf{p}}  \\
  \mathsf{bit_2} \bullet \underleftarrow{\mathsf{f}} \\
  \mathsf{bit_2} \bullet \mathsf{\underleftarrow{f}} \rlap{$\to$ \texttt{\char`\\mathsf} lost?}
\end{gather*}
\begin{gather*}
  \mathsf{bit_0} \bullet \pgfunderleftarrow{\mathsf{inc}} \bullet \mathsf{\pgfunderleftarrow{inc}}\\
  \mathsf{bit_1} \bullet \pgfunderleftarrow{\mathsf{p}} \bullet \mathsf{\pgfunderleftarrow{p}}\\
  \mathsf{bit_2} \bullet \pgfunderleftarrow{\mathsf{f}} \bullet \mathsf{\pgfunderleftarrow{f}}
\end{gather*}
\begin{equation*}
  \frac{\pgfunderleftarrow*{f}}{f} \neq \frac{\pgfunderleftarrow{f}}{f} \neq \frac{\underleftarrow{f}}{f}
\end{equation*}
\end{document}

输出

原文\underleftarrow(最后一行使用\mathsf{\pgfunderleftarrow{f}}

在此处输入图片描述

PGF 版本

在此处输入图片描述

答案2

对于这个解决方案,我给你留下了一些参数供你使用:

\arrowscale箭头大小的乘数

\FPmul箭杆长度尺度上的比例因子(可能应该保持=1)

\FPsub参数是要减去多少箭杆长度(无量纲),为箭头留出空间

\stackunder可选参数是文本和箭头之间的间隙。

我没有\mathrel在它周围使用,但如果您愿意,可以将其插入到定义中。您可以将参数放入其中\scriptstyle,然后箭杆长度将进行调整。但是,箭头尺寸不会缩小。这样可以吗?

[编辑代码以压缩它。]

\documentclass{article} 
\usepackage{stackengine}
\def\useanchorwidth{T}
\usepackage{scalerel}
\usepackage{fp}
\def\arrowscale{.5}% <---CAN PLAY WITH THIS VALUE
\def\clipeq{\scalebox{\arrowscale}{$\kern-1pt\mathrm{-}\kern-1pt$}}
\def\Lla{\scalebox{\arrowscale}{$\kern-1pt\leftarrow\kern-1pt$}}
\def\Lra{\scalebox{\arrowscale}{$\kern-1pt\rightarrow\kern-1pt$}}
\newcount\argwidth
\newcount\clipeqwidth
\savestack\tempstack{\clipeq}%
\clipeqwidth=\wd\tempstackcontent\relax
\newcommand\xarrow[2]{%
  \savestack\tempstack{$#1$}%
  \argwidth=\wd\tempstackcontent\relax%
  \FPdiv\scalefactor{\the\argwidth}{\the\clipeqwidth}%
  \FPmul\scalefactor{\scalefactor}{1}% <---CAN PLAY WITH THIS VALUE
  \FPsub\scalefactor{\scalefactor}{1.8}% <---CAN PLAY WITH THIS VALUE
  \FPmax\scalefactor{\scalefactor}{.05}%
  \stackunder[0.7pt]{$#1$}{$#2$}%
% CAN PLAY WITH ^
}
\newcommand\xrightarrow[1]{\xarrow{#1}{\hstretch{\scalefactor}{\clipeq}\Lra}}
\newcommand\xleftarrow[1]{\xarrow{#1}{\Lla\hstretch{\scalefactor}{\clipeq}}}
\parskip 1ex
\begin{document} 
$\xrightarrow{a}~~
\xleftarrow{a}$

$\xrightarrow{ab}~~
\xleftarrow{ab}$

$\xrightarrow{abc}~~
\xleftarrow{abc}$

$\xrightarrow{abcd}~~
\xleftarrow{abcd}$

$\xrightarrow{abcde}~~
\xleftarrow{abcde}$
\end{document}

在此处输入图片描述

以下是\arrowscale设置为 0.4、\stackunder可选参数设置为 0.4pt 以及\FPsub参数设置为 1.7 的一些结果:

在此处输入图片描述

答案3

这个问题被提升到了主页,因为它是作为网站“\\ 错误”清理的一部分进行编辑的,我忍不住要说一下,这个halloweenmath包(这不是开玩笑,它存在,我是它的作者!)除了与传统万圣节相关图像相关的其他几个数学符号外,还具有该amsmath包提供的上下箭头的“脚本”版本。相关命令名为\overscriptleftarrow\overscriptrightarrow\overscriptleftrightarrow\underscriptleftarrow\underscriptrightarrow\underscriptleftrightarrow。它们的实现机制与较大的命令完全相同,因此只需要 Knuth 的原始 TeX。

这是一个简单的代码示例:

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

%   If you want to pass options to the "amsmath" package,
%   uncomment the following line:
% \usepackage[<your_options>]{amsmath}
\usepackage{halloweenmath} % automatically loads "amsmath"

\usepackage{lipsum} % just for this example, it generates the "Lorem ipsum..." 
                    % dummy text



\begin{document}

This is the usual underarrow: \( \underleftarrow{\mathsf{inc}} \); this, one the
other hand, is the smaller underarrow provided by the \textsf{halloweenmath}
package: \( \underscriptleftarrow{\mathsf{inc}} \).  Note the different impact 
on line spacing.  \lipsum*[4]

The following example is drawn directly from the question:
\begin{equation*}
  \begin{aligned}[t]
    &\mathsf{bit_0} \bullet \underleftarrow{\mathsf{inc}} \\
    &\mathsf{bit_1} \bullet \underleftarrow{\mathsf{p}}
  \end{aligned}\quad
  \begin{aligned}[t]
    &\mathsf{bit_0} \bullet \underscriptleftarrow{\mathsf{inc}} \\
    &\mathsf{bit_1} \bullet \underscriptleftarrow{\mathsf{p}}
  \end{aligned}
\end{equation*}
Each user should judge by hersefl\slash himself whether the result fulfill
her\slash his needs.

\end{document}

输出为

上述代码的输出

我再说一遍,您应该自己判断它是否达到了您的预期。

相关内容