进一步扩展问题我想知道是否可以修改这个宏,以便允许在箭头下输入文本,就像 一样\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}