どせいたんさき。

ナスダヨー

文字数を数える LaTeX environment

やりたいこと

LaTeX で environment の中に書いた文章を表示しつつ文字数を数えて表示したい.

解決方法

Sukarabe さんが以下のエントリを書いていたので文字数を数える部分に応用する.

自前の漢文組版ルーチンのための準備。ルビや送り仮名の文字数に応じて印字の位置などを微妙に変えるために、文字数を数えるマクロが役に立つ。幸い、LaTeXには組み込みのループ処理マクロがある。 \@tfor というのがそれである。

文字数を数えるLaTeXマクロ – Sukarabe's Easy Living

例えば以下のように記述する.

\makeatletter
\DeclareRobustCommand{\Word@Count}[2]{%
  \@tempcnta\z@
  \@tfor \@tmpa:=#1\do{\advance\@tempcnta\@ne}%
  \rule{0pt}{1em}#1\par\vspace*{-1em}%
  \noindent\rule{\linewidth}{0.2pt}\\[-0.5em]%
  \hfill{文字数}: \the\@tempcnta/#2\par%
}
\makeatother

このコマンドを environment の中の文字列に適用する.environ パッケージを使用することで \begin{hoge} \end{hoge} に挟まれたテキストの処理を簡単にすることができる.ただし,ここで \NewEnviron の内部で使用することのできるマクロ \BODY をそのまま \Word@Count に渡してしまうとテキストが展開されずに渡されてしまうので 1 文字だとカウントされてしまう.\BODY を展開してから引数に与える必要がある.\edef を用いて展開したコマンドを \@counting と定義して実行している.このあたりのテクニックはこちらのエントリを参考にした.

\RequirePackage{environ}
\makeatletter
\NewEnviron{wcblock}[1][1000]{%
  \edef\@counting{\noexpand\Word@Count{\BODY}{#1}}\@counting}{}
\makeatother

こんな感じになりました.

f:id:xr0038:20180109175401p:plain

ただしこのバージョンでは environment の中に \lipsum みたいなコマンドを入れるとうまく展開できずにエラーを吐いて死んでしまいます.とりあえず動いているようなのでこの問題については後で考えることにしました.

参考資料