名前: . 日時: 2005-11-20 21:39:26 IPアドレス: 59.134.169.*
>>39377 問題となっている現象が再現する *完全な*(= \documentclass から \end{document} まで完備した,それ自身でタイプセット可能な)サンプルが ない以上,問題の所在は誰にもわかりません. # 実際,提示されていない部分(使用しているクラスファイルにおける # \l@chapter や \l@part の定義)が関係します. とりあえず, \l@section の終了時には段落の途中(水平モード)であるにもかかわらず, \l@chapter や \l@part では \addvspace が用いられているため, その \addvspace の処理の際にエラーが生じている # \addvspace は段落間(垂直モードの箇所)出用いなければなりません. # cf. latex.ltx (あるいは『LaTeX2e マクロ&クラス プログラミング # 基礎解説』p.111 のコラム) という状況なのかもしれませんが. 問題の解決に必要な処理は次の通りです. ・\l@chapter や \l@part などの,目次において section よりも上位の項目を 出力するマクロの先頭に \par を追加し,段落間であることを保証 ・\l@section の定義においては,\vskip を用いないように変更 # \vskip を用いると,その箇所で段落が終了されてしまうことに # 注意してください. ・\tableofcontents あるいは \@starttoc の定義に手を加えて, 目次の末尾で確実に段落が終了するように変更 # \leftskip などの設定は,段落の終了時のものが有効になることに # 注意が必要です. ===== 以下,24 時間考えてもおわかりにならない場合のための蛇足 # くれぐれも,最初からサンプルを見るようなことはなさらないでください. # 基礎をふまえずに具体例を眺めても得るものは少ないのですから. \documentclass{jbook} \makeatletter %%% \l@part の再定義例は省略 \def\l@chapter#1#2{% \par%%% 追加 \ifnum \c@tocdepth >\m@ne \addpenalty{-\@highpenalty}% \addvspace{1.0em \@plus\p@}% \begingroup \parindent\z@ \rightskip\@pnumwidth \parfillskip-\rightskip \leavevmode\bfseries \setlength\@lnumwidth{4zw}% \advance\leftskip\@lnumwidth \hskip-\leftskip #1\nobreak\hfil\nobreak\hbox to\@pnumwidth{\hss#2}\par \penalty\@highpenalty \endgroup \fi} \def\l@section#1#2{% \ifhmode \nobreak / \else \noindent \fi \leftskip3zw \begingroup \def\numberline##1{##1\kern.5zw}% #1\kern1zw#2% \endgroup} \def\@starttoc#1{% \begingroup \makeatletter \@input{\jobname.#1}% \ifhmode \par \fi%%% 追加 \if@filesw \expandafter\newwrite\csname tf@#1\endcsname \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax \fi \@nobreakfalse \endgroup} \makeatother \begin{document} \tableofcontents \chapter{サンプル1} \section{サンプル1.1} \section{サンプル1.2} zzz \chapter{サンプル2} \section{サンプル2.1} \section{サンプル2.2} zzz \end{document}
この書き込みへの返事: