今夜もLab.に独り

蛙飛び込むVimの音

TeXがコンパイルできない!

後輩のTeXコンパイルがうまくいかないのを修繕した記録。

文字コード由来のエラー

おおよそすべてのファイルはShift-JISUTF-8のどちらかだけれど、 とりあえずutf-8を使いたい人間を想定して話を進めよう。

TeXコンパイル時に

l.1 \begin{document}

?
! Undefined control sequence.
l.2 \section
            {驕^^ef^^bd^^a9蠖薙↑繧^^ef^^bd^^bb繧^^ef^^bd^^af繧^^ef^^bd^^b7...

のようなメッセージが出てきたらまぁファイルの文字コードを変えてやればよい。 そもそも\begin{document}で文句を言われることがおかしいし、2個目のメッセージは完全に文字化け。 今回の場合は、Shift-JISのファイルをUTF-8で読み込んでいるのでそれを修正。

文字コードの変え方はいろいろあるけれど、俺はVimで編集しているのでそのやり方を。

:e ++enc=sjis        "現在のファイルを__Shift-JIS__で開き直す
:w ++enc=utf-8       "現在のファイルを__UTF-8__で保存する

ということで、文字コードを変えたいファイルを開いて上のコマンドをたたいて終了。

++enc=の後ろに指定する文字列の一覧は

:h encoding-values

で確認できる。

バックスラッシュと円マーク

文字コードを修正してもなお、\begin{document]のような 円マーク・バックスラッシュで始まる基本的なコマンドで文句を言われることがある。

このようなエラーは、¥の文字コードを 本来の制御文字としての\と異なる文字のようにTeXが認識しているせいだ(と思う)。 *1

本来的にはバックスラッシュが正式な制御文字(だったはず)なので、 対応としては、変換後のファイルに対して置換操作をすればよい。 (以下、YENとなっている部分が¥だと思ってほしい)

:%s/YEN/\\/g

で操作終了。

1つ目のバックスラッシュが2つ目のバックスラッシュをエスケープしているので、コマンド上ではバックスラッシュが2つ並んでいる。

俺の環境ではバックスラッシュしか打てないので、 ファイルの中の¥を使って¥一文字だけの行を作ってから、 ノーマルモードでカーソル下の文字列を検索するコマンド*を打っている。 こうすると、¥一文字だけの検索がかかるので、 直前の検索履歴を置換対象文字列に指定する書き方を使って

`:%s//\\/g`

とすれば、同様の処理が行える。

改行文字の削除

時折、ファイルの各行末に^Mという文字が存在するファイルと出くわす。

これは改行コードのゴミが残っているので、Vimの置換コマンドで削除すればよい。

:%s/^M//g

で終了。^M^k<CR><CR>(コントロール+k,エンター,エンター)と入力すること。 *2

*1:こちらのページ に書いてある、付録Cの表がすごくわかりやすい。

*2:改行文字は普通の文字ではないので、特殊文字の入力コマンドを使わないと検索できない。