Sokratesさんの備忘録ないし雑記帳

書きたいことを書いている.駄文注意.

本文に直接 mathbf と書くのをやめよう 〜LaTeX 初心者よ,見栄えと構造の分離を意識せよ〜

という煽りタイトルをつければ興味を引くかなと思った.簡単な内容で申し訳ない.「そもそもお前も LaTeX 初心者だろ」と言われると「それはそう」と言うほかない.

この記事は TeX & LaTeX Advent Calendar 2021 - Adventar の21日目の記事です.20日目は hilssh さんの うぶつん: LaTeXで宛名ラベルシールの差し込み印刷をする という記事でした.22 日目は t-kemmochi さんの tcolorboxでスライドを作る - Qiita という記事です.参加者の中で一番 TeX プログラミングに暗い人間ですが,Twitter で回転画像を眺めていたら書かなければいけない気になってきたので書きます.重点テーマとあまり関係ない内容で申し訳ない.

見栄えと構造の分離をしよう

LaTeX で文書を書くようになってから半年くらい経ったときのこと,急に本文中のベクトルの表記をボールド体(\mathbf)ではなく,上に矢印(\overrightarrow)にしたくなったことがある.このとき,\mathbf を他の意味でも使っていたために,エディタの一括変換では修正ができなくなったことを覚えている.これはプリアンブルにおいて

\newcommand[1]{\mathvect}{\mathbf{#1}}

と定義しておいて,ベクトルを書くときはこの「\mathvect」を使うようにすればこのような事態は防げた.そうしておけば、先のコマンドを

\newcommand[1]{\mathvect}{\overrightarrow{#1}}

と定義し直せばすぐ終わったのである.これは「見栄えと構造の分離をしていなかった」ことが原因の苦労である.
文書において何らかの文字列装飾をする場合,普通は「文字列を装飾すること(見栄え)」そのものが目的ではなく,「文字列に何らかの意味を付与すること(文書構造)」が目的で行われているはずである*1.これらを分離することで,後で「同じ意味内容」の「見栄え」を一括して変更する際,コマンドの定義を書き換えるだけで,変更を終えることができる.
また,コマンドの名前を適切に定義することによって,たとえば,この文字列が「ベクトル」を意図して書かれたことなどが,他の人にも明らかになる.特に複数の変数領域を扱うような分野においては,タイプミスの防止にもなる.
Word のような WYSWYG*2と違い,LaTeXマークアップ言語なので「見栄えと構造の分離が容易」というのがメリットである(反面コマンドを使うのになれる必要はあるが).そのメリットを存分に活かすため,文字装飾のコマンド("\mathbf" など)を本文中に直接打ち込むのは極力避けるべきである.

見た目と構造の分離の具体例

抽象的な話だけだと何をすればよいのかわからない人も出てくると思われるので,いくつか具体例をあげてみる.

ほぼ全員がやっている「見た目と構造の分離」

「見た目と構造の分離」という概念を聞いたことがなくても,LaTeX ユーザーがほぼ間違いなく行っている「見た目と構造の分離」がある.
それは \section などの「見出し用のコマンド」である.節のはじめの見出しなどで

\noindent \textbf{1. hoge}

という書き方をする人間はほとんど居ないはずである*3.この書き方では「節」なのか「箇条書きの一部」なのかがわからない.節の始まりの見出しでは,やはり

 \section{hoge}

と書くべきである.

似たように Remark を書き始める際も

\noindent \textbf{Remark.} hogefuga......

などと書き始めるより,定理環境 remark を

\usepackage{amsthm}
\newtheorem*{remark}{Remark}

と用意し

\begin{remark}
hogefuga......
\end{remark}

などと書くべきである*4

強調のためのコマンド

「強調」という明確な「意味」をもってフォント(見た目)を変更する場合,それ用のコマンドを用意するべきである.
LaTeX には \emph という強調のためのコマンドが用意されている.使用するドキュメントクラスやスタイルファイルによって,どのような装飾が行われるかは変わってくるが,仮に強調の仕方を変えたい場合,プリアンブルに

\renewcommand[1]{\emph}{\textgt{#1}}

などと書いておけば強調の方法を変更することができる.元の \emph 以外にも強調がほしければ,たとえば

\newcommand[1]{\bigemph}{\textgt{#1}}

などとコマンドを定義すれば良い.

有識者による指摘(2020/12/25 追記)

有識者 W 氏によると,LaTeX 標準の \emph コマンドはネスト(重ねがけ)ができるらしい.そのためか最近のLaTeX2e ではネストごとの字体を指定するための \DeclareEmphSequence というコマンドが存在するらしい.たとえば,

\DeclareEmphSequence{\itshape,\upshape\scshape,\itshape}

などとすると,第一レベルでは斜体(イタリック体),第二レベルではスモールキャップス体,第三レベルではスモールキャップスの斜体に変更をすることができる.
そのため,\renewcommand で \emph を再定義するよりも

\DeclareEmphSequence{\gtfamily\sffamily}

と定義した方が良いのではないかとのことである*5.詳しいことは

$texdoc ltnews31

すると表示される LaTeX News, Issue 31, February 2020 の p.3 "Handling of nested emphasis" を参照してほしい.

わざわざこの記事を読んでコメントをくれた有識者の W 氏には深く感謝する.ありがとうございます.

数学的な意味を表現するためのコマンド

先の

\newcommand[1]{\mathvect}{\mathbf{#1}}

というコマンドは「ベクトル」を表す文字だということを明確に表現している*6.同じように数学的に意味のある表記などは「見栄えと構造の分離」という観点からコマンドを定義したほうが良いように思う*7.たとえば,私の LaTeX のプリアンブルには

\newcommand{\mathsetintension}[2]{\left\{ #1 \left| #2 \right. \right\} }
\newcommand{\mathsetextension}[1]{\left\{ #1 \right\} }

などという集合の内包記法と外延記法のためのコマンドを用意してある.コマンドの名前が長いと感じるかもしれないが,「補完機能」のついていないエディタの方が珍しい現在においては,名前の長さはそれほど問題ならないと思う.「補完機能」を使えば良いからである.そのため,名前の長さよりも名前の明確さの方を優先するべきに私は思う.もちろん,長すぎて,名前の意味を理解しにくいとなると問題だが.

ちなみに,こういう数学的な意味を表現するためのコマンドを用意してくれている physics パッケージなるものがあるが,

$texdoc physics

して,定義されているコマンドを見る限り,引数の数によって出力が変わるコマンドがあるなどわたしには使いやすいパッケージとは思えない.が,このパッケージを愛用している者もいるとは聞くので,こういったパッケージを利用するのも一つの手かもしれない.

結論

「見栄えと構造の分離」を意識して,文書を作ろう.とはいえ,あまり意識しすぎて,自作コマンドを大量に用意しすぎすると,管理が大変になるので気をつけよう. 自作コマンドは他人が読んでも意味を推測できるような名前をつけるようにしよう.
実際は完全に「見栄えと構造の分離」をするのはかなり厳しいので,最初はうまく行かなくてもしょうがない.「見栄えと構造の分離」を目指して,今日も LaTeX していこう.
もし,本記事に間違ったことを書いていたら申し訳なく思うが,そのような場合,優しく教えていただけると幸いである.特に有識者からの指摘は甘んじて受け入れる.

*1:フォントの紹介の場合は「文字列を装飾する」事自体が目的になるが.ただ,そのような文書を書くことは普通は稀に思われる.

*2:"What You See is What You Get" の略.画面上の文書の見た目通りに印刷されることが期待されるような文書ソフトなどをそのように呼ぶ.

*3:\section コマンドを知らないレベルで LaTeX に慣れてないならば仕方ないが.

*4:信じられないことに前者の書き方を勧める自称「TeX に詳しい人」に私は会ったことがある.

*5:和文であればゴシック体、欧文であればサンセリフにするという意図。

*6:と思う.

*7:やりすぎはまずいが.