LaTeX2e の見出しで「閉じタグ」的なことをしてみる実験

2019-09-23  #LaTeX 

世の中にはセクションなどの見出しが,「開始タグ」と「終了タグ」でペアになる形の方が望ましいと考える人がいます.

この辺りはやや思想的な側面もあり,また実用上の利便性とのトレードオフもあるため何が正解かは難しいですが,とりあえず LaTeX でも \section を「環境っぽく」書けないか実験してみました.

WTXSection パッケージ

\section を「環境っぽく」と言いましたが,単純に \newenvironment で環境を作り,そこに \section を書くような実装は危険です.LaTeX の環境はグループ(フツーのプログラミング言語でいう「スコープ」のようなもの)を作りますが,通常の LaTeX では見出し構造はグループ化されていないため,下手にグループを作ると不具合が生じる可能性があります1

そこで,グループは作らず,他の一切とは独立に「見出し構造」だけがきちんとバランスされるようなしくみ,すなわち「開いたセクションが必ず閉じているかどうかを確認する機構」を考えます.考えると同時に,実装してみました.

使い方

準備

WTXSection パッケージを使うためには,まず当然パッケージの読み込みを行います:

\usepackage{wtxsection}

続いて WTXSection の定義する \xDeclareNewSection を用いて構造化したい「見出し」を宣言します.

\xDeclareNewSection{Section}{\section}

第一引数 (Section) が使用したい「見出し」の名前,第二引数 (\section) は対応する LaTeX のコマンドです.

ここまではすべてプリアンブルに記入してください.\begin{document} 以降ではいけません.

見出しを使う

プリアンブルで定義した「見出し」は \xBegin コマンドと \xEnd コマンドで挟むように使用します.見た目的には LaTeX の環境と同じようなものですが,これらのコマンドは (La)TeX の「グループ」は形成しません.

\xBegin{Section}{生命、宇宙、そして万物についての究極の疑問の答え}
それは42。
\xEnd{Section}

なお \xBegin コマンドの第一引数と第二引数の間には \section コマンド直後と同じように *[] で囲ったオプション引数を与えることができます.

\xBegin{Section}*{ナントカ}  %=> \section*{ナントカ} と同じ
\xBegin{Section}[アレ]{\TeX} %=> \section[アレ]{\TeX} と同じ

これらのオプショナル要素の指定有無に関わらず,閉じタグは常に \xEnd{Section} です.\xEnd コマンドは常に1つの引数しか取りません.

具体例

WTXSection パッケージの具体的な使用例を1つ置いておきます.普通の upLaTeX 文書です.

【入力】

%#!uplatex
\documentclass[uplatex]{jsarticle}

\title{オレオレ構造化\LaTeX 文書}
\author{ワトソン (wtsnjp)}

\usepackage{wtxsection}

\xDeclareNewSection{Section}{\section}
\xDeclareNewSection{Subsection}{\subsection}
\xDeclareNewSection{Subsubsection}{\subsubsection}

\begin{document}

\maketitle

\tableofcontents

\xBegin{Section}{構造化文書とは何か}

ムニャムニャムニャ。

\xBegin{Subsection}[ゆきだるま]{本当に大切なもの}

それは☃!

\xEnd{Subsection}

\xBegin{Subsection}*{アヒル}

このセクションの存在はヒミツだよ☆

\xEnd{Subsection}

\xEnd{Section}

\end{document}

【出力】

上記入力の出力

開始した見出しは必ず終了させること

さて,私の理解が正しければ「閉じタグ」を欲する人たちは記述された構造がおかしい場合は怒られが発生することを期待している,怒られるのが大好きな人たちのはずです(語弊しかない).\xBegin で開始した「見出し」を \xEnd で閉じ忘れる,あるいは誤った順番で閉じると怒られが発生します.

【入力例1】

\begin{document}

\xBegin{Section}{アレな組版ソフトウェア}

\xBegin{Subsection}{もっとアレな組版ソフトウェア}

\xEnd{Subsection}

% \xEnd{Section} を忘れた!

\end{document}

【エラー例1】

Critical Package wtxsection Error: End of document is declared before the
(wtxsection)                         end of Section "アレな組版ソフトウェア" is
(wtxsection)                         declared.

【入力例2】

\begin{document}

\xBegin{Section}{アレな界隈}

\xBegin{Subsection}{もっとアレな界隈}

\xEnd{Section} % Subsection より先に Section を閉じてしまった!

\xEnd{Subsection}

\end{document}

【エラー例2】

Critical Package wtxsection Error: End of Section is declared on line 19,
(wtxsection)                         but you must declare the end of
(wtxsection)                         Subsection "もっとアレな界隈" first.

こういう怒られが発生することだけが,WTXSection パッケージの定義する機構を使うメリット(?)です.あとは自己満足.他には何もありません.

注意事項

WTXSection パッケージは玩具パッケージです.真面目に仕様を考え込んだものではありません.自己責任でお使いください.また,人と共有する LaTeX 原稿,特にどこかに投稿する場合,当然ですが各種投稿規定等を遵守する必要があります.WTXSection のように LaTeX のコア機能を変にラップするようなことは控えた方が良いでしょう.

まとめ

組版の素人かつ底辺 TeX プログラマである私が1分で考えたテキトー仕様のパッケージよりも,LaTeX3 チームにはよほど優れたアイデアがあるはずです2.唯一の問題は,肝心の LaTeX3 は永久にリリースされそうにないことです🙃


  1. LaTeX カーネルが定義するカウンタや相互参照は,概ね常にグローバルに操作されるように定義されているので大丈夫な気もしますが,サードパーティ製のパッケージが破滅するというのはありそうな話です(実際にあるかは知りません). ↩︎

  2. LaTeX3 チームによる長年の実験と熟考により得られた知見は xtemplate 等に結集されているはずですが,私はこの辺りはあまり勉強していないので詳しくありません.誰か解説してくれないかなぁ(えっ) ↩︎