マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

tceasylist をもう少し真面目に語ってみる

以前の記事easylist パッケージを拡張するための tceasylist パッケージを紹介した。ソレについてもう少し御託を並べてみる。

tceasylist のマニュアルのようなもの

tceasylist パッケージは easylist パッケージにおける、「リスト項目開始記号」を自由に設定できるようにするためのものである。easylist を内部で読み込んでいて、また「リスト項目開始記号」以外については動作の変更はない。

パッケージの読込は通常通り \usepackage で行う。この時、easylist が未読込の場合は自動で読み込まれるが、その際に、パッケージオプションのうち tceasylist が独自に解釈するもの以外はそのまま easylist パッケージに渡される。(easylist が既に読込済の場合は独自オプション以外は無視される。)

\usepackage[<easylistのオプション>,<独自のオプション>]{tceasylist}

独自オプションには以下のものがある。

  • item=<文字>: 「リスト項目開始記号」を指定する。<文字> の箇所には、文字そのものを指定する(item=☺)か、または、Unicode 符号値の 16 進表記を指定する(item=263A)。
  • snowman: 「リスト項目開始記号」を雪だるま〈☃〉(U+2603)にする。item=☃item=2603 と同値。

独自オプションが指定されない場合、「リスト項目開始記号」は easylist のオプションで指定したものになる。(既定値は〈§〉。)

「リスト項目開始記号」はパッケージ読込の後で変更することができる。

  • \SetItemStarter{<何か>}:「リスト項目開始記号」を指定する。引数には、先述の item オプションと 同様に「文字そのもの」か「Unicode 符号値の 16 進表記」を指定できる。これに加えて、引数に制御綴を指定して、その制御綴に 「リスト項目開始記号」の役割を与えることができる。(詳しくは後述)

すなわち、次の 3 つはどれも全く同じ効果をもつ。

\usepackage[20,item=★]{tceasylist}% U+2605 BLACK STAR
\usepackage[20]{easylist}
\usepackage[item=2605]{tceasylist}
\usepackage[20]{easylist}
\usepackage{tceasylist}
\SetItemStarter{}
項目開始記号を制御綴にする

\SetItemStarter を使うと、リスト項目開始記号を単一の文字でなくて“普通の命令”にすることができる。

\documentclass[a4paper]{article}
\usepacakge{tceasylist}
\SetItemStarter{\★}
\begin{document}
\begin{easylist}
\★ Blah.
\★\★ Blahblah.
\end{easylist}
\end{document}

ただし事実上、項目開始記号に使えるものは「\ + 記号」の形の命令(control symbol)に限られる。何故かというと、easylist の仕様として、「項目開始記号の直後には空白トークンを置く」ことが要請されていて、\foo のような「英字の命令」では後ろの空白が無視されてしまうからである。§§§ のような入れ子のリストの項目については、代わりに \★\★\★ と命令を並べる(\★★★ とはできない)。

見た目の表記はイマイチになるわけだが、この指定を用意したのには理由がある。それは「文字のアクティブ化が使えない場合のフォールバックを容易にするため」である。

easylist パッケージの特長は何といっても「文字のアクティブ化を利用して、単一文字でリスト項目を開始できるようにした」ことであるが、このことは同時に easylist の最大の弱点にもなっていると私は思っている。何故かというと、

文字のアクティブ化した時の挙動を正確に把握するには TeX 言語の知識が必要

であり、一般の LaTeX ユーザにそれを求めるのは難しいからである。

「文字のアクティブ化」の利用が厄介であることは easylist パッケージの作者も承知していて、マニュアルの一節を割いて、\fbox 命令中で「文字のアクティブ化」が無効になる問題とその対処方法を解説している。

% \fbox の引数では〈§〉が機能しない. そこで…
\Activate % 予めアクティブ化しておく
\fbox{%
\begin{easylist}
§ First proposition.
\end{easylist}}
\Deactivate % 元に戻す

しかし、LaTeX の初級者がこれだけを見て同様の事態に対処できるようになるかというと、それはなかなか難しいと思う。(例えば、上の記述全体をマクロ定義(\newcommand)に入れると再び失敗してしまう*1のだが、その理由が解るだろうか?) そうなると、結局、「文字のアクティブ化が失敗する状況では easylist の利用自体を諦めるべきだ」というのが妥当な結論になるだろうけど、ここにも大きな問題が残る。

単一文字でリスト項目を作れることが easylist の大きな機能であるが、だがしかし、easylist の機能は決してそれだけでなく、例えば、様々なパラメタを用意して、ユーザが自由にレイアウトを制御することを可能にしている。easylist が使えないとなると、「単一文字でリスト項目」が使えないだけでなく、このようなレイアウト制御を LaTeX 標準の list 環境で実現する必要が出てくる。ところが、easylist のパラメタと list のそれは単純には対応しないので、実際のところ、easylist を list に置き換えるのは LaTeX 初級者にとっては極めて困難であるように私には思える。そうなるとユーザは手詰まりに陥ってしまうだろう。

ところが、項目開始記号に“普通の命令”が使えるようになれば、この「弱点」をかなり緩和することができる。つまり、「普通の命令」は当然ながら LaTeX 文書のどこでも使うことができるので、もし「アクティブな文字」が使えない状況に遭遇したとしても、easylist 自体を諦める必要はなく、単にアクティブ文字を“普通の命令”に置換すれば問題を回避できるわけである。

別の利点として、(u)pLaTeX においても「3 つの ASCII 文字」以外の選択が可能になる。そして何より、upLaTeX であれば

「雪だるまな制御綴」〈\☃〉が使える

という重大なメリットを忘れてはいけない。

以下の例では、easylist 環境を含むマクロ(ユーザ定義命令)を定義して使用している。

% pLaTeX 文書
\documentclass[a4paper]{jsarticle}
\usepackage{tceasylist}
\SetItemStarter{}
\begin{document}

% easylist を本体に含むマクロを定義する
\newcommand{\xSomeList}{%
リストを含むマクロです。
\begin{easylist}\NewList
\§ ぶらー
\§\§ ぶらーぶらー
\end{easylist}}

\xSomeList % 例のリスト

別のリストです。
\begin{easylist}
% これは \NewList でないので番号は2から始まる
\§ アレ
\§ コレ
\§ ソレ
\end{easylist}

\xSomeList % 例のリストをもう一回

\end{document}
補足事項

リスト項目開始記号として設定可能なものの条件を記しておく。

  • リスト項目開始記号を単一文字にする場合:
    • ASCII の範囲外(正確にいうと、Unicode 符号値が U+0080 以上)にある記号(正確にいうと“英字扱いでない文字”*2)が使用できる。またこれに加えて、元々 easylist で利用可能である 3 つの ASCII 文字(〈@〉〈#〉〈&〉)も使用できる。
    • ただし、広範な Unicode 文字を利用できるのは Unicode 対応の TeX エンジン(XeTeX、LuaTeX)に限られる。欧文 8 ビットの TeX エンジン(pdfTeX)の場合は、easylist パッケージと同様の制限がかかる。すなわち、入力ファイルは Latin-1 に限定され、従って、使える文字はその範囲に限定される。
    • (u)pTeX では使用可能な文字が 3 つの ASCII 文字に限られる。
  • リスト項目開始記号を命令にする場合:
    • \ + 単一記号」の形の命令が使用できる。ここでの“記号”も正確には“英字扱いでない文字”を指す。
    • pTeX 系エンジンの場合、「\ + 和文の“記号”」も使用可能。
    • ただし既に定義済の命令は使用できない。例外として、「\*」は使用可能((ただし、「LaTeX での \* の既定の意味」のままで変更されていない場合に限る。))で、この場合、数式モードでは本来の意味に戻る。(もちろん、リスト項目開始記号は非数式モードでしか使えない。)

*1:この事例もマニュアルに載っている。理由は述べられていない。

*2:TeX 言語でいうと、カテゴリコードが 12 の文字。エンジンおよび諸種の設定によりその集合は異なる。