チケット #37458

lltjp-geometry と pTeX 横クラス

登録: 2017-08-25 00:58 最終更新: 2018-01-21 13:34

報告者:
担当者:
(未割り当て)
チケットの種類:
状況:
完了
コンポーネント:
(未割り当て)
マイルストーン:
(未割り当て)
優先度:
5 - 中
重要度:
5 - 中
解決法:
なし
ファイル:
なし

詳細

lltjp-geometry のドキュメントより

標準縦組クラスでは,\begin{document} の内部で組方向を縦組に変更するので,プリアンブル中で判定できない.

判定できるっぽいです。ascmac パッケージに最近入れたアレと類似のコードを使った例(最小化はしていない):

\documentclass{tarticle}
%\documentclass{jarticle}

\makeatletter
\begingroup
\def\xxxx@check#1{\ifx#1\@undefined\else\xxxx@parse{#1}\fi}
\def\xxxx@parse#1{\edef\reserved@a{\expandafter\@gobble\string #1}%
  \edef\xxxx@parse@tmp{\meaning#1 \string\tate}%
  \expandafter\xxxx@parse@i\xxxx@parse@tmp\@nil}
\expandafter\def\expandafter\xxxx@parse@i
  \expandafter#\expandafter1\string\tate#2\@nil{\ifx\relax#2\relax
  \typeout{YOKO CLASS}\else\typeout{TATE CLASS}\fi}
\xxxx@check{\@begindocumenthook}
\endgroup
\makeatother

\begin{document}
a
\end{document}

大概の日本語縦組クラスはアスキーに準じて \AtBeginDocument しているはずですし、もし遅延なしに \tate してあった場合はこれまた簡単ですね。仮に問題が起きるとすれば「\begin{document} より手前のどこかまで遅延する」とか「\document の定義を書き変えて \@begindocumenthook を使わない」とかなので(私は見たことない)、これで完全に判定可能とみなしてよいさそうに思っています。

チケットの履歴 (10 件中 3 件表示)

2017-08-25 00:58 更新者: aminophen
  • 新しいチケット "lltjp-geometry と pTeX 横クラス" が作成されました
2017-08-25 01:18 更新者: aminophen
コメント

判定間違いが起きる例には「横組クラスで,何かのパッケージが \tate を含むコードを \@begindocumenthook に遅延させた場合」があります(上のコードでは「\tate を含むかどうか」しかわからないので)。そのような事象がどの程度起きるのかは私には判断しかねます。

2017-08-29 16:38 更新者: zrbabbler
コメント

「横組クラスで,何かのパッケージが \tate を含むコードを \@begindocumenthook に遅延させた場合」が

普通に起こりそうな気がする。

判定基準を \tate \message とかにすれば誤判定は無くせそうだけど、結局それは「標準クラスに特化した判定」になりますよね。 だったら、単純にクラス名を調べたほうが素直な気がしますね。

2017-08-29 16:40 更新者: zrbabbler
コメント

ところで、実装を見る限りは

「LuaTeX-jaでは、クラス読込終了時に既に \tate が呼ばれている」

と仮定しているようですが、そう判断できる根拠は何なのでしょうか?

2017-08-29 16:40 更新者: zrbabbler
コメント

ところで、実装を見る限りは

「LuaTeX-jaでは、クラス読込終了時に既に \tate が呼ばれている」

と仮定しているようですが、そう判断できる根拠は何なのでしょうか?

2017-08-29 18:29 更新者: h7k
コメント

>「LuaTeX-jaでは、クラス読込終了時に既に \tate が呼ばれている」

単純に lltjp-geometry を書いたときには ltjt* クラスがそのようになっていたから,だけだと思います.

\DeclareOption{tate}{%
  \tate\AtBeginDocument{\message{《縦組モード》}\adjustbaseline}%
}


pLaTeX でクラス読込終了時のリストを

\documentclass{tarticle}
\tracingonline1
\showboxdepth10000
\showlists
\begin{document}
\end{document}
で調べると,
### yoko direction, vertical mode entered at line 0
### current page:
\write-{}
となっています. \tate\AtBeginDocument で発行されるわけですが,それが許される理由は「現在のリスト = recent contribution が空だから」で, 当時の私はこの点に違和感を持ったのでしょう(#33971 参照).

LuaTeX-ja に縦組を実装した当初は,tex.lists.page_head (= current page) が空の時にしかページの組方向は変えられないようにしていました. 今はなんだかよくわからないことになっています⛄

2017-08-29 18:42 更新者: aminophen
コメント

私がこの issue を立てた目的は,

「縦組用に書かれた lltjp-geometry パッケージを,横組専用なクラスで使うと,警告なしに変な出力になる」

という状況を改善したかったからでした。もしかすると

「\@begindocumenthook に \tate が登場しない場合」は明らかに横組クラスと考えて良さそうだから警告する

とか,何か改善の余地はないかというキッカケを作りたかっただけです。個人的には geometry パッケージは数ある \usepackage の中で,比較的最初の方で読み込まれやすい傾向にあると思っていて,その状況では \@begindocumenthook を簡易的にチェックするだけでも十分判定の精度が高そうだと考えられるかもしれません。

2017-08-29 19:16 更新者: aminophen
コメント

あと,別のアプローチとして

\kanjiencodingdefault の定義を見る

というのもいけるかもしれません。\normalfont はクラスファイル内で一旦実行されるので,この時点で JY{1,2,3} か JT{1,2,3} かでクラスファイルの判定がつく可能性は高いです。

2018-01-19 14:46 更新者: h7k
  • 詳細が更新されました
コメント

commit 175188f3 で lltjp-geometry.sty を更新しました. 以下のいずれかを満たした場合に,自動で「縦組クラス」と検出して有効化されるようにしています:

  • geometry パッケージ読み込み時の組方向が \tate(or 縦数式)
  • \@begindocumenthook の定義内にトークン \tate がある

また,自動判定を無視して強制的に有効化する force オプションと,強制的に無効化する disable オプションを作りました.ただ LuaTeX-ja にこれらを渡すには,

  1. \PassOptionsToPackage{disable}{lltjp-geometry}
  2. \documentclass[]{ltjtarticle}
  3. \usepackage{geometry}
のように \PassOptionsToPackage を使う必要があります.

2018-01-21 13:34 更新者: h7k
  • 状況オープン から 完了 に更新されました
コメント

20180121.0 を出しましたので,ひとまず完了とします.

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする