世の中にはセクションなどの見出しが,「開始タグ」と「終了タグ」でペアになる形の方が望ましいと考える人がいます.
#技術書典 で買ったアンテナハウスのmd+cssによる冊子本作り理論と実践 読んでる。やっぱsectionタグが閉じタグ必要なの、私の思想に合うんだよな
— ひだるま@技術書典7き41D (@hid_alma1026) September 23, 2019
LaTeXのそれがそうでないのは発想の違いすな
— きしもと (@ksmakoto) September 23, 2019
この辺りはやや思想的な側面もあり,また実用上の利便性とのトレードオフもあるため何が正解かは難しいですが,とりあえず 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 は永久にリリースされそうにないことです🙃