我使用下箭头来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}
输出为
我再说一遍,您应该自己判断它是否达到了您的预期。