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
中途半端なネタはいいから、もっと読めるコードが欲しいという人は、コレをみてほしい。