自定义长度的箭头、上方和下方的文字

自定义长度的箭头、上方和下方的文字

进一步扩展问题我想知道是否可以修改这个宏,以便允许在箭头下输入文本,就像 一样\xrightarrow[below]{under}。我没有使用宏的经验,但使用上述问题的答案,我尝试了这种方法,但没有效果

\newlength{\arrow}
\settowidth{\arrow}{\scriptsize$1000$}
\newcommand*{\myrightarrow}[2]{\xrightarrow[#1]{\mathmakebox[\arrow]{#2}}}

正确的做法是什么?

答案1

这里\xxrightarrow有一个第一个强制参数,即箭头应该适应的下标(参见下面测试文档中的示例)。

\documentclass[a4paper]{article}
\usepackage{amsmath,mathtools}
\makeatletter
\newlength\min@xx
\newcommand*\xxrightarrow[1]{\begingroup
  \settowidth\min@xx{$\m@th\scriptstyle#1$}
  \@xxrightarrow}
\newcommand*\@xxrightarrow[2][]{
  \sbox8{$\m@th\scriptstyle#1$}  % subscript
  \ifdim\wd8>\min@xx \min@xx=\wd8 \fi
  \sbox8{$\m@th\scriptstyle#2$} % superscript
  \ifdim\wd8>\min@xx \min@xx=\wd8 \fi
  \xrightarrow[{\mathmakebox[\min@xx]{\scriptstyle#1}}]
    {\mathmakebox[\min@xx]{\scriptstyle#2}}
  \endgroup}
\makeatother

\begin{document}
$A\xxrightarrow{1000}{1}A$

$A\xxrightarrow{1000}{1000}A\xrightarrow{1000}A$

$A\xxrightarrow{1000}[1]{1}A\xrightarrow[1]{1}A$

\end{document}

所以你称之为

\xxrightarrow{<sample>}[<below>]{<above>}

其中<below>是可选的。

答案2

您所写的语法意味着箭头要使用两个参数进行调用。因此,即使箭头下方没有任何内容,您仍然需要说\myrightarrow{}{above}。要获取可选参数,请将命令定义为:

\newcommand*{\myrightarrow}[2][]{\xrightarrow[#1]{\mathmakebox[\arrow]{#2}}}

但是,这会以不同的方式处理这两个参数。要查看这一点,请尝试在上方和下方参数中放入一段很长的文本。箭头会针对下方参数拉伸,但不会针对上方参数拉伸。为了确保平等对待,我们需要将两个参数都放在 中\mathmakebox。但是,出于间距原因,我们只应在定义了框的情况下将下方参数放在框中。因此,我们对此进行了测试。这是一种方法,可能不是最优雅的(但我不知道我的代码是否优雅!)。

\def\empty{}
\newcommand*{\myrightarrow}[2][]{%
  \def\temp{#1}%
  \ifx\temp\empty
   \def\mycmd{\xrightarrow}%
  \else
   \def\mycmd{\xrightarrow[{\mathmakebox[\arrow]{#1}}]}%
  \fi
  \mycmd{\mathmakebox[\arrow]{#2}}%
 }

它的作用如下:#1是我们第一个参数的占位符。我们想要测试它是否为空,为此我们定义一个临时宏(\temp)来保存它,然后根据预定义\empty宏对其进行测试(TeXperts 注意:我故意避免使用@s)。如果它为空,我们将临时命令定义为\xrightarrow。如果不是,我们将下部与周围的 一起添加\mathmakebox。然后,无论将其设置为何值,我们都会将其与上部代码的命令一起执行。

答案3

这个答案采用了另外两个答案中的想法并将它们结合起来。代码大部分是从@egreg复制而来的。当没有给出下标时,箭头下方不会有保留空间。如果没有给出下标,这会使行更紧凑。

\documentclass[a4paper]{article}
\usepackage{amsmath,mathtools,xparse}
\makeatletter
\newlength\min@xx
\DeclareDocumentCommand\xxrightarrow{ m o m }{%
    \IfNoValueTF%
    {#2}
    {%
        \begingroup
        \settowidth\min@xx{$\m@th\scriptstyle#1$}
        \sbox8{$\m@th\scriptstyle#3$} % superscript
        \ifdim\wd8>\min@xx \min@xx=\wd8 \fi
        \xrightarrow{\mathmakebox[\min@xx]{\scriptstyle#3}}
        \endgroup
    }%
    {%
        \begingroup
        \settowidth\min@xx{$\m@th\scriptstyle#1$}
        \sbox8{$\m@th\scriptstyle#2$}  % subscript
        \ifdim\wd8>\min@xx \min@xx=\wd8 \fi
        \sbox8{$\m@th\scriptstyle#3$} % superscript
        \ifdim\wd8>\min@xx \min@xx=\wd8 \fi
        \xrightarrow[{\mathmakebox[\min@xx]{\scriptstyle#2}}]
        {\mathmakebox[\min@xx]{\scriptstyle#3}}
        \endgroup
    }%
}
\makeatother

\begin{document}    
    $A\xxrightarrow{1000}{1}A$

    $A\xxrightarrow{1000}{1000}A\xrightarrow{1000}A$

    $A\xxrightarrow{1000}[1]{1}A\xrightarrow[1]{1}A$

    $A\xxrightarrow{1000}[1]{1}A\xrightarrow[1]{1}A$
\end{document}

相关内容