やりたいこと
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
を付けることで長い矢印を出力できるようになります。具体的には、以下の表のコマンドが利用できるようになります。
長い矢印の出力結果 | 長い矢印のコマンド | 備考 |
---|---|---|
\longhookrightarrow |
単射 | |
\longtwoheadrightarrow |
全射 | |
\longrightsquigarrow |
ニョロニョロ矢印 | |
\longdashrightarrow |
点線矢印 |
またここに書かれていない矢印も大抵の場合なら同様の方法で長い版を出力できますし、他にも色々と凝った矢印を出力することが可能です(後述)。
ここで何をやっているのかを以下で解説します。
前提
以下の表が示すように、多くの矢印のコマンドは前にlong
を付け足すことで長い矢印を出力できます。1
矢印 | 矢印のコマンド | 長い矢印 | 長い矢印のコマンド | |
---|---|---|---|---|
$\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]\&{}
によって矢印を記述しています。
この部分には以下の技術的な注意点があります。
- 本文でこの数式を書く場合には単に
\arrow[r, hook] &
とすれば良いのですが、プリアンブル中にこれをそのまま書くとエラーが出てしまいます。これは&
が原因です。そこでtikzcd環境のオプションで&
の代わりに\&
を使うように指定します。これが上のコードのampersand replacement=\&
の部分です。2 - 矢印
\arrow[r, hook]
の前後を{}
で挟みます。これによって矢印が結ぶ両端をダミーの空白にしています。 - デフォルトだと矢印の前後の空きが大きくなってしまいます。そこで前後の空きを
cramped
で抑制しています。 - 矢印の長さを
sep=scriptsize
で調節しています。3
なお、矢印の長さはtikz-cdパッケージのドキュメントの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パッケージのドキュメントの1.3節に記載されています。
他の方法
上ではtikz-cdパッケージを用いましたが、他の方法でも矢印を長くすることができます。
xyパッケージを用いる方法
Long Squiggly Arrows in LaTeX - Stack Exchange の回答によれば、xyパッケージを用いることでも矢印を長くできるようです。4
しかしながら、本記事の方法に比べると以下の弱点があります。
- xyパッケージとtikz-cdパッケージはどちらも可換図式を描くためのものですが、tikz-cdの方が後発で使い勝手が良いです。
- LuaLaTeXではxyパッケージを用いるとコンパイルが通りません。5
old-arrowsパッケージを用いる方法
プリアンプルに\usepackage[new]{old-arrows}
と書くと、\longhookrightarrow
や\longtwoheadrightarrow
とすることで $\hookrightarrow$ や $\twoheadrightarrow$ の長い版を出力することができます。6
またold-arrowsパッケージのドキュメントの4.5節にあるように、他にもいくつかの矢印の長い版を出力できます。
ですがニョロニョロ矢印 $ \rightsquigarrow $ や点線矢印 $ \dashrightarrow $ の長い版を出力することはできません。
stix2パッケージを用いる方法
Special Long Arrows - Stack Exchangeの回答によると、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$が従う」ということを表すのに用いられます。7 これは $\leadsto$ のコマンドとして\rightsquigarrow
だけではなく\leadsto
があることからも推察されます。
とは言えこれはインフォーマルな記法で、論文やレポートに用いることはありません。セミナーや研究集会などの場で用いられています。8
ニョロニョロ矢印 $\leadsto$ を板書するときには矢印が長くなりがちです。ニョロニョロの部分があるので仕方ありません。
手書きのニョロニョロ矢印に慣れていると、LaTeXで出力される $\leadsto$ は短くて違和感を覚えるかもしれません(私はそうでした)。
そこでニョロニョロ矢印をbeamerで作成する講演スライドで用いたくなったとき、長いニョロニョロ矢印が必要になるのです。
これがこの記事を書いたきっかけでした。
-
なお、他の矢印のコマンドについては 【LaTeX】矢印(写像,極限,同値)のコマンド107個一覧 - 数学の景色 が参考になります。 ↩
-
この部分は "Single ampersand used with wrong catcode" error using tikz matrix in beamer - Stack Exchange を参考にしました。 ↩
-
この部分はLaTeXで可換図式:tikz-cd - にっき♪ の「インライン」の項を参考にしました)。 ↩
-
本記事の方法に至る上でこの回答が非常に役立ちました。 ↩
-
なお LuaLaTeX and xypic - Stack Exchange にあるように、プリアンプルに
\RequirePackage{luatex85}
と書いてLuaTeXのバージョンを下げれば対処できますが、あまり推奨される方法ではないように思われます。 ↩ -
この方法は Command for \longhookrightarrow [duplicate] - Stack Exchange の回答で知りました。 ↩
-
なお、$\leadsto$ の代わりに $\Rightarrow$ を用いてはいけません。「$A \Rightarrow B$」は「$A$ならば$B$」という命題を表すのであって、「$A$から$B$が従う」という証明中の論理的なステップを表すわけではないからです。 ↩
-
この用法がどのくらい浸透しているかは分かりませんが、少なくとも筆者の周辺の数論研究者の間では国際的に用いられているようです。 ↩