名前: . 日時: 2009-11-22 19:14:29 IPアドレス: 59.134.169.*
>>54035 # 問題の原因は不用意に無限ループを引き起こさせているということに # 報告者ご自身で気付いているようですので,「解決済み」ではありますが…… >! TeX capacity exceeded, sorry [input stack size=1500]. というのは,自分でマクロを書きでもしないとあまり目にすることもないので 珍しいと言えなくもないのですが……自分でマクロを書く人ならむしろおなじみの エラーかもしれません(「経験を積むうちに自然と出くわすもの」のひとつ(*) でしょう). # (*) 「いや,下記に示す例にみられるようなポカはまったくやらない(やった # ことはない)」という優秀な(あるいは慎重な)方の場合には # 話は別でしょうけれども. 例えば, \def\x{\y\x} \def\y#1{(#1)} という定義のもとで \x を用いると,今回のご報告と同様の状況で input stack size に 関するエラーが生じますし,次のサンプルのように「簡単なテストを行う限りに おいてはうまくいくが,本質的にはバグがある」場合もあります. \documentclass{jarticle} \makeatletter \def\manytext#1#2{%%% #1: 繰り返し回数, #2: テキスト \leavevmode \begingroup \@tempcnta\z@ \@tempcntb=#1\relax \def\@manytext@text{#2}% \@manytext \endgroup} \def\@manytext{% \ifnum\@tempcnta<\@tempcntb \advance\@tempcnta\@ne \@manytext@text \@manytext%%% \expandafter\@manytext とするのが正しい. \fi} \makeatother \begin{document} \manytext{3}{猫}%%% このくらいなら,問題なく処理されるが…… %%% \manytext{10000}{猫}%%% こうするとエラーが生じる. \end{document} # この例は,単純化すると, # \def\x{\iftrue \x \fi} # という定義のもとで \x を用いた場合と(発生するエラーに関しては)同じことです.
この書き込みへの返事: