我不太明白\ext@arrow
它的amsmath
工作原理。当我查看代码时,它的功能乍一看似乎很简单。
\def\ext@arrow#1#2#3#4#5#6#7{%
\mathrel{\mathop{%
\setbox\z@\hbox{#5\displaystyle}%
\setbox\tw@\vbox{\m@th
\hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}%
\hbox{$\scriptstyle\mkern#3mu{#7}\mkern#4mu$}%
\copy\z@
}%
\hbox to\wd\tw@{\unhbox\z@}}%
\limits
\@ifnotempty{#7}{^{\if0#1\else\mkern#1mu\fi
#7\if0#2\else\mkern#2mu\fi}}%
\@ifnotempty{#6}{_{\if0#1\else\mkern#1mu\fi
#6\if0#2\else\mkern#2mu\fi}}}%
}
第一部分使用#3
和#4
来确定箭头的长度(我称之为长度 A)。第二部分则设置箭头上方或下方的文本,并使用#1
和#2
作为左右边距(我称之为长度 B)。
首先,我认为不需要单独声明#3
和#4
,两者相加就足够了(因为文本总是以使用#3
和放大的箭头为中心#4
)。
在尝试不同的值时,我意识到箭头并不总是长度为 A。如果文本较长(B > A),则箭头也会较长。以下两个示例读取的结果相同。
\documentclass{minimal}
\usepackage{amsmath}
\begin{document}
\makeatletter\noindent
$\ext@arrow 00{20}{20}\rightarrowfill@{a}{b}$\\
$\ext@arrow {20}{20}00\rightarrowfill@{a}{b}$
\end{document}
所以,在这种情况下,根本不需要#3
和#4
。#1
和#2
就足够了。
#3
我认为使用和 的唯一原因#4
是在没有文本的情况下指定箭头的最小长度(在这种情况下永远不会使用#1
和#2
)。但是,我不太明白为什么 A 值的计算如此复杂(包括文本,在这种情况下为空)。
这是历史重担吗?还是我理解错了?
答案1
参数#3
和#4
可以合并为一个参数,因为它们仅设置一些水平尺寸(\wd\tw@
)。但是,如果您想让箭头很长,即使根本没有文本,也不能省略它们,如您在以下带注释的示例中所见:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\makeatletter
\noindent
without text:
\\
$f\ext@arrow 00{15}{15}\rightarrowfill@{}{}g$
\\
$f\ext@arrow 00{30}0\rightarrowfill@{}{}g$ \qquad same result as above
\\
$f\ext@arrow {15}{15}00\rightarrowfill@{}{}g$ \qquad different result
\bigskip
\noindent
with some text you really do not need $\#3$ and $\#4$:
\\
$f\ext@arrow 00{15}{15}\rightarrowfill@{111}{22}g$
\\
$f\ext@arrow 00{30}0\rightarrowfill@{111}{22}g$
\\
$f\ext@arrow {15}{15}00\rightarrowfill@{111}{22}g$ \qquad these three gave the same result
\\
$f\ext@arrow 0{12}{30}0\rightarrowfill@{111}{22}g$
\\
$f\ext@arrow {9}{21}00\rightarrowfill@{111}{22}g$ \qquad these two do the same and move the numbers a bit left. But computing $\#1$ and $\#2$ such that $\#2-\#1=12$ and $\#2+\#1=30$ is necessary.
\end{document}