texjporg / platex

pLaTeX community edition
BSD 3-Clause "New" or "Revised" License
49 stars 8 forks source link

plext のキャプション周り #76

Closed aminophen closed 5 years ago

aminophen commented 6 years ago

\DeclareLayoutCaption 関連コマンドの挙動修正を始めているので,その備忘録です。

\documentclass{tarticle}
\usepackage{plext}
\begin{document}

%\pcaption{あああ}% => should be an error

\begin{figure}[htbp]
\layoutfloat(5cm,3cm)[c]{\centering 図入る1}
\layoutcaption<z>(5zw)[tu]
\pcaption{とても長いキャプション---サブタイトルまで}
\end{figure}

\begin{figure}[htbp]
\layoutfloat(5cm,4cm)[c]{\centering 図入る1}
\layoutcaption<t>(5zw)[tr]
\pcaption{とても長いキャプション---サブタイトルまで}
\end{figure}

\end{document}
aminophen commented 5 years ago

\layoutcaption の最後の [] の中身は「ちょうど二個の文字トークン」でないといけないのですが,足りない場合・多い場合・udrl 以外の場合はキャプションが何のエラー・警告もなく消滅しますね…。

→ と思ったけど,これは \begin{minipage}[c][1cm][s]{5cm} … \end{minipage} などの最後のオプション引数なども同様なので気にしないことにします。

aminophen commented 5 years ago

platex 2018-09-22 としてリリースしました。

aminophen commented 5 years ago

一度書こうかと思ってやめたのですが,改めて試しているとやっぱり変です。

plext.dtx のドキュメントを引用します。

⟨dir⟩ には、y, t, z, n のいずれかを指定します。n と指定をすると、本文の組み方向と同じ方向でキャプションが組まれます。これがデフォルトです。

⟨width⟩ には、キャプションを折り返す長さを指定します。(12zw) と指定をすると、漢字12 文字分の長さで折り返されます。(\floatwidth) と指定をすると、キャプションの幅はフロートオブジェクトの幅となります。これがデフォルトです。なお、(\floatheight) と指定をすると、キャプションの幅はフロートオブジェクトの高さとなります。

⟨pos1⟩ と ⟨pos2⟩ には、キャプションを出力する位置を指定します。⟨pos1⟩ は、c, t, b のいずれかです。⟨pos2⟩ は、u, d, l, r のいずれかです。デフォルトは、figure タイプが cd、table タイプは cu です。

(1) デフォルト値は何か?

上記の説明文を読むと,デフォルト値は

と期待されます。ところが実装を見ると

% \changes{v1.0h}{1996/03/13}{キャプション出力位置の初期値を設定}
%    \begin{macrocode}
\DeclareLayoutCaption{figure}<y>(.8\linewidth)[cd]
\DeclareLayoutCaption{table}<y>(.8\linewidth)[cu]
%    \end{macrocode}

となっていて,⟨dir⟩ と ⟨width⟩ が説明文と食い違っているように感じます。ちなみに「日本語 LaTeX2e ブック」の記述は実装に合わせてあるようです。

(2) キャプションの幅は自由に設定できるのか?

本文縦組で figure のキャプションを「右」(=物理的な見た目では下)に横組で置くことを考えます。上の文章を元に,キャプションの幅をフロートオブジェクトの「高さ」(=物理的には横幅)に指定しようとすると,なぜか無視されてそれより狭い幅になります。

\documentclass{tarticle}
\usepackage{plext}
\begin{document}

\begin{figure}
\layoutfloat(180pt,300pt){一応,図です一応,図です一応,図です}
\layoutcaption<y>(\floatheight)[cr]
\pcaption{とても長いキャプション---サブタイトルまで}
\end{figure}

\end{document}
plext-orig

これのようなデバッグコードを仕込んでみると,

float size: 180.0pt:300.0pt:c => \layoutfloat による指定の結果
caption setup: y:300.0pt:c:r => \layoutcaption による指定の結果
dir: \yoko => キャプションが実際に組まれる方向
size: 9.16443pt:110.93825pt:110.93825pt => 仮にキャプションを一行で組んだ時の寸法
width: 110.93825pt => キャプションが実際に組まれる時の幅

となります。「仮にキャプションを一行で組んでみている」という理由は,与えられたキャプション文字列自体の長さが \layoutcaption により許された幅より短い(=折り返し不要)かどうかを判定するためのはずですが,この判定で深さを考慮に入れるのを忘れているのでは?という気がします。試しに

  \if@tempswa \@tempdima\ht0 \else\@tempdima\wd0 \fi

を深さも考慮に入れて

  \if@tempswa \@tempdima\ht0 \advance\@tempdima\dp0 \else\@tempdima\wd0 \fi

に変えてみると

plext-new
float size: 180.0pt:300.0pt:c
caption setup: y:300.0pt:c:r
dir: \yoko
size: 9.16443pt:110.93825pt:110.93825pt
width: 221.8765pt

のように期待する結果が得られます。

今考えていること

仮に (1) の “食い違い” という点だけであれば,「まあ,『ブック』も実装に合わせてあることだし,説明文の方が間違っているんだな」と考えて,文章だけ訂正すれば済みます。ところが (2) の “寸法計算が間違っていることが理由でキャプションの幅が思い通りにならない” のは,バグではないかと思います。

そこで,先述のように深さを考慮に入れる修正を加えてみると,今度は \layoutcaption を使わないデフォルト挙動が変わってきます。というのも,仮に一行組みした時点での深さを考慮することによって「従来は折り返されていたものも折り返されなくなる」わけですから当然の結果です。

\begin{figure}
\layoutfloat(180pt,30pt){一応,図です一応,図です一応,図です}
\pcaption{とても長いキャプション---サブタイトルまで}
\end{figure}

修正前は

plext-orig1

ですが,修正後は

plext-new1

となり,やけにキャプションが横長になってしまいます。この結果を見ると,(1) についてもやっぱり考えたほうが良いように思えてきます。実際,説明文通りに

へ変更すると,至って自然な結果に戻ります。(edit: ⟨width⟩ については現行通り .8\linewidth でも別に構いません。自然な結果とするためには,⟨dir⟩ が肝心です。)

aminophen commented 5 years ago

上の問題 (2),簡潔に表現すると


\pcaption で

の二条件を満たす場合は,(仮に \layoutcaption でキャプションの幅をどのように設定しようとも,)必ずキャプションが二行に折り返される


という感じでしょうか。

aminophen commented 5 years ago

forum:2506 にも書きましたが,異論が今の所出ていないので 2d36508 でバグ修正・挙動変更しました。

aminophen commented 5 years ago

platex 2018-12-01 のリリース準備中です。

本 issue のバグ修正・挙動変更は確定ということで,完了とします。