はじめに
この記事は,最近設立された東大TeX愛好会の「今週のマクロ」の第2週の記事として書いたものを転用しています。またQiitaへの初投稿ということもあり,テストを兼ねています。
動機
「そこそこ多くの標準のコマンドを覚え,LaTeXに慣れてきた人」にはまだ若干実感が湧かないかもしれませんが,長期にわたって書き足したり修正したりする文書を作成するにあたっては “文書のメンテナンス性の高さ”1 が求められることも多いのではないでしょうか。つまり,後で全体を容易に変更する余地を残した文書作成を意識する必要が出てくるのです。以下では,マークアップ性を重視した文書作成の考え方について,簡単なマクロ定義の例によって見ていきます。
実践
今回はそういった “修正を容易にする” 発想のごく初歩的な例として,有名な集合を書き表すシンプルなマクロを紹介しましょう。ここでいう有名な集合というのは,自然数2,整数,有理数,実数,複素数といった,ラテン文字1字で書き表される集合です。“普通に” やるなら,例えば
$n \in \mathbf{N}^{+}$,$p \in \mathbf{Q}$,$x \in \mathbf{R}$ とする.$
というコードを処理することで
と出力することが可能です。しかし,これらの集合の記法には複数の流儀があります。もしかしたら後で「太字イタリックにすべきだ」という要請があって
と修正したり,或いは「黒板太字にしてほしい」3という依頼があって
に修正することになるかもしれません。こうなるとこれらの集合に使われたすべての\mathbf
を\bm
に置き換えなければならないのですが,集合以外でも\mathbf
を使っていると単純な文字列置換では済まなくなったりして修正が大変です。
そこで,最初に掲げたような “単に出力するための書き方” をするのではなく,まず
\def\usebbsetcapital{\def\setcapital##1{\mathbb{##1}}}
\def\usebfsetcapital{\def\setcapital##1{\mathbf{##1}}}
\def\usebmsetcapital{\def\setcapital##1{\bm{##1}}}
\usebfsetcapital
\def\setC{\setcapital{C}}
\def\setH{\setcapital{H}}
\def\setN{\setcapital{N}}
\def\setNpos{\setcapital{N}^{\mathord{+}}}
\def\setP{\setcapital{P}}
\def\setQ{\setcapital{Q}}
\def\setR{\setcapital{R}}
\def\setRpos{\setcapital{R}^{\mathord{+}}}
\def\setZ{\setcapital{Z}}
というスタイルファイルを保存しておきます。これを用いて,実際に記述する文書を
\documentclass{jsarticle}
\usepackage{amssymb}
\usepackage{bm}
\usepackage{my-style}
\begin{document}
\indent
$n \in \setNpos$,$p \in \setQ$,$x \in \setR$ とする.
\par
\end{document}
として処理すると,やはり
のように出力されますが,これが最初の “単に出力するための書き方” と違うのは,プリアンブル4 の\usepackage{my-style}
以降に
\usebmsetcapital
を追加して処理するだけで
とすべて修正された出力となる点です。つまり,最初から複数の記述方法をとりうるものは一斉に変更できる仕組みにしておこうという考え方です。意味を明示した(セマンティックな)コマンド名にしておけば,コードも見やすくなり,一挙両得!
ただし,セマンティックなコードを目指すあまり複雑なマクロ化を施してしまうと,今度は打つのが大変になりますから,適度な範囲に留めておくことをおすすめします。