LaTeXで様々な矢印を長くする方法

# やりたいこと

LaTeXで様々な種類の矢印の長い版を出力したい。
例えば単射 $\hookrightarrow$ (`\hookrightarrow`) 、全射 $\twoheadrightarrow$ (`\twoheadrightarrow`) 、ニョロニョロ矢印 $ \rightsquigarrow $ (`\rightsquigarrow`, `\leadsto`) 、点線矢印 $ \dashrightarrow $ (`\dashrightarrow ') などの長い版を出力したい。


# 解決策

プリアンブルに

```
\usepackage{tikz}
\usetikzlibrary{cd, decorations.pathmorphing}
\newcommand{\longhookrightarrow}{\begin{tikzcd}[cramped,sep=scriptsize,ampersand replacement=\&]{}\arrow[r, hook]\&{}\end{tikzcd}} % 長い単射
\newcommand{\longtwoheadrightarrow}{\begin{tikzcd}[cramped,sep=scriptsize,ampersand replacement=\&]{}\arrow[r, two heads]\&{}\end{tikzcd}} % 長い全射
\newcommand{\longrightsquigarrow}{\begin{tikzcd}[cramped,sep=scriptsize,ampersand replacement=\&]{}\arrow[r, squiggly]\&{}\end{tikzcd}} % 長いニョロニョロ矢印
\newcommand{\longdashrightarrow}{\begin{tikzcd}[cramped,sep=scriptsize,ampersand replacement=\&]{}\arrow[r, dashed]\&{}\end{tikzcd}} % 長い点線矢印
```

と書くと、上のコマンドに`long`を付けることで長い矢印を出力できるようになります。具体的には、以下の表のコマンドが利用できるようになります。

| 長い矢印の出力結果 | 長い矢印のコマンド | 備考 |
|:-:|:-:|:-:|
| <img width="50" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795757/a9a27b13-dff0-14b5-e26b-da63346f6a4f.png"> | `\longhookrightarrow`  | 単射 |
| <img width="50" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795757/ae084774-06c9-66a7-e180-07e49a2ffaea.png"> | `\longtwoheadrightarrow`  | 全射 |
| <img width="50" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795757/4bac4cdc-fd4a-d674-c919-5cf9e66789fa.png">　 | `\longrightsquigarrow`  |  ニョロニョロ矢印 |
| <img width="50" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795757/30204ea1-f2d6-6d42-44f0-5068baab66b4.png">　| `\longdashrightarrow`  | 点線矢印 |

またここに書かれていない矢印も大抵の場合なら同様の方法で長い版を出力できますし、他にも色々と凝った矢印を出力することが可能です（[後述](#応用)）。

ここで何をやっているのかを以下で解説します。


# 前提

以下の表が示すように、多くの矢印のコマンドは前に`long`を付け足すことで長い矢印を出力できます。[^1]

[^1]: なお、他の矢印のコマンドについては [【LaTeX】矢印(写像,極限,同値)のコマンド107個一覧 - 数学の景色](https://mathlandscape.com/latex-arrow/) が参考になります。

| 矢印 | 矢印のコマンド |  | 長い矢印 | 長い矢印のコマンド |
|:-:|:-:|:-:|:-:|:-:|
| $\to$ | `\to`, `\rightarrow` |   | $\longrightarrow$ | `\longrightarrow`  |
| $\leftarrow$ | `\leftarrow` |   | $\longleftarrow$ | `\longleftarrow`  |
| $\leftrightarrow$ | `\leftrightarrow` |   | $\longleftrightarrow$ | `\longleftrightarrow`  |
| $\mapsto$ | `\mapsto` |   | $\longmapsto$ | `\longmapsto`  |

しかしながら、長い矢印のコマンドが用意されていない矢印が多くあります。代表例が本記事で扱う以下の矢印たちです。

| 矢印 | コマンド | 備考 |
|:-:|:-:|:-:|
| $\hookrightarrow$ | `\hookrightarrow`  | 単射 |
| $\twoheadrightarrow$ | `\twoheadrightarrow`  | 全射 |
| $\rightsquigarrow$ | `\rightsquigarrow`  |  ニョロニョロ矢印 |
| $\dashrightarrow$ | `\dashrightarrow`  | 点線矢印 |

これらのコマンドの先頭に`long`を付けて、例えば`\longhookrightarrow`や`\longtwoheadrightarrow`などと入力してみてもエラーが出ることが分かります。


# コードの解説

上のコードで行っていることを解説します。

アイデアは**tikz-cd**パッケージという可換図式を描くのに用いられるパッケージに備わっている豊富な矢印の描画方法を用いるというものです。

コードの中身を見ていきます。
まず、

```
\usepackage{tikz}
\usetikzlibrary{cd, decorations.pathmorphing}
```

によってtikz-cdパッケージという可換図式を描くのに用いられるパッケージを読み込みます。
次に、

```
\newcommand{\longhookrightarrow}{\begin{tikzcd}[cramped,sep=scriptsize,ampersand replacement=\&]{}\arrow[r, hook]\&{}\end{tikzcd}} % 長い単射
```

とすることで`\longrightsquigarrow`というコマンドを新しく定義し、このコマンドを打つと

```
\begin{tikzcd}[cramped,sep=scriptsize,ampersand replacement=\&]
    {}\arrow[r, hook]\&{}
\end{tikzcd}
```

が命令されるようにしています。
ここではtikzcd環境を用い、2行目の`{}\arrow[r, hook]\&{}`によって矢印を記述しています。
この部分には以下の技術的な注意点があります。

1. 本文でこの数式を書く場合には単に`\arrow[r, hook] &`とすれば良いのですが、プリアンブル中にこれをそのまま書くとエラーが出てしまいます。これは`&`が原因です。そこでtikzcd環境のオプションで`&`の代わりに`\&`を使うように指定します。これが上のコードの`ampersand replacement=\&`の部分です。[^2]
1. 矢印`\arrow[r, hook]`の前後を`{}`で挟みます。これによって矢印が結ぶ両端をダミーの空白にしています。
1. デフォルトだと矢印の前後の空きが大きくなってしまいます。そこで前後の空きを`cramped`で抑制しています。
1. 矢印の長さを`sep=scriptsize`で調節しています。[^2a]

[^2]: この部分は ["Single ampersand used with wrong catcode" error using tikz matrix in beamer - Stack Exchange](https://tex.stackexchange.com/questions/15093/single-ampersand-used-with-wrong-catcode-error-using-tikz-matrix-in-beamer) を参考にしました。

[^2a]: この部分は[LaTeXで可換図式：tikz-cd - にっき♪](https://abenori.blogspot.com/2015/07/tikz-cd.html) の「インライン」の項を参考にしました）。

なお、矢印の長さは[tikz-cdパッケージのドキュメント](https://ctan.math.washington.edu/tex-archive/graphics/pgf/contrib/tikz-cd/tikz-cd-doc.pdf)の6ページにあるように以下の表に示した6通りのオプションで指定できますが、ここでは一番基本の矢印`\longrightarrow` ($\longrightarrow$）に最も近い長さの`scriptsize`を採用しました。

| オプション名 | 文字サイズ |
|:-:|:-:|
| `tiny`  | 0.45 em  |
| `small`  |  0.9 em  |
| `scriptsize`  | 1.35 em  |
| `normal`  | 1.8 em  |
| `large`  | 2.7 em  |
| `huge`  | 3.6 em  |

# 応用

上の文字サイズのオプションを変更すれば矢印の長さを変更できます。また`\arrow[r, hook]`のオプションを変更すれば矢印の種類や向きを変えることができます。点線の単射など、複数のオプションをドッキングさせた矢印を書くこともできます。矢印のオプションは[tikz-cdパッケージのドキュメント](https://ctan.math.washington.edu/tex-archive/graphics/pgf/contrib/tikz-cd/tikz-cd-doc.pdf)の1.3節に記載されています。


# 他の方法

上ではtikz-cdパッケージを用いましたが、他の方法でも矢印を長くすることができます。

### xyパッケージを用いる方法

[Long Squiggly Arrows in LaTeX - Stack Exchange](https://tex.stackexchange.com/questions/99017/long-squiggly-arrows-in-latex) の回答によれば、xyパッケージを用いることでも矢印を長くできるようです。[^3]
しかしながら、本記事の方法に比べると以下の弱点があります。
* xyパッケージとtikz-cdパッケージはどちらも可換図式を描くためのものですが、tikz-cdの方が後発で使い勝手が良いです。
* LuaLaTeXではxyパッケージを用いるとコンパイルが通りません。[^4]

[^3]: 本記事の方法に至る上でこの回答が非常に役立ちました。
[^4]: なお [LuaLaTeX and xypic - Stack Exchange](https://tex.stackexchange.com/questions/328602/lualatex-and-xypic) にあるように、プリアンプルに`\RequirePackage{luatex85}`と書いてLuaTeXのバージョンを下げれば対処できますが、あまり推奨される方法ではないように思われます。

### old-arrowsパッケージを用いる方法

プリアンプルに`\usepackage[new]{old-arrows}`と書くと、`\longhookrightarrow`や`\longtwoheadrightarrow`とすることで $\hookrightarrow$ や $\twoheadrightarrow$ の長い版を出力することができます。[^5]
また[old-arrowsパッケージのドキュメント](https://ftp.jaist.ac.jp/pub/CTAN/fonts/old-arrows/doc/old-arrows.pdf)の4.5節にあるように、他にもいくつかの矢印の長い版を出力できます。

ですがニョロニョロ矢印 $ \rightsquigarrow $ や点線矢印 $ \dashrightarrow $ の長い版を出力することはできません。

[^5]: この方法は [Command for \longhookrightarrow [duplicate] - Stack Exchange](https://tex.stackexchange.com/questions/364096/command-for-longhookrightarrow) の回答で知りました。

### stix2パッケージを用いる方法

[Special Long Arrows - Stack Exchange](https://tex.stackexchange.com/questions/643993/special-long-arrows)の回答によると、stix2パッケージを用いることでも長い矢印を書くことができるようです（私は試していません）。

# 長いニョロニョロ矢印はいつ使うのか？

この記事では様々な種類の矢印を長くする方法を紹介しましたが、実は私にとって必要に迫られたのは**長いニョロニョロ矢印**でした。ですが「そんなものを一体いつ使うのか」と思う方もいらっしゃるでしょう。
**長いニョロニョロ矢印**は以下のように用いられます。

**問題** $a=\sqrt{2}$に対し$(a^2 - 2)^3 + 1$を計算せよ。

**解答** $a=\sqrt{2}$ $\leadsto$ $a^2 - 2 = 0$ $\leadsto$ $(a^2 - 2)^3 + 1 = 1$.

このように「$A \leadsto B$」は「$A$から$B$が従う」ということを表すのに用いられます。[^a] これは $\leadsto$ のコマンドとして`\rightsquigarrow`だけではなく`\leadsto`があることからも推察されます。
とは言えこれはインフォーマルな記法で、**論文やレポートに用いることはありません**。セミナーや研究集会などの場で用いられています。[^b]

[^a]: なお、$\leadsto$ の代わりに $\Rightarrow$ を用いてはいけません。「$A \Rightarrow B$」は「$A$ならば$B$」という命題を表すのであって、「$A$から$B$が従う」という証明中の論理的なステップを表すわけではないからです。
[^b]: この用法がどのくらい浸透しているかは分かりませんが、少なくとも筆者の周辺の数論研究者の間では国際的に用いられているようです。

ニョロニョロ矢印 $\leadsto$ を板書するときには矢印が長くなりがちです。ニョロニョロの部分があるので仕方ありません。
手書きのニョロニョロ矢印に慣れていると、LaTeXで出力される $\leadsto$ は短くて違和感を覚えるかもしれません（私はそうでした）。
そこでニョロニョロ矢印をbeamerで作成する講演スライドで用いたくなったとき、長いニョロニョロ矢印が必要になるのです。
これがこの記事を書いたきっかけでした。