名前: しっぽ愛好家 日時: 2003-10-26 20:08:38 IPアドレス: 220.217.66.*
>>23116 >任意の大きさの図版などを入れた場合などでも >本文の行が常に一定の行位置にくるように設定するような >方法はありませんでしょうか? そのような方法(あるいは機能)は,ありません. %%% そもそも,ディスプレイ数式のような ``変則的な高さをもつ行'' が %%% 存在する場合には,baseline の位置をそのような形で固定すると %%% かえって望ましくない組版結果が生じることがあります. %%% また,``(実務に使えるレベルの,フリーの)既製品'' については %%% 例のごとく存じません. ただし, (1) 図版やディスプレイ数式のような ``変則的な高さをもつもの'' の 高さおよびそれらの前後の空白を手動で調整する (2) LaTeX が用意している各種の処理に手を加えて ``近似的に'' 行取りの処理を行う %%% システム自体が ``なりゆき'' でしか組まないので, %%% あくまでも ``近似的'' なものしか(私の腕では)実現できません といった対処法があります. (1) の方針では,例えば図版に関しては, figure 環境などの先頭と末尾に適宜 \vspace を入れて高さをごまかします. e.g. \begin{figure} \vspace{<適当な寸法>} <図およびキャプションの記述> \vspace{<適当な寸法>} \end{figure} %%% <適当な寸法> を調整すれば ``figure 環境全体'' のサイズが %%% ``整数行分'' であるかのように見せかけることができます. %%% %%% また,必要があれば,\floatsep などの値を適宜変更します %%% (このような調整を行う場合には,\floatsep などは 0pt にして %%% 図版どうしのアキは上記の例の <適当な寸法> で調整してしまうのも %%% 手かもしれません). ディスプレイ数式に関しても同様で,環境の前後に適宜 \vspace{<適当な寸法>} を 入れます. (2) の方針では,概ね次のようになるでしょう. %%% 具体的なコードを書くと長くなりすぎますので,考え方のみです. %%% なお,以下の処理を実現するには,マクロ作成に関するそれなりの %%% 経験を必要としますので,以下の記述はそのつもりで読んでください. %%% %%% これ以降を読まない,というのもひとつの選択でしょう. (a) まず,\lineskiplimit と \lineskip をともに 0pt に設定します. %%% この変更は,ディスプレイ数式などを無条件に ``\baselineskip の整数倍'' %%% の高さのボックスに詰めなおすことを念頭に置いています. %%% つまり,``前後の行にぶつかる場合'' には変則的な高さの行 %%% (これは行送りの整数倍の高さをもつように調整済と仮定)の場合とみなし, %%% 余分なアキを入れないようにします. (b) ディスプレイ数式や float(の中身)を,(概ね)\baselineskip の 整数倍の高さのボックスに詰めなおします. %%% もともとのボックスの height と depth の和を H とおくと, %%% 単に ([H/\baselineskip] + 1) * \baselineskip の高さのボックスに %%% 入れなおせばよいわけです(ただし,[x] は x を超えない整数のうちで %%% 最大のもの). %%% %%% H が \baseline のちょうど整数倍になるとボックスのサイズが %%% %%% 大きくなりすぎますが…その場合には ``余裕をもたせる'' %%% %%% ということでそのままにするか,([H/\baselineskip] + 1) の %%% %%% 部分を [(H + .999\baselineskip) / \baselineskip] くらいに %%% %%% 変更するか,というのは状況によります. %%% ただし,図版については [H/\baselineskip] * \baselineskip + \Cht の %%% 高さのボックスに詰めなおし,\baselineskip - \Cht だけのズレに関しては %%% float の配置処理の側で個々の float を収めたボックスどうしの間に %%% 追加するようにした方がよいかもしれません. %%% %%% いずれにせよ,``t'' 配置あるいは ``b'' 配置の float の %%% %%% 少なくとも一方に対して,``\textheight が \baselineskip の %%% %%% 整数倍ではない''(同じことですが,``\topskip \ne \baselineskip'') %%% %%% に由来する補正を(float 配置処理の側で)必要とします. なお,ディスプレイ数式に関しては,複数行にわたるディスプレイ数式の 個々の行の間でのページ分割を許したい場合には, 配列(\halign)の個々の行の高さを測定し,個々の行の高さを調整したものを 並べなおします. さらに,``(ディスプレイ数式全体の)直前の行の depth'' を考慮して \vskip-\prevdepth あたりを必要に応じて補います(この,``直前の行の depth に 関する補正'' は,ディスプレイ数式の途中のページ分割の可否によらず必要です). %%% 並べなおし方,としては次のような処理が使えるでしょう. %%% \halign{% %%% \global\setbox\@ne\hbox{$\m@th\displaystyle#$}% %%% %%% 実際には,ここに ``配列要素の寸法の測定処理'' が入ります. %%% %%% また,個々の配列要素は適当な ``ボックスの配列''(global に %%% %%% 使用して構わないもの)にコピーします. %%% &\dimen@\ht\@ne \advance\dimen@\dp\@ne %%% \divide\dimen@ \baselineskip \count@\dimen@ %%% \advance\count@\@ne %%% \vbox to\count@\baselineskip{\vfil \box\@ne\vfil} %%% \cr %%% ...} %%% もちろん,詰めなおす際には単に \vfil で調整するのではなく, %%% (行全体(調整前)の height (or depth) - 個々の配列要素の height (or depth)) %%% + (行全体の高さを \baselineskip の整数倍に変更したことによる調整量) %%% の大きさのグルーを配列要素の上下に補うことになりますが… 見出し部分などに ``n 行取り'' の処理を行う場合にも,適宜高さを調整した ボックスに詰めなおします. %%% そのようなボックス(ディスプレイ数式の場合を含む)が %%% ``ページの上端'' にくると,やはり ``\topskip \ne \baselineskip'' %%% であることによる面倒が生じますが… %%% その場合には ``\vskip{<適当な寸法>}\allowbreak\vspace*{-<適当な寸法>}'' %%% (2 箇所の <適当な寸法> には同じ値を用います)といったものを %%% 補って,位置を調整します(無条件に \allowbreak を入れると問題があるので, %%% \if@nobreak などのフラグをチェックしてください). %%% %%% ひとつの考え方としては,\topskip を \baselineskip にして, %%% %%% ``\topskip \ne \baselineskip'' に由来する補正が要らないようにする, %%% %%% という手もあります.こうすると,``t'' 配置の float が見かけの %%% %%% 版面の上にはみ出しかねない,という問題が生じますが, %%% %%% この問題に対しては float 配置処理の側で対処することができるでしょう. (c) \floatsep などの float 関係のグルー, \topsep などの list 系の環境に関するグルー, \abovedisplayskip などのディスプレイ数式に関するグルー, といった各種のグルーの値を(\baselineskip の整数倍に)変更します. %%% カラム間で行が一切ずれないようにするには,これらのグルーの値については %%% 自然長を \baselineskip の整数倍にし,伸縮度を plus 0pt minus 0pt に %%% するしかありません.ただし,これではレイアウトの自由度が %%% 多少制限されますが…それはいたしかたありません(もともと,行を揃える, %%% という(過大な)制限が課されています). あと,``\raggedbottom'' 指定を行って,ページの下端を ``揃えない'' ようにします. %%% そのようにしても,(b) の処理によって ``変則的な高さをもつもの'' が %%% なくなっている(はずな)ので,ページの下端は(``泣き別れ'' の回避が %%% 起こったり,大きな高さをもったディスプレイ数式が改ページ位置に %%% かかったりしない限り)原則として揃います. 他にも考慮すべき点があるかもしれませんが, 過去に行ったことを思い出してみました.
この書き込みへの返事: