理解 ext@arrows

理解 ext@arrows

我不太明白\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}

相关内容