Ticket #34483

ltjtarticle + geometry

Open Date: 2014-10-15 13:32 Last Update: 2015-09-22 20:04

Reporter:
Owner:
(None)
Status:
Closed
Component:
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
None

Details

縦組で 20 文字× 40 行を意図して,次のようなソースを走らせてみました:

%#!luajitlatex
\documentclass{ltjtarticle}
\usepackage[textwidth=20\zw, lines=40]{geometry}
\begin{document}
\noindent
\def\R{012345678901234567890123456789}
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R
\end{document}
すると,70 文字× 11 行というレイアウトになってしまいます. 単純に \textheight と \textwidth を交換するだけではうまくいかないようです.

Ticket History (3/22 Histories)

2014-10-15 13:32 Updated by: h7k
  • New Ticket "ltjtarticle + geometry" created
2014-10-16 11:56 Updated by: h7k
  • Component Update from (None) to 縦組
2014-11-21 11:30 Updated by: kmaeda
Comment

遅くなりましたが,色々試してみていました. 根本的な原因は \textwidth と \textheight の意味が横組みの場合と縦横逆になっていることなのですが, 解決にはいくつかのマクロの再定義が必要になりそうです.

現状のコードだと,geometry の処理 (\Gm@process) の終了時に \textwidth と \textheight をひっくり返しているのですが,これでうまくいくのは 余白のみを指定した場合です.この場合,指定した余白の長さから,横:\textwidth, 縦:\textheight を計算するので, これをひっくり返せば,縦:\textwidth, 横:\textheight となってうまくいきます. 本文の長さを指定したときにうまくいくようにするには,\Gm@adjustbody の直後で,縦:\Gm@width,横:\Gm@height をひっくり返して, 横組みの場合と同じ状況にしてから余白の計算をさせて,さらに \Gm@process の終了時に,横:\textwidth,縦:\textheight をひっくり返せばよさそうです. 試した限りだと,lines の指定より1行少なくなっていること以外はうまくいっているように見えます.

しかし,以上の変更を加えても次の問題が残ります:

\documentclass{ltjtarticle}
\usepackage[hmargin=2cm,textwidth=20\zw]{geometry}
\begin{document}
\end{document}
このとき,
Package geometry Warning: Over-specification in `h'-direction.
    `width' (192.44385pt) is ignored.
となって textwidth の指定が無視されます.縦組みでは textwidth は v'-direction とみなすべきなのですが, オリジナルのコードのままだと hmargin と textwidth の同時指定ができなくなってしまいます. 対応するには,\Gm@detall (とそれに関する部分)を書き換えなければならないように思うのですが, 何か簡単に解決できるうまい抜け道はあるでしょうか.

2014-11-22 22:15 Updated by: kmaeda
Comment

kmaeda への返信

オリジナルのコードのままだと hmargin と textwidth の同時指定ができなくなってしまいます.

\hbox や \vbox の方向と合わせて解釈することにしてみました.つまり,h が上下方向,v が左右方向になります. これに合わせて,tmargin, bmargin, rmargin, lmargin を適切に設定するようにしてみました. kmaeda_tgeometry ブランチの 75602dd を試してみて下さい. あまり複雑な指定は試していないので,色々細かい不具合はあると思います.

相変わらず,lines の指定より1行少なくなってしまうのですが,なぜなのでしょうか.計算式は横組みのときと変わらないと思うのですが.

2014-11-23 09:56 Updated by: h7k
Comment

相変わらず,lines の指定より1行少なくなってしまうのですが

\maxdepth が ltjclasses では 0.5\Cht(縦組クラス10pt では 2.40555 pt)となりますが, これが実際の最下行の深さ (4.80111 pt) よりも小さいことが原因です.

なぜこのような値になっているか,というのは [lt]jclasses.dtx で

\setlength\topskip{1\Cht}
...
% \LaTeXe{}では、|\maxdepth|$+$|\topskip|を基本サイズの1.5倍にしたいので、
% |\maxdepth|を|\topskip|の半分の値で設定します。
\if@compatibility
  \setlength\maxdepth{4\p@}
\else
  \setlength\maxdepth{.5\topskip}
\fi
とあるからです. [lt]jclasses での \maxdepth の値は(互換性のため)そのままでもいいと思います.

一方,geometry パッケージでは,\topskip の値をどっちみち最低でも \ht\strutbox (=.7\baselineskip) 以上になるように再設定しているので,lltjp-geometry.sty 内で \maxdepth の値も再設定してもいいのではないでしょうか.(縦組の場合は \ht\strutbox でなく,\ht\tstrutbox (=.5\baselineskip) で比較するべきだと思うのですが,lltjp-geometry.sty 中の \strutbox を \tstrutbox に置き換えても動作は変わっていないようです.)

2014-11-23 11:29 Updated by: kmaeda
Comment

h7k への返信

相変わらず,lines の指定より1行少なくなってしまうのですが

\maxdepth が ltjclasses では 0.5\Cht(縦組クラス10pt では 2.40555 pt)となりますが, これが実際の最下行の深さ (4.80111 pt) よりも小さいことが原因です.

ありがとうございます.1e63331 でそのようにしてみました.どうやら正しく動くようになったようです.

2014-11-23 12:03 Updated by: h7k
Comment

1e63331 でそのようにしてみました.どうやら正しく動くようになったようです.

こちらこそ,ありがとうございます.

ところで,確か pLaTeX 縦組でも geometry.sty は対応していなかったはずなので, この lltjp-geometry.sty を pLaTeX でも動くようにできないかな,と考えているところです. tarticle などは

\DeclareOption{tate}{%
  \AtBeginDocument{\tate\message{《縦組モード》}%
                   \adjustbaseline}%
}
と,\begin{document} 時に組方向を変えている(この tate オプションは縦組クラスでは暗黙で有効)ので, どうすればいいか悩んでいます.

2014-11-23 12:25 Updated by: kmaeda
Comment

h7k への返信

と,\begin{document} 時に組方向を変えている(この tate オプションは縦組クラスでは暗黙で有効)ので,

自動でパッチが適用されることにこだわらなければ,jlistings みたいに縦組で geometry を使いたいときに手動で読み込むパッケージと すればなんとかなるのではないでしょうか(そういう問題ではない?).

それよりも,

! Incompatible direction list can't be unboxed.
\@begindvi ->\unvbox \@begindvibox 
                                   \global \let \@begindvi \@empty 
l.12 \end{document}
                   
? 
というのが出るのをなんとかしなければならないです.

2014-11-23 12:59 Updated by: kmaeda
Comment

geometry を読み込むと,\begin{document} 後の \@begindvibox が

\vbox(0.0+0.0)x0.0, tate direction
.\special{papersize=597.50787pt,845.04684pt}
という具合になって,これを \@begindvi で \unvbox するときにエラーになっているみたいです.

\@begindvibox が yoko direction になっていればよさそうなので,

\documentclass{tarticle}
\AtBeginDocument{\yoko}
\usepackage[lines=5]{geometry}
\AtBeginDocument{\tate}
\begin{document}
あ
\end{document}
というのを試してみたら,とりあえず回避できているように見えます.

2014-11-23 13:02 Updated by: h7k
Comment

いろいろコメントを考えていたら,先にコメントをかかれてしまいました.

\@begindvibox が yoko direction になっていればよさそうなので,

ffeb9944 で直したつもりです.(同様の修正は,あとで lltjcore にも加えておきます)

2014-11-23 13:12 Updated by: kmaeda
Comment

いろいろコメントを考えていたら,先にコメントをかかれてしまいました.

すいません.

ちょうど外出するところなので,更新されたものはまだ pLaTeX で試していないのですが, pLaTeX でも使えるように切り出すのならば,名前を変えた方がよいかもしれません.

2014-11-23 17:40 Updated by: kmaeda
Comment

pLaTeX で試していたのですが,Overfull \vbox が出ます.

\documentclass{tarticle}
\usepackage{lltjp-geometry}
\usepackage[lines=10]{geometry}
\begin{document}
\noindent
\def\R{012345678901234567890123456789}
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R\R\R\R\R
\end{document}
Overfull \vbox (4.58221pt too high) has occurred while \output is active
と出ます.4.58221pt ってどういう値なのでしょうか.

2014-11-23 18:37 Updated by: h7k
Comment

kmaeda への返信

pLaTeX で試していたのですが,Overfull \vbox が出ます. 4.58221pt ってどういう値なのでしょうか.

0.5 zh,つまり最終行の深さです.

plcore.dtx の \@makecol の再定義に

     \setbox\@outputbox \vbox to\@colht {%
     ...
       \dimen@ \dp\@outputbox
       \unvbox \@outputbox
       ...
       \iftdir\hskip\z@
       \else\vskip -\dimen@\fi
というコードがあり,この \setbox が Overfull 警告を生み出しています. 最後の2 行はどうも
\iftdir\hskip\z@\fi\vskip -\dimen@
が正しそうな予感がします.

2014-11-23 20:02 Updated by: kmaeda
Comment

h7k への返信

最後の2 行はどうも ... が正しそうな予感がします.

もしそれが geometry に限らない plcore.dtx の問題ならば,platex にフィードバックすべきなのでしょうか.

忘れないうちに書いておきますが,他に気になっていることとしては,marginal note の扱いと,途中で組方向を変えた場合の \newgeometry があります. 前者はそもそも何もテストしていないです.後者は,こういうことをするのが想定されているのかどうかわからないのですが, 例えば

\documentclass{tarticle}
\usepackage{lltjp-geometry}
\usepackage[margin=2cm]{geometry}
\begin{document}
\noindent
\def\R{012345678901234567890123456789}
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R\R\R\R\R
\newpage
\yoko
\newgeometry{margin=2cm}
\noindent
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R\R\R\R\R
\newpage
\tate
\restoregeometry
\noindent
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R\R\R\R\R
\R\R\R\R\R\R\R\R\R\R
\end{document}
としたときに \yoko のときの \newgeometry はオリジナルのコードで動くべきではないか,ということです.

head と foot 関連の部分も何も考えず height を width に書き換えて計算させているのですが,正しく動いているかテストしていないです. 気が向いたときにでもやらなければ…….

2014-12-03 11:20 Updated by: h7k
  • Type Update from Bugs to Support Request
Comment

チケット詳細に書いてある問題自体は直ったので,チケット種別を変更しました.

2014-12-31 14:04 Updated by: h7k
Comment

marginal note の扱い

考え始めたところです. 今の状況だと, margin note は紙の下側に入るので.includefoot の指定のときは \footskip を変えることになりますが……どうしよう.
% reversemp 指定時は,代わりに\headsep をいじくることになるのかな.

2014-12-31 17:32 Updated by: kmaeda
Comment

ついでですが,platex だと縦書き時の showframe の出力がおかしいようです.

  1. \documentclass{tarticle}
  2. \usepackage{lltjp-geometry}
  3. \usepackage[margin=2cm,showframe]{geometry}
  4. \begin{document}
  5. \noindent
  6. \def\R{012345678901234567890123456789}
  7. \R\R\R\R\R\R\R\R\R\R
  8. \R\R\R\R\R\R\R\R\R\R
  9. \R\R\R\R\R\R\R\R\R\R
  10. \end{document}

luatexja だと問題ないのですが,なぜなのかはまだ調べていないです.

2014-12-31 20:10 Updated by: h7k
Comment

platex だと縦書き時の showframe の出力がおかしいようです.

frame の出力が tate direction になっていたようです.4de35ca で直っていると思います.
lltjp-geometry.sty 中のコメントに書きましたが,landscape, truedimen がまだうまく動かないようです.

そういえば,上の方の kmaeda さんのコメントにある

  1. \documentclass{ltjtarticle}
  2. \usepackage[hmargin=2cm,textwidth=20\zw]{geometry}
  3. \begin{document}
  4. \end{document}
からは,依然として
Package geometry Warning: Over-specification in `h'-direction.
という警告が出ます.オリジナルの geometry の処理をやって,その後に縦組用のパッチを当ててもう一度寸法設定し直すという方法をとっている以上仕方がない警告ではあるのですが,どうしましょうかね.

途中で組方向を変えた場合の \newgeometry

これは考えなくてもいいのではないかな,と思います.『日本語 LaTeX2e ブック』に \yoko, \tate の紹介がありますが,

pTeX レベルの拡張とは,組方向をボックス単位で変更できるようにしたことです.具体的には \tate と \yoko という 2 つのコマンドです.この 2 つのコマンドをボックス内で使うと,そのボックスの組方向が縦または横に変わります.

とあり,文書の途中で本文の組方向を変えるのは想定していないのではないでしょうか.

2014-12-31 20:58 Updated by: kmaeda
Comment

frame の出力が tate direction になっていたようです.4de35ca で直っていると思います.

確認しました.

lltjp-geometry.sty 中のコメントに書きましたが,landscape, truedimen がまだうまく動かないようです.

これは気付いていませんでした.クラスオプションで landscape にしたときは効いていたのですが…….

依然として

Package geometry Warning: Over-specification in h'-direction.

という警告が出ます.

これは気になってはいたのですが,よい方法が思い浮かばないので放置していました.対処できるならばした方がよいとは思います.

文書の途中で本文の組方向を変えるのは想定していないのではないでしょうか.

あまり深く考えずに書いていたのですが,実際に組むことを考えても確かに普通はそういう組み方はしなさそうですね. 右開きに \yoko を入れると,字送り方向とページ送り方向が合わなくなってしまいますから. ただ,PDF のようなデジタルデータで完結させる場合には,そういうことがあっても不思議ではないかも.

本の場合は,手元にちょうど,縦組に横組を入れている実例が2通りあります. 1つは右開きの表紙側からは普通に本文が縦組で組んであって,裏表紙側から左開きで付録が横組で組んであるものです. C. リード(彌永健一訳)「ヒルベルト」(岩波現代文庫)や,A. ストゥーブハウグ(熊原啓作訳)「数学者ソーフス・リー」(丸善出版)などがこれにあたります. もう一つは,縦組の本文の途中に横組が \utod で入っているものです. 野村保恵「本づくりの常識・非常識【第二版】」(印刷学会出版部)がこれで,「六章 組版ルール(横組)」がまるまる \utod になっています.

縦組メインのレイアウト中で \yoko な本文を入れる必要があるのは前者ですが,そもそもページの進み方がひっくり返ってしまうので, LaTeX で処理するにはどうすればよいのだろう,という感じです.

2014-12-31 21:39 Updated by: h7k
Comment

kmaeda への返信

lltjp-geometry.sty 中のコメントに書きましたが,landscape, truedimen がまだうまく動かないようです.

これは気付いていませんでした.クラスオプションで landscape にしたときは効いていたのですが…….

直しました.geometry の読み込み時に,既に landscape によって縦横がひっくり返ってしまうので,もう一回ひっくり返して打ち消すことにしました.

依然として

Package geometry Warning: Over-specification in h'-direction.

という警告が出ます.

これは気になってはいたのですが,よい方法が思い浮かばないので放置していました.対処できるならばした方がよいとは思います.

ざっくりしすぎですが,geometry ロード時だけ

  1. \let\PackageWarningNoLine\@gobbletwo
として,警告出力を抑止しました.

2014-12-31 22:28 Updated by: kmaeda
Comment

直しました.geometry の読み込み時に,既に landscape によって縦横がひっくり返ってしまうので,もう一回ひっくり返して打ち消すことにしました.

確認しました.

警告出力を抑止しました.

これだと横組のときに出るべき警告が出ないのではないかと思います. \AtBeginOfPackageFile{geometry} の時点で縦組かどうか判定してしまって, 縦組のときだけ抑止するようにしてはどうでしょうか.

2015-09-22 20:04 Updated by: h7k
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2015-09-22 20:04
Comment

ひとまず完了とします.不具合が出たら,またオープンしましょう.

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login