マクロツイーター

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

出された問題を解決するまでが TeXCafe ですよ

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

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