没有 \xrightrightarrow[a]{b}?

没有 \xrightrightarrow[a]{b}?

似乎\xrightarrowmathtools 包中的命令 等不允许我将文本放在两个箭头 ( \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@arrowamsmath

\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}

在此处输入图片描述

相关内容