texjporg / jsclasses

Classes tailored for use with Japanese.
BSD 2-Clause "Simplified" License
60 stars 14 forks source link

フロートのh指定で前後のアキが不均等になる #15

Open yuw opened 8 years ago

yuw commented 8 years ago

次のようなコードでh指定した場合,オブジェクトの前後のアキが不均等になります.

\documentclass{jsarticle}
\begin{document}
■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□
\begin{figure}[h]
 \frame{\phantom{\rule{15\cHT}{15\cwd}}}
\end{figure}

■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□
\end{document}

期待する挙動は前後のアキが均等であることです. 単純には,\@addtocurcolを次のように変更すればよいかと思います.

\def \@addtocurcol {%
   \@insertfalse
   \@setfloattypecounts
   \ifnum \@fpstype=8
   \else
     \ifnum \@fpstype=24
     \else
       \@flsettextmin
       \advance \@textmin \@textfloatsheight
       \@reqcolroom \@pageht
       \ifdim \@textmin>\@reqcolroom
         \@reqcolroom \@textmin
       \fi
       \advance \@reqcolroom \ht\@currbox
       \ifdim \@colroom>\@reqcolroom
         \@flsetnum \@colnum
         \ifnum \@colnum>\z@
           \@bitor\@currtype\@deferlist
           \if@test
           \else
             \@bitor\@currtype\@botlist
             \if@test
               \@addtobot
             \else
               \ifodd \count\@currbox
                 \advance \@reqcolroom \intextsep
                 \ifdim \@colroom>\@reqcolroom
                   \global \advance \@colnum \m@ne
                   \global \advance \@textfloatsheight \ht\@currbox
                   \global \advance \@textfloatsheight 2\intextsep
                   \@cons \@midlist \@currbox
                   \if@nobreak
                     \nobreak
                     \@nobreakfalse
                     \everypar{}%
                   \else
                     \addpenalty \interlinepenalty
                   \fi
                   \vskip \intextsep
                   \box\@currbox
                   \penalty\interlinepenalty
%                   \vskip\intextsep% <- 変更
                   \vskip\dimexpr\intextsep-\cvs+\cHT\relax
                   \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
                   \outputpenalty \z@
                   \@inserttrue
                 \fi
               \fi
               \if@insert
               \else
                 \@addtotoporbot
               \fi
             \fi
           \fi
         \fi
       \fi
     \fi
   \fi
   \if@insert
   \else
     \@resethfps
     \@cons\@deferlist\@currbox
   \fi
}
aminophen commented 8 years ago

ぜんぜんわからない(LaTeX の問題なのか pLaTeX の問題なのか jsclasses の問題なのかすら)ので試してみているのですが、以下のソースで起きる不均等と同じでしょうか?

%#!pdflatex
\documentclass[12pt]{article}
\def\square{\frame{\phantom{\rule{10pt}{10pt}}}}
\begin{document}
\square\square\square\square\square\square\square\square\square
\begin{figure}[h]
  \frame{\phantom{\rule{10em}{10em}}}
\end{figure}

\square\square\square\square\square\square\square\square\square
\end{document}

この不均等も、きえださんの \@addtocurcol へのパッチ(に以下のフォールバックを加えたもの)で(だいたい)均等になると思います。

\ifx\pfmtname\undefined
  \newdimen\cvs
  \cvs\normalbaselineskip
  \newdimen\cHT
  \cHT12pt
\fi
yuw commented 8 years ago

以下のソースで起きる不均等と同じ

おそらく同じでしょう.また,下方の“多い”アキは行間分だけの量でしょう.

aminophen commented 8 years ago

これが仮に問題だとして(そこすらちょっと私には正確には判断しかねます)、直すとするとほかのどの issue より影響が大きい気がします。 \@addtocurcol へのパッチということであれば、jsclasses ではなく少なくとも pLaTeX カーネルで修正すべきな気がしますし、そうすると fltrace/flafter/latexrelease への対応もかなりややこしいことになるので、より根源的には LaTeX カーネルで修正してほしくなってしまいます。

okumuralab commented 8 years ago

そもそも

\documentclass{jsarticle}
\begin{document}
■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□

\frame{\phantom{\rule{15\cHT}{15\cwd}}}

■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□■□□□□
\end{document}

で上に寄るのはTeXの根源的な問題ですが,どこまで対処するか。

yuw commented 8 years ago

図版や表をフロートさせない要求はままあります.それも恣意的に.

例えば図/表はページ上部と文書仕様にあっても,作業行程が進むうちに個別にフロートさせないようにと“指定”がなされるという具合です.その際hオプションで対応するのは自然だと思います.その際,上下のアキは均等であることが当然に要求されます.

何かしらの対応がどこかでなされるとケアが不要になり,リスク低減につながります.

kbhonda commented 8 years ago

たぶんこれを気にするのは,職業編集者と職業組版屋だと思います. 私ももちろんにしますので,実は目立つところは個別にad hocに手当してます. 原因は放置してたのですが,そこだったんですね. 今度からこっそり手当しておきます,ありがとうございます. 加えて深さの分の処置をいれる必要がありませんか? あとこれはLaTeXカーネルの問題だと思います.

根本的には 「\vskip3mmは3mmアキではない,行間忘れるな」 と同根のように思います.

奥村先生

上に寄るのはTeXの根源的な問題ですが,どこまで対処するか。

これはよく私のところでも規範的な意味で話題になるのですが, 職業的な観点からいけば,TeXだからどうこうというのは無関係なんです. 個人的には,昔は写研,最近ではInDesignにできることをどこまで 簡単にできるようにするかの追及が個人的なテーマになりつつあります(苦笑) それで,コストの問題との兼ね合いもありますが, 出力結果の綺麗さ >> 壁 >> マクロ的な美しさ,ソースコードの綺麗さ ですので,\vbox系の前後の空きでも目立つところはいろいろ ad hocに手を入れてます.

図版や表をフロートさせない要求はままあります.それも恣意的に.

図の配置は出版社の規準がありますよね. ちなみにここを見ているような方がよく目にしそうな工学系の分野で h配置をする出版社がありますよ.

okumuralab commented 8 years ago

私もよくH(hでないですが)は使います。キャプションとのバランスや,図の上部の具合によっても違いますので,気になる場合は(たいてい上部に)手で\vspaceを入れて調整しています(キャプションと本文が近づきすぎると読みにくくなるので)。うまくLaTeXが判断してくれればありがたいのですが,下部の\intextsepを外すのでいいのか,よく理解できていません。

ちなみに\intextsepについては美文書p.156のような場合には上部の\intextsepを外すこともよくあります。