名前: . 日時: 2007-05-09 03:23:48 IPアドレス: 59.134.169.*
>>47897 > \marginpar の実行時点では本文が左右どちらの段にいくか不明. まさしくその通りです. 実際,TeX は ひとつの段落の行分割処理を済ませた後に,必要があれば(つまり, 現在のカラムが埋まるようであれば)ページ分割処理を行う ので,そのような段落の中で用いられたマクロについてもそのマクロの 処理自体はページ分割処理前に(つまり,手前のカラムの中で)行われます. この問題に対処するには, ・相互参照の仕組みを応用して,“現在位置”がどちらのカラムにあるのかを 取得して処理する ・最初から,“左カラム用”と“右カラム用”の 2 通りのデータを用意しておき, 実際に配置される箇所に応じてそれらを選択する といった方法が知られています. どちらを用いるにしても“出力ルーチン”の取り扱いに関する知識・技術は 必要になりますが,LaTeX が提供する傍注は後者を採用しています. 実際,\marginpar 自身についても,次の例にみられるように オプション引数を用いて左右どちらのカラムであるかに応じた処理が できるようにしてあります. # ただし,任意のテキストを“自動的に”傍注にできるように一般化しようとしたら, # 少なくとも“LaTeX のカウンタの管理”には気を遣う必要があるでしょう. # 下記の例の \x の定義を,コメントアウトしたほうに取り換えてみると, # 状況がわかることでしょう. \documentclass[twocolumn]{jarticle} \textheight=6\baselineskip \advance\textheight\topskip%%% サンプル用の設定 \def\TEXT{これは,意味のないサンプルテキストです.} \def\x{}%%% \def\x{\stepcounter{enumi}[\theenumi]} \begin{document} \TEXT\TEXT\marginpar[\raggedleft 左段用\x]{\raggedright 右段用\x}\TEXT\par \TEXT\TEXT\marginpar[\raggedleft 左段用\x]{\raggedright 右段用\x}\TEXT\par \TEXT\TEXT\marginpar[\raggedleft 左段用\x]{\raggedright 右段用\x}\TEXT\par \TEXT\TEXT\marginpar[\raggedleft 左段用\x]{\raggedright 右段用\x}\TEXT\par \end{document} [細かい話] もっとも,ページ上に存在するグルーの縮小度や各種の penalty の値によっては “傍注がどちらのカラムに存在するかを判定するために強制的に 出力ルーチンを起動したときのページ分割位置”と “最終的なページ分割位置”とが異なってくる という可能性があり,そのため傍注を用いた箇所が左右どちらのカラムにあるかの 判定に誤りが生じることがあります. # 上記の例において,\textheight の変更を取り止めたうえで, # \parskip=0pt minus3pt \clubpenalty=0 の設定を追加し, # さらに \TEXT\TEXT ... \par の繰り返し回数を充分に増やしてみてください. この問題にも対処せざるを得ない場合には,とりあえず,上記の 2 通りの 方法の前者(“カラムの参照”)を用いるところでしょうか.
この書き込みへの返事: