チケット #33971

グルーピングと組方向

登録: 2014-06-24 16:33 最終更新: 2014-07-10 09:49

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

詳細

少なくとも commit f97d8da において,

%#!luatex
\input luatexja.sty
\def\R{%
  \ifydir Y\fi\iftdir T\fi\ifddir D\fi
}
\hbox{\tate{\dtou\R1}\R2}\end
を実行すると,「D1T2」という出力が得られます. 本来は pTeX のように「D1D2」のようになるのが自然なはずです.

「現在のリストの組方向」が count register で管理されているという 現在の実装が原因なのは明らかなので,別の方法をなにか考えてみます(再設計するかも).

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

2014-06-24 16:33 更新者: h7k
  • 新しいチケット "グルーピングと組方向" が作成されました
2014-06-29 14:01 更新者: kmaeda
コメント

色々テスト中だとは思うのですが,2f800c3 では LuaLaTeX がうまく動かなくなっています.

\documentclass{ltjarticle}
\begin{document}
\end{document}
...
(/home/kmaeda/texmf/tex/luatex/luatexja/src/ltjsize10.clo3	tate	nil
3	tate	nil
)
(/home/kmaeda/texmf/tex/luatex/luatexja/src/jfm-min.lua)error: ...e/kmaeda/texmf/tex/luatex/luatexja/src/ltj-direction.lua:495: attempt to index field '?' (a nil value)
.
<to be read again> 
\ltj@@reset@badness 
l.805   \onecolumn
                
? 
となります.一方
\documentclass{article}
\usepackage{luatexja}
\begin{document}
\end{document}
だと
...
(/home/kmaeda/texmf/tex/luatex/luatexja/src/ltj-base.sty)
! Package luatexja Error: Use `\yoko' at top of list.

See the luatexja package documentation for explanation.
Type  H <return>  for immediate help.
\yoko ....direction.set_list_direction(4, 'yoko')}
                                                  
l.544 \yoko
         
? 
と出ます.

2014-06-29 14:25 更新者: h7k
コメント

kmaeda への返信

色々テスト中だとは思うのですが,2f800c3 では LuaLaTeX がうまく動かなくなっています. {{{ \documentclass{ltjarticle} \begin{document} \end{document} }}}

こっちは 69ea4d0 で直ったと思います.

一方 {{{ \documentclass{article} \usepackage{luatexja} \begin{document} \end{document} }}}

こっちはまだです.

2014-06-29 16:00 更新者: h7k
コメント

kmaeda への返信

一方

\documentclass{article}
\usepackage{luatexja}
\begin{document}
\end{document}
だと
...
(/home/kmaeda/texmf/tex/luatex/luatexja/src/ltj-base.sty)
! Package luatexja Error: Use `\yoko' at top of list.

See the luatexja package documentation for explanation.
Type  H <return>  for immediate help.
\yoko ....direction.set_list_direction(4, 'yoko')}
                                                  
l.544 \yoko
         
? 
と出ます.

article.cls の内部で実行される \clearpage の定義を見ると

\def\clearpage{%
  \ifvmode
    \ifnum \@dbltopnum =\m@ne
      \ifdim \pagetotal <\topskip
        \hbox{}%
      \fi
    \fi
  \fi
  \newpage
  \write\m@ne{}%
  \vbox{}%
  \penalty -\@Mi
}
となっています.\write があるおかげで article.cls 読み込み終了時の「ページの中身」tex.lists.page_head は空ではなく,それによって Use `\yoko' at top of list. というエラーが発生した,というわけです.

0557243 で直ったと思います.

2014-06-29 16:09 更新者: kmaeda
コメント

ありがとうございます.今度は

\documentclass{article}
\usepackage{luatexja}
\begin{document}
あ
\end{document}
...
(I search kanjifont definition file) ABD: EverySelectfont initializing macroserror: ...e/kmaeda/texmf/tex/luatex/luatexja/src/ltj-direction.lua:590: attempt to perform arithmetic on a nil value
.
<to be read again> 
\ltj@@reset@badness 
l.5 \end{document}
                
? 
となります. また,
\documentclass{ltjarticle}
\begin{document}
あ
\end{document}
...
[1{/usr/local/texlive/2014/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
! Extra \fi.
<output> ...w \if@fcolmade \fi {\@opcol \@startcolumn }\fi 
                                                  \ifnum \outputpenalty >-\@...
l.4 \end{document}
                
? 
となって,
\documentclass{ltjtarticle}
\begin{document}
\end{document}
...
(I search kanjifont definition file) ABD: EverySelectfont initializing macros
! Package luatexja Error: Use `\tate' at top of list.

See the luatexja package documentation for explanation.
Type  H <return>  for immediate help.
\tate ....direction.set_list_direction(3, 'tate')}
                                                  
l.2 \begin{document}
                  
? 
となります.

2014-06-29 16:49 更新者: h7k
コメント

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

kmaeda への返信

ありがとうございます.今度は

\documentclass{article}
\usepackage{luatexja}
\begin{document}
あ
\end{document}
attempt to perform arithmetic on a nil value

かわりに,次の ! Extra \fi が出ました.

また,

\documentclass{ltjarticle}
\begin{document}
あ
\end{document}
! Extra \fi.

前から確認しています.\ifydir 等の定義が

\protected\def\ifydir{\directlua{luatexja.direction.dir_conditional(4)}}
  % この中で tex.sprint('\\iftrue') している
となっていることによるものだと思います.TeX by Topic などを読んで調べてみます.

となって,

\documentclass{ltjtarticle}
\begin{document}
\end{document}
...
(I search kanjifont definition file) ABD: EverySelectfont initializing macros
! Package luatexja Error: Use `\tate' at top of list.

See the luatexja package documentation for explanation.
Type  H <return>  for immediate help.
\tate ....direction.set_list_direction(3, 'tate')}
                                                  
l.2 \begin{document}
                  
? 
となります.

さっきコメントした \clearpage 関連によるもので, \AtBeginDocument で組方向を設定するのは遅すぎることによります.


どうも,pTeX では,トップレベルでの組方向切り替えについてバグがあるようです. 次のソースがエラーを出さずに通ってしまいます.

%#!platex
\documentclass{jsarticle}
\begin{document}
あ

\tate

あいう
\end{document}
(後で TeX forum に投げてみます)

2014-06-29 21:37 更新者: h7k
コメント

Extra \fi

見事に「if-トークンの罠」に陥ってしまったようです (ZR さんの「本当は怖い if-トークンの話 (1), (2)」).うーむ,どうしよう.

2014-06-29 22:05 更新者: kmaeda
コメント

こういうことでしょうか.

\input luatexja.sty
\iftrue\ifydir\fi\fi          % OK
\iffalse\ifydir\fi\fi         % NG
\bye
\ifydir はエンドユーザも使いそうなものなので,ちょっとまずいですね. luatexja.direction.set_list_direction() の最後のあたりで \ifydir などに \iftrue や \iffalse を \let してしまうのがいいのかな.

2014-06-29 22:29 更新者: h7k
コメント

kmaeda への返信

こういうことでしょうか. {{{ \input luatexja.sty \iftrue\ifydir\fi\fi % OK \iffalse\ifydir\fi\fi % NG \bye }}} \ifydir はエンドユーザも使いそうなものなので,ちょっとまずいですね. luatexja.direction.set_list_direction() の最後のあたりで \ifydir などに \iftrue や \iffalse を \let してしまうのがいいのかな.

例えば

\hbox{\tate %
  \hbox{\yoko {\dtou (A)} (B) } (C)
}
というコードにおいて,(A), (B) では \ifddir が真,(C) では \ifydir が真,となる必要があります. \yoko, \tate, \dtou で \ifydir 等に \let してしまうのはこの仕様を満たすためには無理か……と思っていましたが,

  • \yoko, \tate, \dtou における \let による代入は \global にする
  • 但し,\aftergroup を使ってボックス,\vadjust, \insert を抜けたら「外側のリスト」での状況を \global\let して戻す

という案が浮かんだので,ちょっと確かめてみます.

なお,同様の困った状況は \ifybox<number> についても当てはまります.

2014-07-10 09:49 更新者: h7k
  • 解決法なし から リマインド に更新されました
  • 状況オープン から 完了 に更新されました
  • チケット完了時刻2014-07-10 09:49 に更新されました
コメント

#33986 のコメントに書きましたが,\ifydir, \iftdir, \ifddir を無理矢理実装するのは危なそうな気がするので, 今はやめておきます(完了にします).

「チケットの詳細」と同じ働きをするソースは次のようになります.

%#!luatex
\input luatexja.sty
\def\R{%
  \ifcase\ltjgetparameter{direction}\or D\or\or T\or Y\fi
}
\hbox{\tate{\dtou\R1}\R2}\end

添付ファイルリスト

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

編集

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