我想减少命令中箭头和其上方的符号之间的垂直空间\xrightarrow
。
当然,“硬编码”一个值会导致不幸的结果:
\documentclass{article}
\usepackage{mathtools}
\newcommand\myxrightarrow[1]{
\xrightarrow{\raisebox{-.5ex}[0pt][0pt]{\ensuremath{\scriptstyle#1}}}
}
\begin{document}
\(A \myxrightarrow{\theta} B\)
\(A \myxrightarrow{\theta_D'} B\)
\end{document}
给出
“D” 是在箭頭線。
我怎样才能自适应地减少这个间距?
我已经阅读了该包的文档calc
并尝试了使用各种公式heightof
,但都没有令人满意(至少可以这么说……)。
这个问题与以下问题相关,但并未得到解决:https://tex.stackexchange.com/a/231918/34551。
答案1
答案2
您可以假装箭头的高度比实际的高度要低。由于 TeX 使用它附加限制的符号的高度,因此我们将得到一个较低的上限。
注意:\xrightarrow
基本上是
\mathrel{\mathop{<extended arrow>}\limits_{<lower label>}^{<upper label>}}}
但我们只需要根据我们的目的调整现有的宏。
\documentclass{article}
\usepackage{mathtools}
\makeatletter
%% straight copy from \xrightarrow in amsmath.sty
%% with \rightarrowfill replaced
\NewDocumentCommand{\myxrightarrow}{m}{%
\ext@arrow 0359\smashed@rightarrowfill@{}{#1}%
}
%% we want to define \smashed@rightarrowfill
%% like amsmath.sty does for \rightarrowfill
%% but with \smashed@arrow instead of \rightarrow
\newcommand{\smashed@rightarrowfill@}{%
\arrowfill@\relbar\relbar\smashed@rightarrow
}
%% now define \smashed@rightarrow
%% we need \mathpalette
\newcommand{\smashed@rightarrow}{\mathrel{\mathpalette\smashed@@rightarrow\relax}}
%% we use \raisebox to assign a height
%% the height is that of the formula axis
%% stored in \fontdimen22 <font>2
%% where <font> is one of \textfont, \scriptfont or \scriptscript font
\newcommand{\smashed@@rightarrow}[2]{%
\raisebox{0pt}[\fontdimen22\smashed@font{#1}2]{$\m@th#1\rightarrow$}%
}
%% here we use the current style to select the right font
%% among the three we identified earlier
\newcommand{\smashed@font}[1]{%
\ifx#1\displaystyle\textfont\else
\ifx#1\textstyle\textfont\else
\ifx#1\scriptstyle\scriptfont\else
\scriptscriptfont\fi\fi\fi
}
\makeatother
\begin{document}
\(A \myxrightarrow{\theta} B\) \(A \xrightarrow{\theta} B\)
\(A \myxrightarrow{\theta_D'} B\) \(A \xrightarrow{\theta_D'} B\)
\end{document}
答案3
将框 x 定位在关系符号上是使用 Op math atom 和 来实现的\limits
,这在 TeXbook 附录 G 的规则 13a 中有所描述。我们可以在这里看到,在计算框和关系符号框之间的垂直空间时会减去框 x 的深度,请参见此处的表达式 max(\xi_9,\xi_{11}-d(x))。如果 d(x) 不是太大,则此计算会使 x 的基线保持恒定距离。
你的解决方案创建了一个盒子 x,它的深度为零,其材质向下移动就其基线而言并延伸到框边界以下。框 x 的材料与关系符号重叠,因为其实际深度未用于计算。框 x 的移动可以用原始 TeX 语言重写:
\setbox0=\hbox{\lower.5ex\hbox{$\scriptstyle x$}}\wd0=0 \box0
解决您的问题的一个简单方法是创建一个深度为零且材料向下移动的盒子相对于其底部. 可以通过以下方式实现
\vbox{\hbox{$\scriptstyle x$}\kern-.5ex}
现在盒子被移动了但是它的原始深度并没有被忽略并且它的新深度为零。
你可以试试:
\def\mybuildrel #1\over{\buildrel \vbox{\hbox{$\scriptstyle#1$}\kern-.4ex}\over}
test:
$$
A \mybuildrel \theta \over \rightarrow B, \quad
A \mybuildrel \theta'_D \over \longrightarrow B
$$
\bye
瞧,它起作用了。