「証明終わり」の記号

\documentclass{jsarticle}
 
\usepackage{amsmath}
 
\newcommand{\qed}{%
	\relax\ifmmode
		\eqno{%
		\setlength{\fboxsep}{2pt}\setlength{\fboxrule}{0.3pt}
		\fbox{\rule[2pt]{0pt}{1ex}}}
	\else
		\begingroup
		\setlength{\fboxsep}{2pt}\setlength{\fboxrule}{0.3pt}
		\hfill\fbox{\rule[2pt]{0pt}{1ex}}
		\endgroup
	\fi}
 
\begin{document}
 
\title{ 今週のマクロ \\ Week 1 }
\author{ 東大\TeX 愛好会 }
\date{ }
\maketitle
 
我思う故に我あり.\qed
 
\[ x^2=y^2+z^2\qed \]
 
\end{document}

qed.png

本当にLaTeXを使い始めたばかりの人からよく聞かれる質問の1つに「ラテフって証明終わりの”あの”縦長い四角出せないの?」というのがあります.確かに(筆者の見た限り)典型的な「LaTeXの記号一覧」にはそのような記号は載っていません.しかし,だからといって「LaTeXがその記号を出力できない」というのはもちろん間違いです.そうです,なければ自分で作ればいいのです.

ということで作ってみたのが上記のマクロです.使い方は至って簡単で,証明が終わったところで\qedを書き込むだけです.amsmath.styが必要ですが,別行立ての数式中でも使用できるようにしてあります(インラインの数式モード$...$中では使用しないでください).

さて,これは実際のところかなり単純なマクロではありますが,今回は初回ということもあるので,以下では少し丁寧にその”しくみ”を説明していこうと思います.では,今回の目標を明確にしておきましょう.

  1. “縦長の四角”(以下,白ハルモス記号)を出力する
  2. 紙面の右端に出力する
  3. 別行立て数式環境(\[...\]など)でも使用可能にする

白ハルモス記号の作成

LaTeXの命令に”囲み枠”を出力するための\fboxという命令がありますので,今回はこれを使用することにします.この”囲み枠”の中に,しばしば”支柱”として用いられる幅0ptの\rule(罫線)を入れ込みます.

\rule命令は

\rule[〈持ち上げ量〉]{〈幅〉}{〈高さ〉}

という書式を持っているので,これをうまく利用して白ハルモス記号の形を調節します(幅は0ptのままにしておく).

\fbox{\rule[2pt]{0pt}{1ex}}

上記の数字は筆者の環境(感覚)で適当な形になるように恣意的に定めたものなので,各自数字を調節して気に入る形にすると良いと思います.

また,白ハルモス記号の大きさや線の太さは\fbox命令が内部で使用する寸法レジスタの値を変更することで調節できます.その寸法レジスタというのは具体的には\fboxsep\fboxruleで,それぞれ四角の大きさと線の太さを制御できます.LaTeX式にこれらの値を変更するためには,以下のようにします.

\setlength{\fboxsep}{2pt}
\setlength{\fboxrule}{0.3pt}

これらの値も恣意的に定めたものなので,好みに合わせて変えてみてください.

注意:これらの値を普通に変更すると,\qed命令以外の場面で\fboxを使用するときもそれらの値が適用されてしまいます.これを避ける場合には,寸法レジスタの変更箇所を局所化する必要があります(\qedの定義を{...}または\begingroup ... \endgroupで囲っておけば良い).

さて,あとはこの記号を右端に出力するようにすれば,テキスト中で使用可能な\qed命令が完成しますが,これはとても簡単です.\hfill命令という「横方向に可能な限り大きな空白を空ける」命令があるのでこれを利用します.これまでに作成した白ハルモス記号と合わせて以下のように\qed命令を定義します.

\newcommand{\qed}{%
	\begingroup
	\setlength{\fboxsep}{2pt}\setlength{\fboxrule}{0.3pt}
	\hfill\fbox{\rule[2pt]{0pt}{1ex}}
	\endgroup}

これで,ひとまず使用可能な\qed命令を作ることができました.しかし,\hfill命令は数式モード中では効力を発揮しないので,\qed命令も数式モード中に使用することができません(エラーにはなりませんが,右端ではなく直前の文字のすぐ後ろに出力されてしまいます).

数式モードへの対応

証明が別行立ての数式で終わるということ自体,数学系の出版業界的に褒められたことなのかどうか不明なのですが,少なくとも一般にはそうした需要が少なからずあるだろうということで,これを実装することにしました.ただし,(技術的な問題以前に)レイアウト上の問題で「最後の数式には式番号がつかない」ことを前提としています.

既に述べたように数式モード中では(通常は)\hfill命令等を使用することはできないので,手動で数式番号をつけるために用意されている\eqno命令を利用することにします.これを用いれば,別行立ての数式中で使用可能な\mathqed命令を作成することが可能になります(amsmath.styが読み込まれていないとエラーになります).

\newcommand{\mathqed}{%
	\eqno{%
	\setlength{\fboxsep}{2pt}\setlength{\fboxrule}{0.3pt}
	\fbox{\rule[2pt]{0pt}{1ex}}}}

しかし,\qed命令と\mathqed命令を使い分けるのは少々面倒であり,またそうする理由もないので条件分岐を用いてこれを\qedに統合します.すなわち,TeXのプリミティブ命令に\ifmmode(if math modeに由来)というのがあり,

\ifmmode
	(数式モード中の場合の処理)
\else
	(数式モード中でない場合の処理)
\fi

という条件分岐を行うことができるので,これを利用して,冒頭に掲載した\qed命令が完成します(\ifmmodeを使用する前には\relaxを入れるようにしておくと,予期せぬエラーを防げるようです).

\newcommand{\qed}{%
	\relax\ifmmode
		\eqno{%
		\setlength{\fboxsep}{2pt}\setlength{\fboxrule}{0.3pt}
		\fbox{\rule[2pt]{0pt}{1ex}}}
	\else
		\begingroup
		\setlength{\fboxsep}{2pt}\setlength{\fboxrule}{0.3pt}
		\hfill\fbox{\rule[2pt]{0pt}{1ex}}
		\endgroup
	\fi}

おわりに

今回は初回ということで,比較的単純なマクロでかつある程度実用性のあるものをということでこうした題材を選んでみました.とはいえ,単純な中にもいくつかの仕掛けをしておいたので,ユーザーの工夫次第で様々な応用が可能だと思います.

例えば,今回は「白ハルモス記号」(これは筆者の造語です)で証明終わりを表現しましたが,もとはといえば証明終わりは黒塗りのハルモス記号(∎)を用いるのが伝統的で,その白抜き版の白ハルモス記号はあくまでその代用記号です.ご覧の通り,ハルモス記号にはUnicodeの割り当てU+220E(∎)がありますが,環境依存文字なので必ずしもすべての環境で出力できるわけではありません.上の紹介文中に登場した命令だけを用いても,このUnicode文字を用いずにハルモス記号を出力するマクロを作成することができます.お時間のある方,実装してみてはいかがでしょうか.