似乎\xrightarrow
mathtools 包中的命令 等不允许我将文本放在两个箭头 ( \rightrightarrows
) 上方或下方。有没有办法用可扩展箭头做到这一点?一种粗略的方法是
\overset{b}{\underset{a}{\rightrightarrows}}
但箭头不可扩展。此外,它也不支持\twoheadrightarrow
等。
答案1
下面的例子定义了\xtwoheadrightarrow
和,类似于和\xtwoheadleftarrow
的定义:\xrightarrow
\xleftarrow
\documentclass{article}
\usepackage{amssymb}
\usepackage{amsmath}
\makeatletter
\providecommand*{\twoheadrightarrowfill@}{%
\arrowfill@\relbar\relbar\twoheadrightarrow
}
\providecommand*{\twoheadleftarrowfill@}{%
\arrowfill@\twoheadleftarrow\relbar\relbar
}
\providecommand*{\xtwoheadrightarrow}[2][]{%
\ext@arrow 0579\twoheadrightarrowfill@{#1}{#2}%
}
\providecommand*{\xtwoheadleftarrow}[2][]{%
\ext@arrow 5097\twoheadleftarrowfill@{#1}{#2}%
}
\makeatother
\begin{document}
\[
A \xrightarrow[under]{over} B
\xtwoheadrightarrow[under]{over} C
\xtwoheadleftarrow[under]{over} D
\]
\end{document}
\rightrightarrows
/ 的情况\leftleftarrows
要复杂得多。之前有一个符号\relbar
用于表示箭头的可扩展部分。但是没有用于双线情况的符号。因此,线条的垂直位置及其厚度是未知的。为此,以下示例定义了由降低和升高的量\relrelbar
组成的宏,这些量在宏中给出。因此,需要为不同的字体重新定义此宏。示例使用 AMS 字体:\relbar
\relrelbarsep
\documentclass{article}
\usepackage{amssymb}
\usepackage{amsmath}
\makeatletter
\newcommand*{\relrelbarsep}{.386ex}
\newcommand*{\relrelbar}{%
\mathrel{%
\mathpalette\@relrelbar\relrelbarsep
}%
}
\newcommand*{\@relrelbar}[2]{%
\raise#2\hbox to 0pt{$\m@th#1\relbar$\hss}%
\lower#2\hbox{$\m@th#1\relbar$}%
}
\providecommand*{\rightrightarrowsfill@}{%
\arrowfill@\relrelbar\relrelbar\rightrightarrows
}
\providecommand*{\leftleftarrowsfill@}{%
\arrowfill@\leftleftarrows\relrelbar\relrelbar
}
\providecommand*{\xrightrightarrows}[2][]{%
\ext@arrow 0359\rightrightarrowsfill@{#1}{#2}%
}
\providecommand*{\xleftleftarrows}[2][]{%
\ext@arrow 3095\leftleftarrowsfill@{#1}{#2}%
}
\makeatother
\begin{document}
\[
A \xrightrightarrows[under]{over} B
\xleftleftarrows[under]{over} C
\]
\end{document}
数字, ... 是包定义的0579
四个参数:\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}}}%
}
一些评论:
- 框的宽度
\tw@
包含下方文字的最大宽度、上方文字的最大宽度以及没有文字的符号的最大宽度。 - 后两个数字指定了测量阶段文本的边距。
- 前两个数字指定最终设置的文本的边距,并允许由于箭头而插入一些水平位置的不对称。
答案2
改编自如何将文字放在波浪箭头上?。请参阅该答案以了解所创建宏的完整描述,但最终要使用的命令是用于右箭头的\rextlinearrow{
字符串}{
整数和用于左箭头的字符串整数。整数是以减号的倍数定义的箭杆长度。字符串是要写在箭头上的文本。}
\lextlinearrow{
}{
}
\documentclass[12pt]{article}
\parskip 1ex
\usepackage{amssymb}
\usepackage{ifthen}
\textwidth 2in
\begin{document}
Here are the commands to make extensible arrows, with no text above
them:
\newcommand{\extline}{$\scriptsize$-$\normalsize$\!}
\newcommand{\lextlineend}{$\scriptsize$\lhd\!$\normalsize$}
\newcommand{\rextlineend}{$\scriptsize\rule{.1ex}{0ex}$\rhd$\normalsize$}
\noindent
$2H_2 + O_2 ~\extline\extline\extline\rextlineend~ 2H_2O $\\
$2H_2 + O_2 ~\lextlineend\extline\extline\extline~ 2H_2O $
Now I will create commands to place text over them
\newcounter{index}
\newcommand\extlines[1]{%
\setcounter{index}{0}%
\whiledo {\value{index}< #1}
{\addtocounter{index}{1}\extline}
}
\newcommand\rextlinearrow[2]{$
\setbox0\hbox{$\extlines{#2}\rextlineend$}%
\tiny$%
\!\!\!\!\begin{array}{c}%
\mathrm{#1}\\%
\usebox0%
\end{array}%
$\normalsize$\!\!%
}
\newcommand\lextlinearrow[2]{$
\setbox0\hbox{$\lextlineend\extlines{#2}$}%
\tiny$%
\!\!\!\!\begin{array}{c}%
\mathrm{#1}\\%
\usebox0%
\end{array}%
$\normalsize$\!\!%
}
\noindent
$2H_2 + O_2 \rextlinearrow{exothermic}{7} 2H_2O $\\
$2H_2 + O_2 \lextlinearrow{heat}{3} ~ 2H_2O $
\end{document}