月別アーカイブ: 2016年5月

\newtheorem と \autoref

\newtheorem の基本

LaTeX で数学の文章を書く際には、 \newtheorem コマンドによって定理用の環境(下の例だと theorem という名前)を定義できる。

\newtheorem{theorem}{Theorem} % theorem 環境を定義

\begin{theorem}
  人類は滅亡する。
\end{theorem}

このとき、自動的に定理番号がついて「Theorem 1  人類は滅亡する。」と出力される。

この定理を別の場所で参照したいと思った時は、定理を書くときに

\begin{theorem} \label{thm:very-important-theorem}
  人類は滅亡する。
\end{theorem}

という風にラベルをつけておく。参照するときは「Theorem \ref{thm:very-important-theorem} より」と書けば「Theorem 1 より」という風に自動的に定理番号が出力される。(ただし、定理番号を正しく出力するためには LaTeX を2回実行する必要がある)

\autoref の基本

さて、 hyperref パッケージを使うと、定理番号の部分がハイパーリンクになる。だが、「Theorem 1 より」の「1」の部分だけではなくて、「Theorem」の部分もハイパーリンクにできないものか。

そのために、 hyperref パッケージには \autoref というコマンドが用意されている。 “Theorem \ref{thm:very-important-theorem}” の代わりに “\autoref{thm:very-important-theorem}” と書くと 「Theorem 1」全体がハイパーリンクになる。

ただし、環境の名前(より正確には、カウンターの名前)が “theorem” 以外の場合は、定理番号の前の “Theorem” に相当する文字列を自前で定義してやらねばならない。また、環境(カウンター)の名前が “theorem” であっても、定理番号の前の文字列を ”Theorem” から変えたい場合は自分で上書きする必要がある。

定理番号の前の文字列は、 “\〈環境の名前〉autorefname”(より正確には “\〈カウンターの名前〉autorefname”)という名前のコマンドで定義・上書きできる。

\newtheorem{theorem}{Theorem} % theorem 環境を定義
\renewcommand{\theoremautorefname}{定理} % \theoremautorefname は hyperref によって定義済み。なので「上書き」する
\newtheorem{lemma}{Lemma} % lemma 環境を定義
\newcommand{\lemmaautorefname}{補題}

\begin{theorem} \label{thm:very-important-theorem} % → Theorem 1
  人類は滅亡する。
\end{theorem}

\begin{lemma} \label{lem:very-important-lemma} % → Lemma 1
  第 $n$ 次世界大戦($n\gg 1$)が勃発することは、人類が滅亡する十分条件である。
\end{lemma}

\autoref{thm:very-important-theorem} % → 定理 1
\autoref{lem:very-important-lemma} % → 補題 1

続きを読む

\mathfrak と打つのがだるい

数学の一部の分野では、フラクトゥールが多用される。数式中でフラクトゥールな文字をLaTeXで書く際は \mathfrak{a} とか書くわけだが、たくさん出てくると入力するのがだるい。

短い名前をつける

幸い、LaTeXにはマクロ機能があるので、 \mathfrak のコマンド名が長いと思ったら、短い名前を与えてやれば良い。

\newcommand\mf{\mathfrak}
\mf{a} % → \mathfrak{a} になる
\mf a % → 上に同じ。コマンドの引数が1文字の場合は { } を省略できる

個々の文字にコマンドを割り当てるという手もある。

\newcommand\a{\mathfrak{a}}
\a % → \mathfrak{a} になる…はず

が、しかし、 \a という名前のコマンドは LaTeX によってすでに定義されているようで、 \newcommand でエラーが出る。\renewcommand を使えば定義を上書きできるが、副作用が怖い。

別の名前を試してみよう。

\newcommand\aa{\mathfrak{aa}}
\aa % → \mathfrak{a} になる…はず

が、しかし、\aa という名前のコマンドも LaTeX によってすでに定義されているのであった。

このように、「短い名前をつける」という戦略は「名前の衝突」によって阻まれる可能性がある。\renewcommand や、TeX primitive の \def によって上書きすることはできるが、既存のコマンドの不具合(副作用)を引き起こす可能性は否定できない。

ただ、上書きするスコープを限定してやれば、副作用を引き起こす可能性は小さくできるかもしれない。

{ % スコープを作る
\renewcommand\aa{\mathfrak{a}}
$\aa$ % → \mathfrak{a} になる
} % スコープを閉じる

\aa % → 元の意味(å)になる

\begin{center} % \begin{} 〜 \end{} は一つのスコープになる
\renewcommand\aa{\mathfrak{a}}
$\aa$ % → \mathfrak{a} になる
\end{center}

\aa % → 元の意味(å)になる

毎回 \renewcommand\aa{\mathfrak{a}} と打つのが面倒だったら、これもマクロにすると良いだろう。

\newcommand\UseMathFrak{%
  \renewcommand\aa{\mathfrak{a}}%
}

{ % スコープを作る
\UseMathFrak
$\aa$ % → \mathfrak{a} になる
} % スコープを閉じる

\aa % → 元の意味(å)になる

\begin{center} % \begin{} 〜 \end{} は一つのスコープになる
\UseMathFrak
$\aa$ % → \mathfrak{a} になる
\end{center}

\aa % → 元の意味(å)になる

短い名前をつける(亜種)

普通のコマンド名はバックスラッシュ \ から始まるが、コマンド名として使えるものはこれだけではない。TeX 標準では、半角チルダ ~ を単独で(バックスラッシュなしに)コマンド名として使うことができる。

知っての通り、半角チルダ ~ は標準では「改行しない空白」という意味を持つが、そこは\renewcommand で上書きしてやる。

\renewcommand~{\mathfrak}
~a % → \mathfrak a と等価

既存のコマンドを上書きすると副作用が怖い、とか、元のコマンドが使えなくなる、という場合は、スコープの中で \renewcommand することによって影響範囲を小さくできる。

Unicode の文字を使う

Unicode には、様々な字体の「数式用アルファベット」が用意されている。その中には、フラクトゥールもある。これらを LaTeX ソース中に直接記述すれば、\mathfrak といちいち書かなくても良くなるのではないか。

スクリーンショット 0028-05-26 19.24.28

unicode-math パッケージを使うと、 Unicode の数式用アルファベットで書いたものを LaTeX\mathfrak 等で書いたものと等価にしてくれる。

ただし、 unicode-math パッケージを使うには LuaTeXXeTeX が必要である(e-upTeX や pdfTeXでは使えない)。

注意点として、 unicode-math を使うと Unicode の数式用アルファベットのカテゴリーコードが変わるようだ。unicode-math を使わなければカテゴリーコード11 (letter) だが、unicode-math を使うとカテゴリーコード12 (other) になる。どう影響するかというと、 例えば

𝔞\to𝔟     % ← \to の後に空白がない

と書いた時に、 unicode-math を使わないと「文字 “𝔞”」「コマンド名 “\to𝔟”」として解釈されるのが、 unicode-math を使うと「文字 “𝔞”」「コマンド名 “\to”」「文字 “𝔟”」として解釈されるようになる。普通は前者の挙動の方が望まれるとは思うが。

unicode-math を使わない(使えない)場合、 Unicode の数式用アルファベットのカテゴリーコードを13 (active) にしてマクロを定義するという手がある。

\catcode`𝔞=\active % “𝔞” という文字を単独でコマンド名として使えるようにする
\newcommand{𝔞}{\mathfrak{a}}
𝔞 % → \mathfrak{a} に展開される

いずれにせよ、TeX エンジンの側で Unicode に対応している必要がある。

Unicode の数式用アルファベットを使う方法ならば、「短い名前をつける」方法にあった「コマンド名がかぶる」という問題は存在しない。ただし、デメリットとして、 Unicode の数式用アルファベットを入力するのは面倒くさいということが挙げられる。

結論

エディター側で入力支援的なものが欲しい。