New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nidanfloat のバグ #39

Closed
aminophen opened this Issue Feb 22, 2017 · 10 comments

Comments

Projects
None yet
3 participants
@aminophen
Member

aminophen commented Feb 22, 2017

qa:44116 および qa:51706 のように十年以上前からあり、未だ直っていない nidanfloat のバグのメモ。

\documentclass[twocolumn]{article}
\usepackage{nidanfloat}
\usepackage{lipsum}
\begin{document}
\lipsum[1-5]
\begin{table*}[b]
\begin{tabular}{cccccccc}
\hline
AAAAAA & BBBBBB & CCCCCC & DDDDDD & EEEEEE & FFFFFF & GGGGGG & HHHHHH \\
\hline
a & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 \\ 
a & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 \\ 
a & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 \\ 
a & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 \\ 
\hline
\end{tabular}
\end{table*}
\lipsum[1-3]
\end{document}

このように [b] なフロートが右カラムに出るとき本文と重なります。[t] なときもやはり右カラムの高さが間違っていてはみ出します。

なお、二段組フロートの挙動は、LaTeX2e 2015/01/01 で大きく変更されているので、これと合致するかも調べないといけないはずですね…

@aminophen aminophen added the bug label Feb 23, 2017

@wtsnjp

This comment has been minimized.

Show comment
Hide comment
@wtsnjp

wtsnjp Apr 20, 2017

ざっと読んだだけで理解が浅いですが,現在のところのバグ発生原因についての解釈をメモしておきます.

nidanfloat .sty の L.393-398 で左カラムに入り切らなかった「はみ出し分」を右カラム(\@outputbox)に移しているのですが,この部分の高さが考慮されていないので右カラムが長くなりすぎてしまうようです.

        \setbox\@outputbox=\vbox to\@fixht{%
            \ifvoid\@leftcolumn
            \else
              \unvbox\@leftcolumn\vskip\@tempdima
            \fi\relax
            \unvbox\@outputbox\vss}%

この「はみ出し分」の高さを \@outputbox 組み立て時に得るのは難しそうなので,右カラムの「はみ出し分」を次ページ左カラムに追加するような処理が必要と思われますが,これはそんなに簡単じゃないかもしれません(?)

wtsnjp commented Apr 20, 2017

ざっと読んだだけで理解が浅いですが,現在のところのバグ発生原因についての解釈をメモしておきます.

nidanfloat .sty の L.393-398 で左カラムに入り切らなかった「はみ出し分」を右カラム(\@outputbox)に移しているのですが,この部分の高さが考慮されていないので右カラムが長くなりすぎてしまうようです.

        \setbox\@outputbox=\vbox to\@fixht{%
            \ifvoid\@leftcolumn
            \else
              \unvbox\@leftcolumn\vskip\@tempdima
            \fi\relax
            \unvbox\@outputbox\vss}%

この「はみ出し分」の高さを \@outputbox 組み立て時に得るのは難しそうなので,右カラムの「はみ出し分」を次ページ左カラムに追加するような処理が必要と思われますが,これはそんなに簡単じゃないかもしれません(?)

@domperor

This comment has been minimized.

Show comment
Hide comment
@domperor

domperor Apr 29, 2017

そういうことなら,「はみ出し分」の高さを \unvbox か何かでrecent contribution listにぶちまければよさそうですね。ただし,nidanfloat.styを見ている限りでは,今回の病根の大元は \@fixht (左カラムの高さ)を格納する値が存在しているのに,右カラムの高さを格納する値が存在していないことであるように見えます。これを仮に \@rightfixht としてあげることで,次のように \@combinefloats を修理できるのではないでしょうか。手元の環境ではわりとましに動いているように見えます。

やっていることは

  • \global\newdimen\@rightfixht の一文を追加
  • 左カラムにおける \vss の位置を適正化(かつてこれはbugの原因になりうるとして除去されたようですが,位置を直して復活させる)
  • 右カラム「はみ出し分」を次のページに移送させる命令群をごっそり追加(多くは左カラムの命令の焼き直しですが。)
\global\newdimen\@fixht
\global\newdimen\@rightfixht%追加
\def\@combinefloats{%
  %%\boxmaxdepth\maxdepth
  \if@twocolumn
    \if@firstcolumn
    \else
      \@fixht\ht\@leftcolumn \advance\@fixht\dp\@leftcolumn
      \@chkdblfloatht \@tempdima\@floatht
      \L@chkfloatht \advance\@tempdima\@floatht
      \advance\@fixht\@tempdima
      \ifdim\@fixht>\textheight
        \@fixht\textheight
        \advance\@fixht-\@tempdima
        \advance\@fixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@leftcolumn to\@fixht
        \advance\@fixht-\maxdepth
        \@tempdima\baselineskip \advance\@tempdima-\topskip
        \setbox\@outputbox=\vbox to\@fixht{%
            \ifvoid\@leftcolumn
            \else
              \unvbox\@leftcolumn\vskip\@tempdima
            \fi\relax
            \unvbox\@outputbox}%\vss除去
        \setbox\@leftcolumn=\vbox to\@fixht{\unvbox\z@\vss}%\vss追加
      \fi
      \@fixht\ht\@leftcolumn
        \advance\@fixht\dp\@leftcolumn \advance\@fixht\@floatht
%%%%%%%%%%%%%%%%%%追加ここから%%%%%%%%%%%%%%%%%%
      \@rightfixht\ht\@outputbox \advance\@rightfixht\dp\@outputbox
      \@chkdblfloatht \@tempdima\@floatht
      \R@chkfloatht \advance\@tempdima\@floatht
      \advance\@rightfixht\@tempdima
      \ifdim\@rightfixht>\textheight
        \@rightfixht\textheight
        \advance\@rightfixht-\@tempdima
        \advance\@rightfixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@outputbox to\@rightfixht
        \advance\@rightfixht-\maxdepth
        \@tempdima\baselineskip \advance\@tempdima-\topskip
        \unvbox\@outputbox\vskip\@tempdima
        \setbox\@outputbox=\vbox to\@rightfixht{\unvbox\z@\vss}
      \fi
%%%%%%%%%%%%%%%%%%%%%%追加ここまで%%%%%%%%%%%%%%%%%%%%%%%
      \ifx\L@toplist\@empty\else\L@cflt\fi
      \ifx\L@botlist\@empty\else\L@cflb\fi
      \ifx\R@toplist\@empty\else\R@cflt\fi
      \ifx\R@botlist\@empty\else\R@cflb\fi
    \fi
  \else
      \ifx\@toplist\@empty\else\@cflt\fi
      \ifx\@botlist\@empty\else\@cflb\fi
  \fi
}

domperor commented Apr 29, 2017

そういうことなら,「はみ出し分」の高さを \unvbox か何かでrecent contribution listにぶちまければよさそうですね。ただし,nidanfloat.styを見ている限りでは,今回の病根の大元は \@fixht (左カラムの高さ)を格納する値が存在しているのに,右カラムの高さを格納する値が存在していないことであるように見えます。これを仮に \@rightfixht としてあげることで,次のように \@combinefloats を修理できるのではないでしょうか。手元の環境ではわりとましに動いているように見えます。

やっていることは

  • \global\newdimen\@rightfixht の一文を追加
  • 左カラムにおける \vss の位置を適正化(かつてこれはbugの原因になりうるとして除去されたようですが,位置を直して復活させる)
  • 右カラム「はみ出し分」を次のページに移送させる命令群をごっそり追加(多くは左カラムの命令の焼き直しですが。)
\global\newdimen\@fixht
\global\newdimen\@rightfixht%追加
\def\@combinefloats{%
  %%\boxmaxdepth\maxdepth
  \if@twocolumn
    \if@firstcolumn
    \else
      \@fixht\ht\@leftcolumn \advance\@fixht\dp\@leftcolumn
      \@chkdblfloatht \@tempdima\@floatht
      \L@chkfloatht \advance\@tempdima\@floatht
      \advance\@fixht\@tempdima
      \ifdim\@fixht>\textheight
        \@fixht\textheight
        \advance\@fixht-\@tempdima
        \advance\@fixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@leftcolumn to\@fixht
        \advance\@fixht-\maxdepth
        \@tempdima\baselineskip \advance\@tempdima-\topskip
        \setbox\@outputbox=\vbox to\@fixht{%
            \ifvoid\@leftcolumn
            \else
              \unvbox\@leftcolumn\vskip\@tempdima
            \fi\relax
            \unvbox\@outputbox}%\vss除去
        \setbox\@leftcolumn=\vbox to\@fixht{\unvbox\z@\vss}%\vss追加
      \fi
      \@fixht\ht\@leftcolumn
        \advance\@fixht\dp\@leftcolumn \advance\@fixht\@floatht
%%%%%%%%%%%%%%%%%%追加ここから%%%%%%%%%%%%%%%%%%
      \@rightfixht\ht\@outputbox \advance\@rightfixht\dp\@outputbox
      \@chkdblfloatht \@tempdima\@floatht
      \R@chkfloatht \advance\@tempdima\@floatht
      \advance\@rightfixht\@tempdima
      \ifdim\@rightfixht>\textheight
        \@rightfixht\textheight
        \advance\@rightfixht-\@tempdima
        \advance\@rightfixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@outputbox to\@rightfixht
        \advance\@rightfixht-\maxdepth
        \@tempdima\baselineskip \advance\@tempdima-\topskip
        \unvbox\@outputbox\vskip\@tempdima
        \setbox\@outputbox=\vbox to\@rightfixht{\unvbox\z@\vss}
      \fi
%%%%%%%%%%%%%%%%%%%%%%追加ここまで%%%%%%%%%%%%%%%%%%%%%%%
      \ifx\L@toplist\@empty\else\L@cflt\fi
      \ifx\L@botlist\@empty\else\L@cflb\fi
      \ifx\R@toplist\@empty\else\R@cflt\fi
      \ifx\R@botlist\@empty\else\R@cflb\fi
    \fi
  \else
      \ifx\@toplist\@empty\else\@cflt\fi
      \ifx\@botlist\@empty\else\@cflb\fi
  \fi
}
@domperor

This comment has been minimized.

Show comment
Hide comment
@domperor

domperor Apr 29, 2017

先ほどは拙速ですみませんでした。理由はよくわかっていないのですが,左カラムのあまりと右カラムを合体させるときに入れる \vskip\@tempdima は右カラムの「はみ出し分」を次のページと合体させるときには入れない方が良さそうです。(手元の環境で少し不自然なアキができていることに気づきました。)詰まる所,上のコードの追加部分から \@tempdima\baselineskip \advance\@tempdima-\topskip\vskip\@tempdima を除去して

\global\newdimen\@fixht
\global\newdimen\@rightfixht%追加
\def\@combinefloats{%
  %%\boxmaxdepth\maxdepth
  \if@twocolumn
    \if@firstcolumn
    \else
      \@fixht\ht\@leftcolumn \advance\@fixht\dp\@leftcolumn
      \@chkdblfloatht \@tempdima\@floatht
      \L@chkfloatht \advance\@tempdima\@floatht
      \advance\@fixht\@tempdima
      \ifdim\@fixht>\textheight
        \@fixht\textheight
        \advance\@fixht-\@tempdima
        \advance\@fixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@leftcolumn to\@fixht
        \advance\@fixht-\maxdepth
        \@tempdima\baselineskip \advance\@tempdima-\topskip
        \setbox\@outputbox=\vbox to\@fixht{%
            \ifvoid\@leftcolumn
            \else
              \unvbox\@leftcolumn\vskip\@tempdima
            \fi\relax
            \unvbox\@outputbox}%\vss除去
        \setbox\@leftcolumn=\vbox to\@fixht{\unvbox\z@\vss}%\vss追加
      \fi
      \@fixht\ht\@leftcolumn
        \advance\@fixht\dp\@leftcolumn \advance\@fixht\@floatht
%%%%%%%%%%%%%%%%%%追加ここから%%%%%%%%%%%%%%%%%%
      \@rightfixht\ht\@outputbox \advance\@rightfixht\dp\@outputbox
      \@chkdblfloatht \@tempdima\@floatht
      \R@chkfloatht \advance\@tempdima\@floatht
      \advance\@rightfixht\@tempdima
      \ifdim\@rightfixht>\textheight
        \@rightfixht\textheight
        \advance\@rightfixht-\@tempdima
        \advance\@rightfixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@outputbox to\@rightfixht
        \advance\@rightfixht-\maxdepth
        \unvbox\@outputbox
        \setbox\@outputbox=\vbox to\@rightfixht{\unvbox\z@\vss}
      \fi
%%%%%%%%%%%%%%%%%%%%%%追加ここまで%%%%%%%%%%%%%%%%%%%%%%%
      \ifx\L@toplist\@empty\else\L@cflt\fi
      \ifx\L@botlist\@empty\else\L@cflb\fi
      \ifx\R@toplist\@empty\else\R@cflt\fi
      \ifx\R@botlist\@empty\else\R@cflb\fi
    \fi
  \else
      \ifx\@toplist\@empty\else\@cflt\fi
      \ifx\@botlist\@empty\else\@cflb\fi
  \fi
}

domperor commented Apr 29, 2017

先ほどは拙速ですみませんでした。理由はよくわかっていないのですが,左カラムのあまりと右カラムを合体させるときに入れる \vskip\@tempdima は右カラムの「はみ出し分」を次のページと合体させるときには入れない方が良さそうです。(手元の環境で少し不自然なアキができていることに気づきました。)詰まる所,上のコードの追加部分から \@tempdima\baselineskip \advance\@tempdima-\topskip\vskip\@tempdima を除去して

\global\newdimen\@fixht
\global\newdimen\@rightfixht%追加
\def\@combinefloats{%
  %%\boxmaxdepth\maxdepth
  \if@twocolumn
    \if@firstcolumn
    \else
      \@fixht\ht\@leftcolumn \advance\@fixht\dp\@leftcolumn
      \@chkdblfloatht \@tempdima\@floatht
      \L@chkfloatht \advance\@tempdima\@floatht
      \advance\@fixht\@tempdima
      \ifdim\@fixht>\textheight
        \@fixht\textheight
        \advance\@fixht-\@tempdima
        \advance\@fixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@leftcolumn to\@fixht
        \advance\@fixht-\maxdepth
        \@tempdima\baselineskip \advance\@tempdima-\topskip
        \setbox\@outputbox=\vbox to\@fixht{%
            \ifvoid\@leftcolumn
            \else
              \unvbox\@leftcolumn\vskip\@tempdima
            \fi\relax
            \unvbox\@outputbox}%\vss除去
        \setbox\@leftcolumn=\vbox to\@fixht{\unvbox\z@\vss}%\vss追加
      \fi
      \@fixht\ht\@leftcolumn
        \advance\@fixht\dp\@leftcolumn \advance\@fixht\@floatht
%%%%%%%%%%%%%%%%%%追加ここから%%%%%%%%%%%%%%%%%%
      \@rightfixht\ht\@outputbox \advance\@rightfixht\dp\@outputbox
      \@chkdblfloatht \@tempdima\@floatht
      \R@chkfloatht \advance\@tempdima\@floatht
      \advance\@rightfixht\@tempdima
      \ifdim\@rightfixht>\textheight
        \@rightfixht\textheight
        \advance\@rightfixht-\@tempdima
        \advance\@rightfixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@outputbox to\@rightfixht
        \advance\@rightfixht-\maxdepth
        \unvbox\@outputbox
        \setbox\@outputbox=\vbox to\@rightfixht{\unvbox\z@\vss}
      \fi
%%%%%%%%%%%%%%%%%%%%%%追加ここまで%%%%%%%%%%%%%%%%%%%%%%%
      \ifx\L@toplist\@empty\else\L@cflt\fi
      \ifx\L@botlist\@empty\else\L@cflb\fi
      \ifx\R@toplist\@empty\else\R@cflt\fi
      \ifx\R@botlist\@empty\else\R@cflb\fi
    \fi
  \else
      \ifx\@toplist\@empty\else\@cflt\fi
      \ifx\@botlist\@empty\else\@cflb\fi
  \fi
}
@aminophen

This comment has been minimized.

Show comment
Hide comment
@aminophen

aminophen Apr 29, 2017

Member

@domperor さん

ご無沙汰しております。ご提示の(2番目の)コードを試してみましたが、下のようなソースではまだだめなようです。片カラム内フロートの高さを考慮できていないようです。

\documentclass[twocolumn]{jarticle}
\usepackage{lipsum}
\usepackage{nidanfloat}
\begin{document}

\lipsum[1-3]

\begin{table*}[b]
\begin{tabular}{ c c c c c c c c }
\hline
AAAAAA & BBBBBB & CCCCCC & DDDDDD & EEEEEE & FFFFFF & GGGGGG & HHHHHH \\
\hline
a & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 \\ 
a & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 \\ 
a & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 \\ 
a & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 \\ 
\hline
\end{tabular}
\end{table*}

\lipsum[1-2]
\begin{table}[t]
\begin{tabular}{lcl}
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ
\end{tabular}
\end{table}
\lipsum[1-2]

\begin{table*}[b]
\begin{tabular}{ c c c c c c c c }
\hline
AAAAAA & BBBBBB & CCCCCC & DDDDDD & EEEEEE & FFFFFF & GGGGGG & HHHHHH \\
\hline
a & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 \\ 
a & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 \\ 
a & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 \\ 
a & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 \\ 
\hline
\end{tabular}
\end{table*}

\lipsum[1-3]

\end{document}

今回の病根の大元は \@fixht (左カラムの高さ)を格納する値が存在しているのに,右カラムの高さを格納する値が存在していないことであるように見えます。

これについての私の見解は、二段組では「テキスト+片カラム内フロート」の高さは左と右で必ず同じになるはずなので不要なのだろう、と思っていました。実際 \L@cflt \L@cflb では \setbox\@leftcolumn\vbox to\@fixht していて、 \R@cflt \R@cflb では \setbox\@outputbox\vbox to\@fixht しています。

@domperor さんのコードを見て気づいたのですが、私は病根が「\@outputbox\vsplit していないこと」な気がしてきました。\setbox\z@=\vsplit\@outputbox to(適切な高さ) というコードが従来の nidanfloat.sty には登場していなくて、それは不自然だと思います。

Member

aminophen commented Apr 29, 2017

@domperor さん

ご無沙汰しております。ご提示の(2番目の)コードを試してみましたが、下のようなソースではまだだめなようです。片カラム内フロートの高さを考慮できていないようです。

\documentclass[twocolumn]{jarticle}
\usepackage{lipsum}
\usepackage{nidanfloat}
\begin{document}

\lipsum[1-3]

\begin{table*}[b]
\begin{tabular}{ c c c c c c c c }
\hline
AAAAAA & BBBBBB & CCCCCC & DDDDDD & EEEEEE & FFFFFF & GGGGGG & HHHHHH \\
\hline
a & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 \\ 
a & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 \\ 
a & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 \\ 
a & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 \\ 
\hline
\end{tabular}
\end{table*}

\lipsum[1-2]
\begin{table}[t]
\begin{tabular}{lcl}
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ
\end{tabular}
\end{table}
\lipsum[1-2]

\begin{table*}[b]
\begin{tabular}{ c c c c c c c c }
\hline
AAAAAA & BBBBBB & CCCCCC & DDDDDD & EEEEEE & FFFFFF & GGGGGG & HHHHHH \\
\hline
a & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 \\ 
a & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 \\ 
a & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 \\ 
a & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 \\ 
\hline
\end{tabular}
\end{table*}

\lipsum[1-3]

\end{document}

今回の病根の大元は \@fixht (左カラムの高さ)を格納する値が存在しているのに,右カラムの高さを格納する値が存在していないことであるように見えます。

これについての私の見解は、二段組では「テキスト+片カラム内フロート」の高さは左と右で必ず同じになるはずなので不要なのだろう、と思っていました。実際 \L@cflt \L@cflb では \setbox\@leftcolumn\vbox to\@fixht していて、 \R@cflt \R@cflb では \setbox\@outputbox\vbox to\@fixht しています。

@domperor さんのコードを見て気づいたのですが、私は病根が「\@outputbox\vsplit していないこと」な気がしてきました。\setbox\z@=\vsplit\@outputbox to(適切な高さ) というコードが従来の nidanfloat.sty には登場していなくて、それは不自然だと思います。

@domperor

This comment has been minimized.

Show comment
Hide comment
@domperor

domperor Apr 30, 2017

@aminophen さん 私のテストケースが甘かったようでお手数をおかけしてしまい,すみません。
おっしゃる通り,なるほど \@fixht は使いまわしたほうが自然ですし,片カラム内フロートの考慮もしなくてはなりませんね。とりあえず,【おそらく】どんなフロートが来ても文字が重なってしまうことがないようにコードを弄ってみました。(またしてもテストケースが甘かったら申し訳ございません)

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

  1. \@combinefloats の定義を(たくさん)変更
  2. \R@cflt\R@cflb に1行ずつ追加(latex.ltxに適切な \@colht を渡すため)
  • \@combinefloats の定義を(たくさん)変更

・一発目で作る \@outputbox の大きさの高さ指定を除去(ここが片カラム内フロートの考慮に相当)
\vss位置の適正化
\@fixht の最終的高さの計算を右カラム組み立て後に移送
・右カラム組み立てコマンドをごっそり追加( \@outputbox\vsplit する部分)

\def\@combinefloats{%
  %%\boxmaxdepth\maxdepth
  \if@twocolumn
    \if@firstcolumn
    \else
      \@fixht\ht\@leftcolumn \advance\@fixht\dp\@leftcolumn
      \@chkdblfloatht \@tempdima\@floatht
      \L@chkfloatht \advance\@tempdima\@floatht
      \advance\@fixht\@tempdima
      \ifdim\@fixht>\textheight
        \@fixht\textheight
        \advance\@fixht-\@tempdima
        \advance\@fixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@leftcolumn to\@fixht
        \advance\@fixht-\maxdepth
        \@tempdima\baselineskip \advance\@tempdima-\topskip
        \setbox\@outputbox=\vbox{%%高さ指定除去
            \ifvoid\@leftcolumn
            \else
              \unvbox\@leftcolumn\vskip\@tempdima
            \fi\relax
            \unvbox\@outputbox}%\vss除去
        \setbox\@leftcolumn=\vbox to\@fixht{\unvbox\z@\vss}%\vss追加
      \fi
%      \@fixht\ht\@leftcolumn
%        \advance\@fixht\dp\@leftcolumn \advance\@fixht\@floatht%除去,\@fixhtの計算は右カラムで行うように変更
%%%%%%%%%%%%%%%%%%%%%%%%追加ここから%%%%%%%%%%
      \@fixht\ht\@outputbox \advance\@fixht\dp\@outputbox
      \@chkdblfloatht \@tempdima\@floatht
      \R@chkfloatht \advance\@tempdima\@floatht
      \advance\@fixht\@tempdima
      \ifdim\@fixht>\textheight
        \@fixht\textheight
        \advance\@fixht-\@tempdima
        \advance\@fixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@outputbox to\@fixht
        \advance\@fixht-\maxdepth
        \unvbox\@outputbox
        \setbox\@outputbox=\vbox to\@fixht{\unvbox\z@\vss}
      \fi
        \@fixht\ht\@outputbox
        \advance\@fixht\dp\@outputbox \advance\@fixht\@floatht%こちらで右全部に変更した。
%%%%%%%%%%%%%%%%%%%%%%追加ここまで%%%%%%%%%%%%%%%%%%%%%%%
      \ifx\L@toplist\@empty\else\L@cflt\fi
      \ifx\L@botlist\@empty\else\L@cflb\fi
      \ifx\R@toplist\@empty\else\R@cflt\fi
      \ifx\R@botlist\@empty\else\R@cflb\fi
    \fi
  \else
      \ifx\@toplist\@empty\else\@cflt\fi
      \ifx\@botlist\@empty\else\@cflb\fi
  \fi
}
  • \R@cflt\R@cflb に1行ずつ追加(latex.ltxに適切な \@colht を渡すため,ここも片カラム内フロートの考慮に相当)
\def\R@cflt{%
  \let\@elt\@comflelt\setbox\@tempboxa\vbox{}\R@toplist
  \setbox\@outputbox\vbox to\@fixht{\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
  \@colht\@fixht %追加
}
\def\R@cflb{%
  \let\@elt\@comflelt\setbox\@tempboxa\vbox{}\R@botlist
  \setbox\@outputbox\vbox to\@fixht{\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
  \@colht\@fixht %追加
}

※ githubを始めたばかりで使い方があやふやなのですが,一応 nidanfloat170430.sty という名前でここ( https://github.com/domperor/nidanfloatBugFix/blob/master/nidanfloat170430.sty )にも上記の変更点を施したファイルをアップロードしたつもりです。(恐らくこういう場合ってpull request機能を使ったほうが良いのでしょうが,これから使い方を勉強します。ごめんなさい。)

domperor commented Apr 30, 2017

@aminophen さん 私のテストケースが甘かったようでお手数をおかけしてしまい,すみません。
おっしゃる通り,なるほど \@fixht は使いまわしたほうが自然ですし,片カラム内フロートの考慮もしなくてはなりませんね。とりあえず,【おそらく】どんなフロートが来ても文字が重なってしまうことがないようにコードを弄ってみました。(またしてもテストケースが甘かったら申し訳ございません)

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

  1. \@combinefloats の定義を(たくさん)変更
  2. \R@cflt\R@cflb に1行ずつ追加(latex.ltxに適切な \@colht を渡すため)
  • \@combinefloats の定義を(たくさん)変更

・一発目で作る \@outputbox の大きさの高さ指定を除去(ここが片カラム内フロートの考慮に相当)
\vss位置の適正化
\@fixht の最終的高さの計算を右カラム組み立て後に移送
・右カラム組み立てコマンドをごっそり追加( \@outputbox\vsplit する部分)

\def\@combinefloats{%
  %%\boxmaxdepth\maxdepth
  \if@twocolumn
    \if@firstcolumn
    \else
      \@fixht\ht\@leftcolumn \advance\@fixht\dp\@leftcolumn
      \@chkdblfloatht \@tempdima\@floatht
      \L@chkfloatht \advance\@tempdima\@floatht
      \advance\@fixht\@tempdima
      \ifdim\@fixht>\textheight
        \@fixht\textheight
        \advance\@fixht-\@tempdima
        \advance\@fixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@leftcolumn to\@fixht
        \advance\@fixht-\maxdepth
        \@tempdima\baselineskip \advance\@tempdima-\topskip
        \setbox\@outputbox=\vbox{%%高さ指定除去
            \ifvoid\@leftcolumn
            \else
              \unvbox\@leftcolumn\vskip\@tempdima
            \fi\relax
            \unvbox\@outputbox}%\vss除去
        \setbox\@leftcolumn=\vbox to\@fixht{\unvbox\z@\vss}%\vss追加
      \fi
%      \@fixht\ht\@leftcolumn
%        \advance\@fixht\dp\@leftcolumn \advance\@fixht\@floatht%除去,\@fixhtの計算は右カラムで行うように変更
%%%%%%%%%%%%%%%%%%%%%%%%追加ここから%%%%%%%%%%
      \@fixht\ht\@outputbox \advance\@fixht\dp\@outputbox
      \@chkdblfloatht \@tempdima\@floatht
      \R@chkfloatht \advance\@tempdima\@floatht
      \advance\@fixht\@tempdima
      \ifdim\@fixht>\textheight
        \@fixht\textheight
        \advance\@fixht-\@tempdima
        \advance\@fixht\maxdepth
        \vbadness=\@M \splittopskip=\topskip \splitmaxdepth=\maxdepth
        \setbox\z@=\vsplit\@outputbox to\@fixht
        \advance\@fixht-\maxdepth
        \unvbox\@outputbox
        \setbox\@outputbox=\vbox to\@fixht{\unvbox\z@\vss}
      \fi
        \@fixht\ht\@outputbox
        \advance\@fixht\dp\@outputbox \advance\@fixht\@floatht%こちらで右全部に変更した。
%%%%%%%%%%%%%%%%%%%%%%追加ここまで%%%%%%%%%%%%%%%%%%%%%%%
      \ifx\L@toplist\@empty\else\L@cflt\fi
      \ifx\L@botlist\@empty\else\L@cflb\fi
      \ifx\R@toplist\@empty\else\R@cflt\fi
      \ifx\R@botlist\@empty\else\R@cflb\fi
    \fi
  \else
      \ifx\@toplist\@empty\else\@cflt\fi
      \ifx\@botlist\@empty\else\@cflb\fi
  \fi
}
  • \R@cflt\R@cflb に1行ずつ追加(latex.ltxに適切な \@colht を渡すため,ここも片カラム内フロートの考慮に相当)
\def\R@cflt{%
  \let\@elt\@comflelt\setbox\@tempboxa\vbox{}\R@toplist
  \setbox\@outputbox\vbox to\@fixht{\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
  \@colht\@fixht %追加
}
\def\R@cflb{%
  \let\@elt\@comflelt\setbox\@tempboxa\vbox{}\R@botlist
  \setbox\@outputbox\vbox to\@fixht{\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
  \@colht\@fixht %追加
}

※ githubを始めたばかりで使い方があやふやなのですが,一応 nidanfloat170430.sty という名前でここ( https://github.com/domperor/nidanfloatBugFix/blob/master/nidanfloat170430.sty )にも上記の変更点を施したファイルをアップロードしたつもりです。(恐らくこういう場合ってpull request機能を使ったほうが良いのでしょうが,これから使い方を勉強します。ごめんなさい。)

@aminophen

This comment has been minimized.

Show comment
Hide comment
@aminophen

aminophen Apr 30, 2017

Member

今日は時間がなさそうなので,明日以降見てみます。

platex リポジトリの bug fix の pull request は,基本的に dtx ファイルを変更しなければならないので,通常の pull request より難しいかもしれません。パッチをコメントしていただいたり,ファイルを置いていただけたりだけでも十分です。ありがとうございます。

Member

aminophen commented Apr 30, 2017

今日は時間がなさそうなので,明日以降見てみます。

platex リポジトリの bug fix の pull request は,基本的に dtx ファイルを変更しなければならないので,通常の pull request より難しいかもしれません。パッチをコメントしていただいたり,ファイルを置いていただけたりだけでも十分です。ありがとうございます。

@aminophen

This comment has been minimized.

Show comment
Hide comment
@aminophen

aminophen May 1, 2017

Member

何度もすみません… 適当にテストしていたところ,以下のソースで最終ページ (p.14) で片カラム表が本文([21] の段落)と重なっています。(p.4 も右カラム最後にスペースが空いていますが,これは widow/orphan ができないように処理されたためかもしれないと思って無視することにします)

コードを見る限り大丈夫そうだと思ったのですが…

\documentclass[twocolumn]{jarticle}
\usepackage{lipsum}
\usepackage{nidanfloat}

%%%
\def\testflt[#1]{%
\begin{table}[#1]
\begin{tabular}{lcl}
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ
\end{tabular}
\end{table}}
%%%
\def\testdblflt[#1]{%
\begin{table*}[#1]
\begin{tabular}{ c c c c c c c c }
\hline
AAAAAA & BBBBBB & CCCCCC & DDDDDD & EEEEEE & FFFFFF & GGGGGG & HHHHHH \\
\hline
a & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 \\ 
a & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 \\ 
a & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 \\ 
a & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 \\ 
\hline
\end{tabular}
\end{table*}}
%%%

\begin{document}

[1] \lipsum[1-4]
\testdblflt[b]
[2] \lipsum[1-3]
\testdblflt[b]
[3] \lipsum[1-3]
\testdblflt[b]
[4] \lipsum[1-3]
\testdblflt[t]
[5] \lipsum[1-3]
\testdblflt[t]
[6] \lipsum[1-3]
\testdblflt[t]
[7] \lipsum[1-3]
\testdblflt[b]
[8] \lipsum[1-3]
\testdblflt[t]
[9] \lipsum[1-3]
\testdblflt[b]
[10] \lipsum[1-3]
\testdblflt[t]
[11] \lipsum[1-3]
\testdblflt[b]
[12] \lipsum[1-3]
\testdblflt[t]
[13] \lipsum[1-2]
\testflt[t]
[14] \lipsum[1-2]
\testdblflt[b]
[15] \lipsum[1-3]
\testdblflt[t]
[16] \lipsum[1-2]
\testflt[t]
[17] \lipsum[1-2]
\testdblflt[b]
[18] \lipsum[1-2]
\testdblflt[t]
[19] \lipsum[1-2]
\testflt[b]
[20] \lipsum[1-4]
\testflt[b]
[21] \lipsum[1-2]
\end{document}
Member

aminophen commented May 1, 2017

何度もすみません… 適当にテストしていたところ,以下のソースで最終ページ (p.14) で片カラム表が本文([21] の段落)と重なっています。(p.4 も右カラム最後にスペースが空いていますが,これは widow/orphan ができないように処理されたためかもしれないと思って無視することにします)

コードを見る限り大丈夫そうだと思ったのですが…

\documentclass[twocolumn]{jarticle}
\usepackage{lipsum}
\usepackage{nidanfloat}

%%%
\def\testflt[#1]{%
\begin{table}[#1]
\begin{tabular}{lcl}
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ \\
ほげ & ほげ & ほげ
\end{tabular}
\end{table}}
%%%
\def\testdblflt[#1]{%
\begin{table*}[#1]
\begin{tabular}{ c c c c c c c c }
\hline
AAAAAA & BBBBBB & CCCCCC & DDDDDD & EEEEEE & FFFFFF & GGGGGG & HHHHHH \\
\hline
a & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 & 1.00 \\ 
a & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 & 2.00 \\ 
a & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 & 3.00 \\ 
a & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 & 4.00 \\ 
\hline
\end{tabular}
\end{table*}}
%%%

\begin{document}

[1] \lipsum[1-4]
\testdblflt[b]
[2] \lipsum[1-3]
\testdblflt[b]
[3] \lipsum[1-3]
\testdblflt[b]
[4] \lipsum[1-3]
\testdblflt[t]
[5] \lipsum[1-3]
\testdblflt[t]
[6] \lipsum[1-3]
\testdblflt[t]
[7] \lipsum[1-3]
\testdblflt[b]
[8] \lipsum[1-3]
\testdblflt[t]
[9] \lipsum[1-3]
\testdblflt[b]
[10] \lipsum[1-3]
\testdblflt[t]
[11] \lipsum[1-3]
\testdblflt[b]
[12] \lipsum[1-3]
\testdblflt[t]
[13] \lipsum[1-2]
\testflt[t]
[14] \lipsum[1-2]
\testdblflt[b]
[15] \lipsum[1-3]
\testdblflt[t]
[16] \lipsum[1-2]
\testflt[t]
[17] \lipsum[1-2]
\testdblflt[b]
[18] \lipsum[1-2]
\testdblflt[t]
[19] \lipsum[1-2]
\testflt[b]
[20] \lipsum[1-4]
\testflt[b]
[21] \lipsum[1-2]
\end{document}
@aminophen

This comment has been minimized.

Show comment
Hide comment
@aminophen

aminophen May 1, 2017

Member

これで最後のページが変になるということは, @domperor さんの仰るように「右用の高さを別名で用意すべき(使い回しがダメ)」かもしれないです。最終ページは左カラムと右カラムが別の高さになって当然なのを忘れていました。失礼しました…

というわけで @domperor さんの一回目と二回目のコードを「合成」してみました。手元ではうまく動いているようです。これなら大丈夫そうな気がしますので,もう少しテストしてみます。

Member

aminophen commented May 1, 2017

これで最後のページが変になるということは, @domperor さんの仰るように「右用の高さを別名で用意すべき(使い回しがダメ)」かもしれないです。最終ページは左カラムと右カラムが別の高さになって当然なのを忘れていました。失礼しました…

というわけで @domperor さんの一回目と二回目のコードを「合成」してみました。手元ではうまく動いているようです。これなら大丈夫そうな気がしますので,もう少しテストしてみます。

@domperor

This comment has been minimized.

Show comment
Hide comment
@domperor

domperor May 2, 2017

合成していただいたのですね,お手数おかけしてすみませんでした
ありがとうございました!

domperor commented May 2, 2017

合成していただいたのですね,お手数おかけしてすみませんでした
ありがとうございました!

@aminophen

This comment has been minimized.

Show comment
Hide comment
@aminophen

aminophen May 3, 2017

Member

7df8abb で master ブランチにパッチを導入しましたので,close します。

ご協力ありがとうございました。

Member

aminophen commented May 3, 2017

7df8abb で master ブランチにパッチを導入しましたので,close します。

ご協力ありがとうございました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment