マクロツイーター

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

LaTeX 文書で発生するエラーを一気に消し去る話(tcclearerr パッケージ)

2012/12/01 〜 2012/12/25

TeX & LaTeX Advent Calendar

k16.shikano さん(12/24)|(12/01)\@undefined→

最終日(25日目)の記事です。締め括りの記事はまた後で!

*  *  *

LaTeX におけるエラーは初心者・初級者にとって大きな悩みの種です。残念ながら、LaTeX におけるエラー表示というのはあまり的確でないことが多々あります。元々、LaTeXTeX インタプリタ上のプログラムとして実装されているので、特に単純なケアレスミス}\ が抜けた)の場合は、その TeX 実装に依存する TeX レベルのエラー((「! Missing number, treated as zero.」などのように、! の後に「LaTeX Error」や「Package xxx Error:」が付いていないのが TeX レベルのエラーである。))が起こり、多くの場合はそれは(LaTeX ユーザには)意味不明なものになるからです。この「意味の解らない」エラーに対処し続けなければならないという苦労が、LaTeX の学習を挫折させ、また LaTeX の利用を放棄させる一つの原因になっていると推測されます。

入門者にとってエラーへの対処が困難という問題は、TeX の別のレベルでも起こり得ます。TeX on LaTeX*1の初級者は多くの場合自分の作ったコードのデバッグに苦労しています。その理由としては、TeX が提供するデバッグ用機能((\tracingmacros\showbox 等。))が最低限のものしかなく、またコードが自在に書けない段階だと「printf デバッグ」も自身を持って行えない(「デバッグコードを入れると実行行程が変わってしまうかも知れない」と恐れる)ということが考えられます。

しかし、文書(あるいはプログラム)中に紛れ込んでいるエラーを、手動で一つずつ探し当てて潰していくというのは、非効率極まりないことは少し考えてみれば明らかです。全てのエラーが一度に、それも自動で消え去ってくれれば、文書やプログラムの作成の効率が飛躍的に向上することは疑う余地のないところです。

というわけで、パッケージを作ってみました。

使い方は非常に簡単で、LaTeX 文書の場合は、プレアンブルの先頭でいつも通り \usepackage で読み込みます。(オプションはありません。)これだけで、その文書に元々存在していたエラーが一切発生しなくなります。(単に発生したエラーが「表示されない」のではなく、エラーの発生自体が無くなります。)

使用例

例として次のような(悲惨極まる)LaTeX 文書を見てみましょう。

[test-tcclearerr1.tex]
\documentclass[12pt]{jsarticle}
 \usepackage[dvips]{color}
 \usepackage[dvipdfm,
     bookmarks=true,
      bookmarksnumbered=true,
      colorlinks=true,%]{hyperref}
 \oddsidemargin=\z@
%\pagestyle{empty}

\def\ps@plainfoot{%
  \let\@mkboth\@gobbletwo
  \let\@oddhead\@empty
  \def\@oddfoot{\normalfont\hfil\it{\thepage}\hfil}%
  \let\@evenhead\@empty
  \let\@evenfoot\@oddfoot}
\def\ps@plainhead{%
  %タイトルを印刷する
\title{\TeXを使ってみよう!}
\etitle{Let's try to using a \TeX}
\auther{T研のてふにしゃん}
\date{2012年12月25日}
\let\@date\@empty  %あとで意味を調べる
 %ーーーーーー
  %ここから文章
  %ーーーーーー
\bigin{document}
¥maketitle
 \TeXを使えば誰でも簡単に\underline{美しい}文章を
作れるワープロです。数式も作れます。
こrからの時代はみんなでMSワードじゃなくて\Texを使って
レポートを提出しよう。\\
\\
\\

\chapter{\TeX が使えるようにしよう!}  
 まず\TeXをパソコンに入れる
\footnote{正しくはインストウール(install)と言います}
必要がありますが、とても簡単です。\\
 本棚にある「すぐわかる!\LaTeX」の本のCD-ROM
をパソコンに入れると画面が出てくるので 
あとはOKを3回クリックしたらできます。\\

\chapter{\TeX を実行しよう!}   
パソコンのディスプレイの上にあるアイコン
\footnote{小さな\Texの絵のことです}
をダブル クリックしたら\TeXが起動します。
そしたら、右のほうの画面に\\
~~~~~~~~~\verb|\|documentclass[12pt]{jsarticle}\\
~~~~~~~~~\verb|\|begin{document}\\
~~~~~~~~~Hello, \TeX world
~~~~~~~~~\verb|\|end{document}\\
と書きます。\TeXの上のほうにある緑のボタンをクリックして、
OKのボタンをクリックしたら \TeXの文章の画面が出るだろう。
"Hello, \TeX world"と出てきたら完成です!\\
\\
 書き込んだ中身を説明しよう。最初の\documentclass
から初める行は”おまじない”で、\Texのファイルは全部
このコマンドから始まります。\\

\relax % 要確認:動かない
%%参考文献
\bibliography{99}
\bibitem{wakaru}
 森口,「すぐわかる!\LaTeX」,朝昼新聞出版,1995年
\end{document}

これを pLaTeX で処理しようとすると、当然ながら次のようにエラーが発生します。(なお、解り易くするため、出力メッセージ中の全角空白を で表しました。)

C>platex test-tcclearerr1.tex
This is e-pTeX, Version 3.1415926-p3.3-110825-2.4 (sjis) (TeX Live 2012/W32TeX)
……(中略)……
Document Class: jsarticle 2011/05/10 okumura
)

! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...

l.2 □
      \usepackage[dvips]{color}
?

このエラーに対処するには、2 行目の先頭にある和文文字を取り除く必要がありますが、そうしても今度は 3 行目で同様のエラーが発生します。(原因も全く同じ。)このように、上掲のソースからエラーのない正しい文書を得るには、数えきれないほどの問題点を修正する必要があり大変な作業になってしまいます。

しかし、tcclearerr パッケージをつかうとこれらの大量のエラーが一度に解決します。次のようにプレアンブルの先頭でパッケージを読み込みます。((なおここで誤って \usepackage の前に全角空白を入れないように十分注意しよう。))

\documentclass[12pt]{jsarticle}
\usepackage{tcclearerr}
 \usepackage[dvips]{color}
……(残りは全てそのまま)

すると、残りの部分は全く何も手を付けなくても、エラー無しで出力の DVI 文書を得ることができます。もちろん、これを dvipdfmx 等で変換すれば PDF 文書も得られます。おめでとうございます!

C>platex test-tcclearerr1.tex
This is e-pTeX, Version 3.1415926-p3.3-110825-2.4 (sjis) (TeX Live 2012/W32TeX)
……(中略)……
Document Class: jsarticle 2011/05/10 okumura
) (./tcclearerr.sty [1]
 ) )
Output written on test-tcclearerr1.dvi (1 page, 520 bytes).
Transcript written on test-tcclearerr1.log.
「プレアンブルより前」でエラーが起こる場合の対処

文書によっては、プレアンブルの開始より前、つまり \documentclass のある行((あるいは、\documentclass があるはずなのに \documentclass がない行。))でエラーが起こる場合があるでしょう。

[test-tcclearerr2.tex]
¥documentclass{jsarticle}
%¥usepackage{graphicx}
¥begin{document}
テストしています。。。
¥end{document}
C>platex test-tcclearerr2.tex
This is e-pTeX, Version 3.1415926-p3.3-110825-2.4 (sjis) (TeX Live 2012/W32TeX)
……(中略)……
! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...

l.1 ¥
      documentclass{jsarticle}
? 

1 行目で既にエラーが発生しているので、プレアンブル先頭(2 行目)に \usepackage{tcclearerr} を書いてもエラーを消すことができません。しかし、このような場合でも対処方法が存在します。次のように文書の先頭で \RequirePackage という特別な命令((\RequirePackage 命令を使うと、\documentclass より前にパッケージファイルを読み込むことができる。パッケージによっては、この命令を使うことを要求される場合が稀にある。))を用いてパッケージを読み込めばエラーが無くなります。((なおここで誤って \RequirePackage の〈\〉を全角で入力しないように十分注意しよう。))おめでとうございます!

\RequirePackage{tcclearerr}
¥documentclass{jsarticle}
¥usepackage{graphicx}
¥begin{document}
テストしています。。。
¥end{document}
C>platex test-tcclearerr2.tex
This is e-pTeX, Version 3.1415926-p3.3-110825-2.4 (sjis) (TeX Live 2012/W32TeX)
……(中略)……
Output written on test-tcclearerr2.dvi (1 page, 520 bytes).
Transcript written on test-tcclearerr2.log.
plain TeX 文書の場合

tcclearerr パッケージは plain TeX でも使うことができます。例えば、次のような plain pTeX 文書((どう見ても pLaTeX 文書にしか見えないかも知れないが、書いた人が plain pTeXptex コマンド)で処理しようとしているんだから plain pTeX 文書なんだろう。きっと。))があったとします。

[test-tcclearerr3.tex]
\documentclass[a4paper,12pt]{jsarticle}
\begin{document}
これはTEXのテストです。
\end{document}
C>ptex test-tcclearerr3.tex
This is pTeX, Version 3.1415926-p3.3 (sjis) (TeX Live 2012/W32TeX)
 restricted \write18 enabled.
(./test-tcclearerr3.tex
! Undefined control sequence.
l.1 \documentclass
                  [a4paper,12pt]{jsarticle}
? 

plain TeX 文書の場合、先頭で \input でパッケージのファイル tcclearerr.sty を読み込みます。

\input tcclearerr.sty
\documentclass[a4paper,12pt]{jsarticle}
\begin{document}
これはTEXのテストです。
\end{document}
C>ptex test-tcclearerr3.tex
This is pTeX, Version 3.1415926-p3.3 (sjis) (TeX Live 2012/W32TeX)
 restricted \write18 enabled.
(./test-tcclearerr3.tex (./tcclearerr.sty [1]
 ) )
Output written on test-tcclearerr3.dvi (1 page, 528 bytes).
Transcript written on test-tcclearerr3.log.

おめでとうございます!

*1:LaTeX の機能拡張を TeX 言語で実装して行うこと。要するに LaTeX のパッケージや文書クラスの作成。