texjporg / nidanfloat

Bottom placement of double float in two column mode derived from Japanese pLaTeX
BSD 3-Clause "New" or "Revised" License
3 stars 1 forks source link

脚注と float が同時に入るときの nidanfloat の挙動 #4

Open Ishotihadus opened 6 years ago

Ishotihadus commented 6 years ago

texjporg/nidanfloat#2 とは別です。同ページ右段に float と脚注が同時に入ると、脚注の位置が本来の位置より上にくるようです(脚注自身分の高さ?)。これにより float が top にあると本文にかぶり、bottom にあると float とかぶるという挙動をします。

\documentclass[twocolumn]{article}
\usepackage{nidanfloat}
\usepackage{lipsum}
\begin{document}
\lipsum*[1-5]
\footnote{Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. }
\begin{table}[t]
\centering
\begin{tabular}{ccc}
\hline
AAAAAA & BBBBBB & CCCCCC \\
\hline
a & 1.00 & 1.00 \\
a & 2.00 & 2.00 \\
a & 3.00 & 3.00 \\
a & 4.00 & 4.00 \\
\hline
\end{tabular}
\end{table}

\lipsum[1-3]
\end{document}

float が右段ではなくぶち抜きの場合も脚注の場所が確保されないようです。

一応最新版の挙動なはずです。ややこしそうな問題ですがよろしくお願いします。

wtsnjp commented 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
}
wtsnjp commented 6 years ago

もちろん,右側 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
}
Ishotihadus commented 6 years ago

気になってやってみたのですが 7df8abb での texjporg/nidanfloat#2 修正前はこのバグは発生しないようですね……。ぶち抜きの方はそもそも動かないのでアレですが。

aminophen commented 6 years ago

ちょっと心当たりがあったので試してみると,以下のコードを入れると ok でした。(つまり二箇所の \@colht 再設定を削除すると ok になる)

\makeatletter
\RequirePackage{etoolbox}
\patchcmd{\R@cflt}{\@colht\@rightfixht}{}{}{}
\patchcmd{\R@cflb}{\@colht\@rightfixht}{}{}{}
\makeatother

これを入れたのは私のようですが,必要だったのかどうかよく覚えていません…

aminophen commented 6 years ago

上にある @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 を足す方式」のどちらが妥当かまだ分からないので,どなたかわかったら教えてください。

domperor commented 6 years ago

反応が遅れてすみません。 【ものすごく】心当たりがあります。 たぶん,#39 においての私の発言(30 Apr 2017) にある,

元のnidanfloat.styからの)変更点は2点です。

  1. \@combinefloats の定義を(たくさん)変更
  2. \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}
aminophen commented 6 years ago

より具体的に書けば最終ページの右bottomフロート位置が右の本文の下に密着するようにするためです。(もしこれがないと,縦方向に中央揃えになる)

下の例で試していただければ。「\@colht\@rightfixhtを削除する方式」では縦方向に中央揃えに,「\footins の高さ+深さ+\footnotesep を足す方式」では本文に密着になります。

なるほど! ありがとうございます。2つの方式の違いが理解できました。

個人的意見になりますが,

wtsnjp commented 6 years ago

私も日中 @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 の高さを引いたものであることが期待されています.したがって,なるべくこの記述と整合性の取れる値にしておくのが良いと思います.