如何按比例减少符号高度的空间?

如何按比例减少符号高度的空间?

我想减少命令中箭头和其上方的符号之间的垂直空间\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

最简单的解决方案是使用\height\depth避免重叠。

\documentclass{article}
\usepackage{mathtools}

\newcommand\myxrightarrow[1]{
    \xrightarrow{\raisebox{-0.4ex}[\dimexpr \height-0.4ex][\depth]{\ensuremath{\scriptsize#1}}}
}
\begin{document}
    \(A \myxrightarrow{\theta} B\)
    
    \(A \myxrightarrow{\theta_D'} B\)
\end{document}

演示

答案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

瞧,它起作用了。

相关内容