LaTeX の論理デザインと視覚デザイン

追記 (2022-07-25 20:20). 普段は内輪向けに勉強録やメモを書いていたので失念していましたが、「引用部分の主従関係が明らかに逆転している」というご指摘をいただきました。もともと書こうと思っていたが面倒くさくて書くのをやめていたことを付け足し、引用部分を大幅に削って本質的な部分だけを残すことで記事そのものを改善しつつ、著作権法に沿った形にしておきます。


この前、$\LaTeX$ の基本思想を全く理解していない人々と話す機会があったので、この機会に改めてメモしておくことにします。

論理デザインと視覚デザイン

$\TeX$ を作成したのはドナルド・E・クヌースですが、$\LaTeX$ を作成したのはレスリー・ランポートです。レスリー・ランポートは著書の中で次のような設計思想を述べています。

デザイナーの役割は、読者が筆者の考えを理解できるように手助けすることである。文書を読みやすくするには、その体裁が文書の論理的な構成を反映しているようにしなければならない。引用文とコンピュータプログラムとは論理的に異なった構成要素であるから、視覚的にも区別されるべきだ。このような区別を行うために、デザイナーは文書の論理的な構成を理解する必要がある。ところが $\LaTeX$ は内容を理解することができないため、特別なコマンドを用いて、論理的構成をはっきりと示してやらなければならない。これから使うことになる大半の $\LaTeX$ コマンドの基本的な役割は、文書の論理構成を示すことにある。文書を書く際は、その体裁よりも論理的な構成のほうに集中するべきである。こうしたことから、$\LaTeX$ の組版に対するアプローチは、論理デザイン(logical design)とでもいうべき性質のものとなっている。(p. 7)

この「論理デザイン」と「視覚デザイン」を区別するものとして HTML が挙げられると思いますが、実際に $\LaTeX$ と HTML は深い関係があるとされています。ただし、出典となるべき一次資料はすぐには見当たりませんでした。

$\LaTeX$ による文書の構造化は HTML と同じ考え方だと気づかれたかもしれません。HTML は SGML に基づいて作られましたが,$\LaTeX$ の影響も受けています。$\LaTeX$ は Scribe というシステムの影響を受けていますが,Scribe は GML(SGML の元)と同じころ作られました。(美文書、pp. 2-3)

ランポートは「論理デザインのほうが視覚デザインよりも優れていること」を証明するために、内積を (A,B) とそのまま打つのではなく \ip{A}{B} というコマンドを定義して打てば、$(A,\,B)$ のようにスペースを入れたり、$\langle A\mid B\rangle$ のように大幅に変えたりすることが非常に簡単に実行でき、かつ文書の論理関係にだけ集中できるようになるのだと主張しています。しかし、ランポートは述べていませんが、それと同時にマクロを定義しすぎることもペナルティになってしまうので、両者を上手に取り持つことが重要になります。

そういえば、この手の話題について昔こういう記事を書いたのを思い出しました。当時はまだランポートの主張を読んだことがなかったのですが、同じ問題意識を持っていたようです。

all-for-nothing.com

\emph コマンド

この「論理デザイン」と「視覚デザイン」を分けるという設計思想を最もよく反映する例の一つとして、\emph コマンドが挙げられます。

書体は視覚的な属性であり、文章の論理構造とはそもそも関係のない。したがって、視覚的な属性を指定するコマンドは、文章自体に入れ込んでしまうのではなく、論理構造を記述するコマンドの定義に含めたほうがよい。たとえば $\LaTeX$ では、強調という論理構造に対して \emph というコマンドを定義している(文書中の論理構造に対して独自のコマンドを定義する方法は 3.4 節で説明する)。たとえば、アフリカの哺乳類に関する本を書いているときに、属の名前をイタリック体で印字することにしたとしよう。この場合、\textit を文章中で通して使うのではなく、\genus コマンドを定義して次のように書くとよい。

Connochaetes seems to pop up everywhere. \genus{Connochaetes} seems to pop up ...

こうしておけば、connochaetes をはじめとする属名をイタリック体ではなく別の書体で印字したくなった場合も、\genus の定義を変更するだけで済む。(pp. 41-42)

まあでも、実際の運用として \genus コマンドを定義すべきかというと、割と微妙な気はします。また、\emph は日本語環境だと少し問題があるのですが、(概ね問題ないレベルにまで持っていくための)修正自体は可能です。