pTeX における文章中での組方向の変更

pTeX における文章中での組方向の変更

- 北川 弘典 の投稿
返信数: 8
TeX Live 2014 の pTeX で次のソースを走らせてみたところ,
エラー無しに dvi が生成されました.
----
%#!ptex


\tate
\tentmin % 縦組用フォント

\end
----

文章中で組方向を変えていることになるので,私は
「! Use `\tate' at top of list.」というエラーが起きるのが
自然だと思っています.この挙動は意図的なのでしょうか?
北川 弘典 への返信

Re: pTeX における文章中での組方向の変更

- 若 雲 の投稿
空行(段落)を挟まずに

%#!ptex
あ\tate\tentmin い
\end

とすると、「! Use `\tate' at top of list.」というエラーが出ました。
若 雲 への返信

Re: pTeX における文章中での組方向の変更

- Akira Kakuto の投稿
\par の直後では head=tail になるのですか?
Akira Kakuto への返信

Re: pTeX における文章中での組方向の変更

- 北川 弘典 の投稿
\par の直後というより,nest_ptr=0 の状況が変です.
全体を \vbox で囲んだ

\vbox{あ\par\tate}\end

では "! Use `\tate' at top of list" エラーが発生します.
\tate の前に \showlists を実行すると確かに

### yoko direction, internal vertical mode entered at line 1
\hbox(7.77588+1.38855)x469.75499, glue set 440.13283fil
.\hbox(0.0+0.0)x20.0
.\tenmin あ
.\penalty 10000
.\glue(\parfillskip) 0.0 plus 1.0fil
.\glue(\rightskip) 0.0
prevdepth 1.38855, prevgraf 1 line
### yoko direction, vertical mode entered at line 0
prevdepth ignored

となり,カレントリストは空でないからです.

tex.web を読んでみたところ

When \TeX\ has appended new material in vertical mode, it calls the procedure
|build_page|, which tries to catch up by moving nodes from the contribution
list to the current page. This procedure will succeed in its goal of
emptying the contribution list, ...

とあり,(internal でない) vertical mode 時の head .. tail という
リストが上記の contribution list のようです.
そのため,vertical mode における普通(?)の場合には
head = tail になるのではないか,と思います.
北川 弘典 への返信

Re: pTeX における文章中での組方向の変更

- 前田 一貴 の投稿
蛇足な気もしますが,自分でもやってみました.

あ\showlists\par\tate\tentmin い\end

だと

### yoko direction, horizontal mode entered at line 1
\hbox(0.0+0.0)x20.0
\tenmin あ
spacefactor 1000
### yoko direction, vertical mode entered at line 0
prevdepth ignored


あ\par\showlists\tate\tentmin い\end

だと

### yoko direction, vertical mode entered at line 0
### current page:
\glue(\topskip) 2.22412
\hbox(7.77588+1.38855)x469.75499, glue set 440.13283fil
.\hbox(0.0+0.0)x20.0
.\tenmin あ
.\penalty 10000
.\glue(\parfillskip) 0.0 plus 1.0fil
.\glue(\rightskip) 0.0
total height 10.0
goal height 643.20255
prevdepth 1.38855, prevgraf 1 line


あ\par\tate\showlists\tentmin い\end

だと

### tate direction, vertical mode entered at line 0
### current page:
\glue(\topskip) 2.22412
\hbox(7.77588+1.38855)x469.75499, glue set 440.13283fil
.\hbox(0.0+0.0)x20.0
.\tenmin あ
.\penalty 10000
.\glue(\parfillskip) 0.0 plus 1.0fil
.\glue(\rightskip) 0.0
total height 10.0
goal height 643.20255
prevdepth 1.38855, prevgraf 1 line


あ\par\tate\tentmin い\showlists\end

だと

### tate direction, horizontal mode entered at line 1
\hbox(0.0+0.0)x20.0
\tentmin い
spacefactor 1000
### tate direction, vertical mode entered at line 0
### current page:
\glue(\topskip) 2.22412
\hbox(7.77588+1.38855)x469.75499, glue set 440.13283fil
.\hbox(0.0+0.0)x20.0
.\tenmin あ
.\penalty 10000
.\glue(\parfillskip) 0.0 plus 1.0fil
.\glue(\rightskip) 0.0
\glue(\parskip) 0.0 plus 1.0
total height 11.38855 plus 1.0
goal height 643.20255
prevdepth 1.38855


nest_ptr=0 のときは \par が来るたびに current list の中身を current page に放り込んで空にしてしまうので,

any_mode(chg_dir):
  begin  if cur_group<>align_group then
    if head=tail then
      begin direction:=cur_chr;
      if mode=vmode then page_dir:=cur_chr;
      end
    else begin print_err("Use `"); print_cmd_chr(cur_cmd,cur_chr);
      print("' at top of list");
      help2("Direction change command is available only while")
      ("current list is null."); error;
      end
  else ...

の if head=tail の判定だけだと不十分で,current page の中身も見ないと自然な挙動にはならない,ということでしょうか.
前田 一貴 への返信

Re: pTeX における文章中での組方向の変更

- 北川 弘典 の投稿
> nest_ptr=0 のときは \par が来るたびに current list の中身を
> current page に放り込んで空にしてしまうので,
(略)
> の if head=tail の判定だけだと不十分で,current page の
> 中身も見ないと自然な挙動にはならない,ということでしょうか.

あまり詳しく調査できていませんが,そうではないかと思っています.


なお,現行の tarticle.cls に

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

と \showlists を追加し,

\showboxdepth10000\showboxbreadth1000
\documentclass{tarticle}
\begin{document}
\end{document}

をタイプセットすると,

### yoko direction, vertical mode entered at line 0
### current page:
\write-{}

と出力され,\tate 実行時には current page は非空であることが
わかります.そのため,もし nest_ptr=0 の場合の判定を
厳しくしようとすれば,tarticle.cls 等も変更する必要が出てきます.
若 雲 への返信

Re: pTeX における文章中での組方向の変更

- 北川 弘典 の投稿
> 空行(段落)を挟まずに
> (略)
> とすると、「! Use `\tate' at top of list.」というエラーが出ました。

これは仕様通りの,ごく自然な挙動だと思います.

\tracingonline2\showboxbreadth100\showboxdepth100
あ\showlists\tate
\end

として,\tate 実行直前のリストを表示させると

### yoko direction, horizontal mode entered at line 2
\hbox(0.0+0.0)x20.0
\tenmin あ
spacefactor 1000
### yoko direction, vertical mode entered at line 0
prevdepth ignored

となり,確かに現在のリスト (horizontal mode ...) は
空ではありませんから.
北川 弘典 への返信

Re: pTeX における文章中での組方向の変更

- 匿 名 の投稿
私のところはすごく古いpTeX(Win32TeX)なのですが、
同じようにエラー無くdviファイルができあがってしまいました。
dvioutで見てみると、A4横用紙を縦書きで使った感じで、右上のほうに「い」が、
その一つ右に、「右に寝た「あ」」があります。
ノンブルは紙面左の中央に、「右に寝た「1」」があります。

\end の直前で \showlists して、続けて \tracingoutput もさせたときのlogファイルは次のようになりました。

ご報告まで。

This is pTeX, Version p2.1.11, based on TeX, Version 3.14159 (SJIS) (Web2C 7.3.3) (format=ptex 2001.5.23) 30 JUN 2014 20:44
**ptextest.tex
(./ptextest.tex

### tate direction, horizontal mode entered at line 5
\hbox(0.0+0.0)x20.0
\tentmin い
spacefactor 1000
### tate direction, vertical mode entered at line 0
### current page:
\glue(\topskip) 2.22412
\hbox(7.77588+1.38855)x469.75499, glue set 440.13283fil
.\hbox(0.0+0.0)x20.0
.\tenmin あ
.\penalty 10000
.\glue(\parfillskip) 0.0 plus 1.0fil
.\glue(\rightskip) 0.0
\glue(\parskip) 0.0 plus 1.0
total height 11.38855 plus 1.0
goal height 643.20255
prevdepth 1.38855


! OK.
l.9 \showlists

?

Completed box being shipped out [1]
\vbox(667.20255+0.0)x469.75499, tate direction
.\vbox(0.0+0.0)x469.75499, glue set 14.0fil, tate direction
..\glue -22.5
..\hbox(8.5+0.0)x469.75499, glue set 469.75499fil, tate direction
...\vbox(8.5+0.0)x0.0, tate direction
...\glue 0.0 plus 1.0fil
..\glue 0.0 plus 1.0fil minus 1.0fil
.\vbox(643.20255+0.0)x469.75499, glue set 616.62033fill, tate direction
..\glue(\topskip) 2.22412
..\hbox(7.77588+1.38855)x469.75499, glue set 440.13283fil
...\hbox(0.0+0.0)x20.0
...\tenmin あ
...\penalty 10000
...\glue(\parfillskip) 0.0 plus 1.0fil
...\glue(\rightskip) 0.0
..\glue(\parskip) 0.0 plus 1.0
..\glue(\baselineskip) 6.02924
..\hbox(4.58221+4.58221)x469.75499, glue set 440.13283fil
...\hbox(0.0+0.0)x20.0
...\tentmin い
...\penalty 10000
...\glue(\parfillskip) 0.0 plus 1.0fil
...\glue(\rightskip) 0.0
..\hbox(0.0+0.0)x469.75499
..\glue 0.0 plus 1.0fill
.\glue(\baselineskip) 17.55556
.\hbox(6.44444+0.0)x469.75499, glue set 232.37749fil, tate direction
..\glue 0.0 plus 1.0fil minus 1.0fil
..\tenrm 1
..\glue 0.0 plus 1.0fil minus 1.0fil

)
Output written on ptextest.dvi (1 page, 320 bytes).
匿 名 への返信

Re: pTeX における文章中での組方向の変更

- Akira Kakuto の投稿
> dvioutで見てみると、A4横用紙を縦書きで使った感じで、
> 右上のほうに「い」が、
> その一つ右に、「右に寝た「あ」」があります。

この点は現在も同じだと思います:

%#!ptex
あいうえお

\tate
\tentmin % 縦組用フォント
かきくけこ

\yoko
\tenmin
さしすせそ

\tate
\tentmin % 縦組用フォント
たちつてと

\yoko
\tenmin
なにぬねの
\end