LaTeX パッケージを作ってみた。
[bxcountxac1.sty]
\expandafter\expandafter\expandafter\newread \expandafter\expandafter\expandafter\xx@file \expandafter\expandafter\expandafter\newcount \expandafter\expandafter\expandafter\xx@count \expandafter\expandafter\expandafter\newcount \expandafter\expandafter\expandafter\xx@maxcount \expandafter\expandafter\expandafter\long \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\xx@scan@line@a \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\ifx \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter_% \expandafter\expandafter\expandafter\else \expandafter\expandafter\expandafter\ifx \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\advance \expandafter\expandafter\expandafter\xx@count \expandafter\expandafter\expandafter\@ne \expandafter\expandafter\expandafter\ifnum \expandafter\expandafter\expandafter\xx@maxcount \expandafter\expandafter\expandafter<% \expandafter\expandafter\expandafter\xx@count \expandafter\expandafter\expandafter\xx@maxcount \expandafter\expandafter\expandafter\xx@count \expandafter\expandafter\expandafter\fi \expandafter\expandafter\expandafter\else \expandafter\expandafter\expandafter\xx@count \expandafter\expandafter\expandafter\z@ \expandafter\expandafter\expandafter\fi \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\xx@scan@line@a \expandafter\expandafter\expandafter\fi \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\xx@inspect@maxcount@a \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\read \expandafter\expandafter\expandafter\xx@file \expandafter\expandafter\expandafter t% \expandafter\expandafter\expandafter o% \expandafter\expandafter\expandafter\xx@line \expandafter\expandafter\expandafter\ifeof \expandafter\expandafter\expandafter\xx@file \expandafter\expandafter\expandafter\else \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\xx@scan@line@a \expandafter\expandafter\expandafter\xx@line \expandafter\expandafter\expandafter_% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\xx@inspect@maxcount@a \expandafter\expandafter\expandafter\fi \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter\newcommand \expandafter\expandafter\expandafter\getxaccount \expandafter\expandafter\expandafter[% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter]% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\do \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\@makeother \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter\IfFileExists \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\openin \expandafter\expandafter\expandafter\xx@file \expandafter\expandafter\expandafter=% \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter\relax \expandafter\expandafter\expandafter\begingroup \expandafter\expandafter\expandafter\do \expandafter\expandafter\expandafter\{% \expandafter\expandafter\expandafter\do \expandafter\expandafter\expandafter\}% \expandafter\expandafter\expandafter\do \expandafter\expandafter\expandafter\#% \expandafter\expandafter\expandafter\do \expandafter\expandafter\expandafter\_% \expandafter\expandafter\expandafter\endlinechar \expandafter\expandafter\expandafter\active \expandafter\expandafter\expandafter\xx@count \expandafter\expandafter\expandafter\z@ \expandafter\expandafter\expandafter\xx@maxcount \expandafter\expandafter\expandafter\z@ \expandafter\expandafter\expandafter\xx@inspect@maxcount@a \expandafter\expandafter\expandafter\xdef \expandafter\expandafter\expandafter\xx@gtempa \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\noexpand \expandafter\expandafter\expandafter\xaccount \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\the \expandafter\expandafter\expandafter\xx@maxcount \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter\endgroup \expandafter\expandafter\expandafter\closein \expandafter\expandafter\expandafter\xx@file \expandafter\expandafter\expandafter\xx@gtempa \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter\newcommand \expandafter\expandafter\expandafter\showxaccount \expandafter\expandafter\expandafter[% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter]% \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\getxaccount \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter\typeout \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter#% \expandafter\expandafter\expandafter1% \expandafter\expandafter\expandafter:% \expandafter\expandafter\expandafter\xaccount \expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter}% \csname empty\endcsname
用法は次の通り。
\getxaccount{<ファイル名>}
: TeX ソースファイルに含まれる連続する\expandafter
の最大数を整数値マクロ\xaccount
に返す。\showxaccount{<ファイル名>}
:\getxaccount
の結果を端末に表示する。- 数えているのは「
\expandafter
という制御綴」の出現である。制御綴の意味は無関係である。(だから\expandafter
が何か別の制御綴に\let
された場合、その制御綴は対象にならない。) - カテゴリコードは、通常の LaTeX のもの或いはそこから
\makeatletter
したものの何れかに従っていることを仮定する。
実行例。これは unicode パッケージに含まれるファイル ucs.sty の中の \expandafter
を数えている。
\documentclass{article} \usepackage{bxcountxac1} \begin{document} \showxaccount{ucs.sty} \end{document}
\showxaccount
の個所で次の行が表示される。
ucs.sty:15
中途半端なネタはいいから、もっと読めるコードが欲しいという人は、コレをみてほしい。