晴耕雨読

working in the fields on fine days and reading books on rainy days

文字数を数えるLaTeXマクロ

レポートで論述するときに文字数が指定されることがありますが、LaTeXで文字数をカウントした結果を末尾に(xxx文字)のように表示させる方法を説明します。 まず、LaTeXには文字列を1つずつ取り出す \@tfor コマンドというものがあります1 2

\@tfor 変数 := 文字列 \do{ 1文字ごとに実行する内容 }

1文字ごとに実行する内容のところで変数をインクリメントしていけば、文字数をカウントしたことになります。実際の文字数をカウントするマクロは以下の通りです 1

\makeatletter
\def\WordCount#1{%
  \@tempcnta\z@%
  \@tfor \@tempa:=#1\do{\advance\@tempcnta\@ne}%
  {#1}%
  (\the\@tempcnta 文字)
}
\makeatother

マクロの説明です:

  • \makeatletter ... \makeatother : @を文字として扱います。これにより \@tfor などのマクロを実行することができます。
  • \@tempcnta\z@ : 一時的なカウンタ \@tempcnta にゼロ (\z@) を代入します。
  • \@tfor \@tempa:=#1\do{...} : マクロの引数に渡された文字列を1文字ずつ取り出して、変数 \@tempa に代入します。
  • \advance\@tempcnta\@ne : 変数 \@tempcnta にイチ (\@ne) を加算します。
  • \the\@tempcnta : 変数 \@tempcnta を文字列に変換します。

なお、LaTeXでは事前に \z@, \@ne, tw@, thr@@ には 0, 1, 2, 3 の値が代入されています。

文字数カウントマクロの使い方

実際にマクロを使うときは以下のようになります。

\WordCount{LaTeXとはテキストベースの組版処理システムである。}

実行結果:

LaTeX とはテキストベースの組版処理システムである。(27 文字)

複数段落での使い方

複数の段落になる場合は、改行 \\ とインデント \indent を使います。 単純に段落間に空行を挟むと、\@tfor のループでエラーになります。

\WordCount{
LaTeXとはテキストベースの組版処理システムである。
\\\indent
学術機関においては標準的な論文執筆ツールとして扱われている。
}

実行結果:

 LaTeX とはテキストベースの組版処理システムである。
 学術機関においては標準的な論文執筆ツールとして扱われている。(59 文字)

使用上の注意ですが、改行 \\ とインデント \indent も1文字として扱います。 もしこれらは除外したい場合は、tfor の1文字ごとに実行する内容で条件分岐を書けばできると思います。

それでは良い$\LaTeX$生活を。