コンパイルエラー"\begin{document}"の改善方法について

コンパイルエラー"\begin{document}"の改善方法について

- しょうない がーーーる の投稿
返信数: 15

当方,pdfの挿入やtikzを使い,Texで長めの文書作成をしています.

昨日より急に,以下のコンパイルエラーが起こりました.

Runaway argument?
{\contentsline {figure}{\numberline {13}{\ignorespaces XXX\ETC.
./XXX.tex:19: File ended while scanning use of \@w
ritefile.
<inserted text> 
                \par 
l.19 \begin{document}
                     

上文におけるXXXは文章,およびファイル名です.(伏せてあります)

私もこのエラーについて調べたところ,.auxファイルの削除でコンパイルできるようになるとの情報を得て,実際に試したところ確かに上手くいきました.

が,困ったのはここからで,普通にコードを間違えたり,ミスをしてコンパイルエラーがでたあと,そこを改善しても毎回上記の"\begin{document}"のエラーが出てしまいます.これが出るたびに一度文章を保存して,.auxファイルを消して,またファイルを開く,という面倒な仕様になっています.つまり,

コードミスや打ち間違えによるエラー→コードの修正→”\begin{documetn}のエラー”→.auxファイルの削除→ファイルを開き直してコンパイル成功→コードミス→...

という流れです.特にtikzで色々試行錯誤しながらやっている部分も多いため,毎回ミスがあるたびにこの手間を踏むのはかなり面倒なのです.

そもそも,なぜ急に"\begin{documetn}"のエラーが出たのかが分かりません.改善策を知っている人がいらっしゃったら,教えていただきたいです.よろしくお願いします.

使用マシン Macbook air M1

OS MacOS sonoma 14.5

Texshop ver5.36

しょうない がーーーる への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- しょうない がーーーる の投稿
追記ですが,Macの「ファイル」から「作業ファイルの削除」という項目があるのを今しがた発見しました,それまでは毎回Finderから.auxファイルを削除していたのでゴミ箱は大量になるし面倒だし,で手間でしたが今はだいぶ楽になりました.
が,なぜこんなことになるのかはやはり気になります.ネットの海を泳ぐと,コードの書き方を工夫したら治ったと言った声もあることから,かなり繊細な問題なのでしょうか.専門的な知識は皆無なので,原因が分かったとしても自分が理解できるのかは不明ですが...
しょうない がーーーる への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- ut の投稿
> Runaway argument?

というのは、「引数逃げ出しちゃってます?」という意味で、引数
を囲む対のブレースの閉じ側を書き忘れたり、誤って削除してしま
ったりした場合に出るものです。

> 私もこのエラーについて調べたところ,.auxファイルの削除でコ
> ンパイルできるようになるとの情報を得て,実際に試したところ
> 確かに上手くいきました.

とのことですが、それは、「Runaway argument?」に対する一般的な
対処法ではないと思います。今回はたまたま、

> {\contentsline {figure}{\numberline {13}{\ignorespaces XXX\ETC.

となっていることから、.lof への書き込みに絡む部分(\caption
でしょうか?)でのミスだと思われるので、それで、.aux ファイル
の削除で一時的にうまくいってしまっているように見えます。

というわけで、(根本的な)「改善策」は、「Runaway argument」
を引き起こしている、ブレースの閉じ忘れ箇所を探し出して、閉じ
ブレースを追加することだと思われます。
ut への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- 帯田 木偶太 の投稿
Runaway argument のエラーは、TeX ソースそのものにブレースの閉じ忘れがなくても
*.aux 中では起こりえると思います。
今回の場合、\caption の引数に fragile なコマンドが入っている可能性が
高いかと。

figure 環境中の \caption として 13 番目のものの引数(“\ignorespaces XXX”で
始まっているはず)をチェックして、fragile なコマンドがあれば
\protect を前置してみてください。
その上で、一旦 aux ファイルを削除し、タイプセットを 2 回(1回では不十分です)
繰り返してみてください。
帯田 木偶太 への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- 前田 一貴 の投稿
なるほど,根本的な対処法…….今度自分も起きたら試してみよう…….ありがとうございます.
帯田 木偶太 への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- しょうない がーーーる の投稿
返信ありがとうございます.

>figure 環境中の \caption として 13 番目のものの引数(“\ignorespaces XXX”で
始まっているはず)をチェックして、fragile なコマンドがあれば
\protect を前置してみてください。
その上で、一旦 aux ファイルを削除し、タイプセットを 2 回(1回では不十分です)
繰り返してみてください。

13番目のキャプションは,ちょっとした数式を含んだただの文章でした.とりあえず\protectを前置し,仰せの通り行なったところ,症状が解決しました.ありがとうございます.
大変恐縮なのですが,『fragile なコマンド』とはどういうことのなのか,そして\protectの役割を簡単でいいのでご教授頂けるでしょうか.調べてみたのですがどうも理解できず,今回の学びにさせていただきたいです.
しょうない がーーーる への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- 帯田 木偶太 の投稿
》 『fragile なコマンド』とはどういうことのなのか,そして\protectの役割を

以下、非常にざっくりとした説明になります。
※  私自身のあやふやにしか理解できていないので…。

LaTeX のコマンドの引き数には「動く引き数(moving argument)」と呼ばれる
種類のものがあり、動く引き数の中で記述することにより不都合を生じるような
コマンドのことを「fragile な(脆弱な)コマンド」と呼んでいます。
※  ちなみに、fragile でないコマンドは「robust な(堅牢な)コマンド」と
    呼ばれます。

動く引き数というのは、コマンドが記述されたのとは異なる場所に出力される
可能性のある引き数のことで、\chapter、\section 等のセクショニング・コマンドや
\caption の引き数(オプション引き数を指定した場合はオプション引き数の方)が
これに該当する主なものです。つまり、セクショニングそのものの見出しや
キャプションとして出力される以外に、ページ・ヘッダや目次にも出力されると
いうことが「動く」と形容されるのです。
※  ということで、特定の引き数が動く引き数に該当するかどうかは、そのコマンドの
    基本的な使い方を把握していれば概ね判別できるでしょう。実際のところは、
    セクショニング・コマンドと \caption に注意しておけばそこそこ大丈夫。

さて、「動く引き数」は、多くの場合、一旦補助ファイル(大概の場合は *.aux)に
書き出されたうえで、特定の場所でその補助ファイルが LaTeX によって
読込まれることで、「動き」ます。そして TeX は、コントロール・シーケンスを
外部ファイルに書き出す場合、原則として展開可能な限り展開しきってから
書き出します。fragile なコマンドは、この「展開可能な限り展開しきる」と
いうのが問題となって、エラーを引き起こすのです。\protect というのは、
「補助ファイルに書き出すにあたって、後続のコマンドを展開するな」という
意味のある種の目印として働きます。

ただ、特定のコマンドについて、fragile か robust かを見分ける簡便な方法は
残念ながらありません。
※  LaTeX のフォーマット・レベルで定義されている文書著作者向けの(つまり
    マクロ作者向け以外の)コマンドについては、ランポート本(「文書処理システム
    LaTeX2e」――原著は“LaTeX: A Document Preparation System System LaTeX2e”
    だったでしょうか)にはすべて書かれているので、覚えしまうことは可能でしょう。
    ※  同書(少なくとも日本語版)はとうに絶版になっているようですが、
        古書としては入手可能でしょう。
    パッケージ類で定義されているコマンドについては、ドキュメントに明記されている
    ものもあれば、そうでないものもあります。
あまり深く考えずに「動く引き数中のコマンドには常に \protect を前置する」という
方針をとる人もいるようですが、不必要な \protect が不都合を起こすケースも
稀にあるようですので、悩ましいところです。
帯田 木偶太 への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- しょうない がーーーる の投稿
詳細に,かつ明快に解説いただきまして,ありがとうございます.『動く』とは,そういう意味だったのですね.よく理解できました.
やはり繊細な問題なのですね.どのコマンドがfragileかrobustかを覚えるのは今のところ難しいので,今後問題が起きたら\protectを置き,先述の対処をしてみることにします.勉強になりました.ありがとうございます.
ut への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- しょうない がーーーる の投稿
返信ありがとうございます.
> というわけで、(根本的な)「改善策」は、「Runaway argument」
を引き起こしている、ブレースの閉じ忘れ箇所を探し出して、閉じ
ブレースを追加することだと思われます。

血眼に探してみましたが,どうも見つかりませんでした.素朴な疑問なのですが,ブレースの閉じ忘れがあるときでも,コンパイルされることがあるのですか?私の中のTexのイメージは,何か1つでもミスがあると絶対に上手くいくことはないと思っていました.
しょうない がーーーる への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- ut の投稿
ありゃ…。

すいません、帯田さんのおっしゃる可能性が高そうです…。
しょうない がーーーる への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- 前田 一貴 の投稿

私の経験上の話でちゃんとした説明ではないかもしれませんが,既にお書きのようにエラーが出たときにそこで処理を終了してしまうと不完全な作業ファイル(エラーメッセージからおそらく { に対する } がないまま中途半端に出力されてしまった作業ファイル)が残ってしまう場合があって,これを読み込んだときにまたエラーが出ることになります.このエラーが出たときにそこでまた処理を終了してしまうと,不完全な作業ファイルが更新されずそのままなので何度やってもエラーが出続けます.エラーが出る箇所が \begin{document} なのは,ちょうどそこで作業ファイルを読み込むからだと思います.

楽な対処法ですが,

l.19 \begin{document}

? 

の最後で ? が出ているのは入力待ちのプロンプトで,とりあえずここに何度か Enter を打ち込むとこのエラーを無視して最後まで処理してくれることがあります.一度最後まで処理されれば完全な作業ファイルが出力されるので問題が解決します.

追記:上に帯田さんが根本的な対処法を書いてくださったので,まずはそちらを試した方がよさそうです.

前田 一貴 への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- しょうない がーーーる の投稿
返信ありがとうございます.ちょうどエラーが出たので,エンターをうってみました.ptex2pdf processing of XXX.tex failed.と出てコンパイルは成功しませんでしたが,そのままもう一度タイプセットしてみると確かに通りました.
ただ,コードにミスがあって修正しても,やはり先述のエラーメッセージがでてしまいます.根本的な解決ができたわけではなさそうです.とはいえエンター打ってもう一回タイプセットすればいいという解決策が見つかったのはよかったです.ありがとうございます.
しょうない がーーーる への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- 和田 勇 の投稿

エンターキーの打ち込みなどしなくても、 エラー修正が終わったら、 通常「⌘T (command+T) 」でタイプセットを行うところを、 「⌥⌘T (command+option+T) 」とすると「作業ファイルの削除」後、 通常のタイプセット作業が行われるようですね。

TeXShop/使い方 を参考にしてみてください。

前田 一貴 への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- 前田 一貴 の投稿

私がよく遭遇する問題は fragile は関係ないようで,単に長い文章を書いていると何かのタイミングで中途半端に .aux ファイルに flush してしまうということのようです.

MWEを作ってみました(もしかしたら環境依存あり?).

\documentclass{article}
\begin{document}
\newcount\cnt
\loop\paragraph{\the\cnt}\advance\cnt1\ifnum\cnt<65\repeat
\mistake% おっと,間違ってしまった!!
\end{document}

最後の \mistake で Undefined control sequence が出るので,そこで処理を強制終了すると,.aux の末尾が

\@writefile{toc}{\contentsline {paragraph}{53}{3}{}\protected@file@percent }
\@writefile{toc}

のように中途半端に終わった状態になるので,再度処理しようとすると件のエラーが出ます.どうしようもないでしょうか.

前田 一貴 への返信

Re: コンパイルエラー"\begin{document}"の改善方法について

- 前田 一貴 の投稿

長年使っていてものすごくいまさらですが,エラーが出たときに横着して強制終了するのではなくて,X を入力してちゃんと終了させると .aux に flush してくれるので問題が起きないようです.今度からそうしよう…….