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

2019-09-23 (updated: 2025-12-09) #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等に結集されているはずですが、私はこの辺りはあまり勉強していないので詳しくありません。誰か解説してくれないかなぁ(えっ) ↩︎