Open Ishotihadus opened 6 years ago
とりあえず,泥縄式の修正案です.
\def\R@cflt{%
\let\@elt\@comflelt\setbox\@tempboxa\vbox{}\R@toplist
\setbox\@outputbox\vbox to\@rightfixht{\boxmaxdepth\maxdepth
\unvbox\@tempboxa
\vskip-\floatsep\topfigrule\vskip\textfloatsep\unvbox\@outputbox
\vss}%
\let\@elt\relax
\xdef\@freelist{\@freelist\R@toplist}\global\let\R@toplist\@empty
%%%%% 修正ここから
\ifvoid\footins\else
\advance\@rightfixht\ht\footins
\advance\@rightfixht\dp\footins
\fi
%%%%% 修正ここまで
\@colht\@rightfixht
}
もちろん,右側 bottom に float があるときも同様の問題が発生するようなので,以下の対策もあるといいですね.
\def\R@cflb{%
\let\@elt\@comflelt\setbox\@tempboxa\vbox{}\R@botlist
\setbox\@outputbox\vbox to\@rightfixht{\boxmaxdepth\maxdepth
\unvbox\@outputbox
\vskip\textfloatsep\botfigrule\unvbox\@tempboxa\vskip-\floatsep
\vss}%
\let\@elt\relax
\xdef\@freelist{\@freelist\R@botlist}\global\let\R@botlist\@empty
%%%%% 修正ここから
\ifvoid\footins\else
\advance\@rightfixht\ht\footins
\advance\@rightfixht\dp\footins
\fi
%%%%% 修正ここまで
\@colht\@rightfixht
}
気になってやってみたのですが 7df8abb での texjporg/nidanfloat#2 修正前はこのバグは発生しないようですね……。ぶち抜きの方はそもそも動かないのでアレですが。
ちょっと心当たりがあったので試してみると,以下のコードを入れると ok でした。(つまり二箇所の \@colht
再設定を削除すると ok になる)
\makeatletter
\RequirePackage{etoolbox}
\patchcmd{\R@cflt}{\@colht\@rightfixht}{}{}{}
\patchcmd{\R@cflb}{\@colht\@rightfixht}{}{}{}
\makeatother
これを入れたのは私のようですが,必要だったのかどうかよく覚えていません…
上にある @wtsnjp さんの方法を取る場合は,\footnotesep を考慮に入れて以下のようにすると良さそうです。
\def\R@cflt{%
\let\@elt\@comflelt\setbox\@tempboxa\vbox{}\R@toplist
\setbox\@outputbox\vbox to\@rightfixht{\boxmaxdepth\maxdepth
\unvbox\@tempboxa
\vskip-\floatsep\topfigrule\vskip\textfloatsep\unvbox\@outputbox
\vss}%
\let\@elt\relax
\xdef\@freelist{\@freelist\R@toplist}\global\let\R@toplist\@empty
%%%%% 修正ここから
\ifvoid\footins\else
\advance\@rightfixht\ht\footins
\advance\@rightfixht\dp\footins
\advance\@rightfixht\footnotesep
\fi
%%%%% 修正ここまで
\@colht\@rightfixht
}
\def\R@cflb{%
\let\@elt\@comflelt\setbox\@tempboxa\vbox{}\R@botlist
\setbox\@outputbox\vbox to\@rightfixht{\boxmaxdepth\maxdepth
\unvbox\@outputbox
\vskip\textfloatsep\botfigrule\unvbox\@tempboxa\vskip-\floatsep
\vss}%
\let\@elt\relax
\xdef\@freelist{\@freelist\R@botlist}\global\let\R@botlist\@empty
%%%%% 修正ここから
\ifvoid\footins\else
\advance\@rightfixht\ht\footins
\advance\@rightfixht\dp\footins
\advance\@rightfixht\footnotesep
\fi
%%%%% 修正ここまで
\@colht\@rightfixht
}
「\@colht\@rightfixht
を削除する方式」と,この「\footins の高さ+深さ+\footnotesep を足す方式」のどちらが妥当かまだ分からないので,どなたかわかったら教えてください。
反応が遅れてすみません。 【ものすごく】心当たりがあります。 たぶん,#39 においての私の発言(30 Apr 2017) にある,
元のnidanfloat.styからの)変更点は2点です。
- \@combinefloats の定義を(たくさん)変更
- \R@cflt と \R@cflb に1行ずつ追加(latex.ltxに適切な \@colht を渡すため)
の2.の変更がおおもとです。この変更をした理由は,より具体的に書けば最終ページの右bottomフロート位置が右の本文の下に密着するようにするためです。(もしこれがないと,縦方向に中央揃えになる)
下の例で試していただければ。「\@colht\@rightfixht
を削除する方式」では縦方向に中央揃えに,「\footins の高さ+深さ+\footnotesep を足す方式」では本文に密着になります。どちらを仕様とすべきなのでしょうか……?
\documentclass[twocolumn]{jarticle}
\usepackage{lipsum}
\usepackage{nidanfloat}
%%%
\def\testflt[#1]{%
\begin{table}[#1]
\begin{tabular}{lcl}
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ
\end{tabular}
\end{table}}
%%%
\begin{document}
[1] \lipsum[1]
\testflt[b]
[2] \lipsum[1-2]
\testflt[b]
\end{document}
より具体的に書けば最終ページの右bottomフロート位置が右の本文の下に密着するようにするためです。(もしこれがないと,縦方向に中央揃えになる)
下の例で試していただければ。「
\@colht\@rightfixht
を削除する方式」では縦方向に中央揃えに,「\footins
の高さ+深さ+\footnotesep
を足す方式」では本文に密着になります。
なるほど! ありがとうございます。2つの方式の違いが理解できました。
個人的意見になりますが,
私も日中 @aminophen さんと同じことを考えていました.
少し補足させていただくと,source2e.pdf に以下のような記述があります:
\@colht: The total height of the current column. In single column style, it equals \textheight. In two-column style, it is \textheight minus the height of the double-column floats on the current page. MUST BE INITIALIZED TO \textheight.
つまり,LaTeX2e 的には \@colht
は \textheight
から double-column floats の高さを引いたものであることが期待されています.したがって,なるべくこの記述と整合性の取れる値にしておくのが良いと思います.
texjporg/nidanfloat#2 とは別です。同ページ右段に float と脚注が同時に入ると、脚注の位置が本来の位置より上にくるようです(脚注自身分の高さ?)。これにより float が top にあると本文にかぶり、bottom にあると float とかぶるという挙動をします。
float が右段ではなくぶち抜きの場合も脚注の場所が確保されないようです。
一応最新版の挙動なはずです。ややこしそうな問題ですがよろしくお願いします。