pTeX縦書きとdvips -E

pTeX縦書きとdvips -E

- KUROKI Yusuke の投稿
返信数: 8
\documentclass[30pt]{jsarticle}
\pagestyle{empty}
\begin{document}
\vbox{\tate あ{\gtfamily の}。}
\end{document}

というソースを,platex -> dvips -E と処理すると,出来上がった PS ファイルでは,
%%BoundingBox: 72 72 72 72
となってしまって,その後 \includegraphics などで読み込んだときに,
サイズが 0 だから処理できないといったエラーを頂戴することになります.

  • このあたりの振舞いは以前から知られていたのでしょうか?
  • うまい解決方法はありますでしょうか?

なお,ps2pdf がうまく動くならば,今の場合,ps2pdf で ano-tate.pdf を作り,
gswin32c -sDEVICE=bbox -dBATCH -dNOPAUSE ano-tate.pdf
を実行すれば,
%%BoundingBox: 91 603 116 666
が得られるので,この行を使って PS ファイル上の記述を差し替えれば,対処できます.
もちろん,PDF が作れるなら,PS ファイルを読み込む必要がないというのはごもっとも
です.あくまでも例です.
KUROKI Yusuke への返信

Re: pTeX縦書きとdvips -E

- Akira Kakuto の投稿
  • このあたりの振舞いは以前から知られていたのでしょうか?
  • うまい解決方法はありますでしょうか?
おそらく昔からあったバグのはずです。
以下のパッチで fix されるはずです。
TeX Live のソースと、W32TeX のバイナリは
できるだけはやく訂正致します。

--- source/texk/dvipsk/bbox.c Sun Oct 07 15:49:12 2012
+++ bbox.c Mon Aug 05 08:46:46 2013
@@ -346,8 +346,8 @@
 if (v - bcd->ury < lly) lly = v - bcd->ury;
 if (v - bcd->lly > ury) ury = v - bcd->lly;
 } else {
- if (h + bcd->ury < llx) llx = h + bcd->ury;
- if (h + bcd->lly > urx) urx = h + bcd->lly;
+ if (h + bcd->ury > urx) urx = h + bcd->ury;
+ if (h + bcd->lly < llx) llx = h + bcd->lly;
 if (v + bcd->llx < lly) lly = v + bcd->llx;
 if (v + bcd->urx > ury) ury = v + bcd->urx;
 }
 
Akira Kakuto への返信

Re: pTeX縦書きとdvips -E

- KUROKI Yusuke の投稿
角藤先生,バグ認定および修正をありがとうございます.

先ほどのソースを処理すると,PSファイルに,以下のように出力されるようになりました.
%%BoundingBox: 77 572 105 643

ですが,この PS ファイルを gs -sDEVICE=bbox すると,

GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Loading a TT font from C:/windows/Fonts/msgothic.ttc to emulate a CID font MS-Gothic ... Done.
Loading a TT font from C:/windows%%BoundingBox: 91 584 116 664
%%HiResBoundingBox: 91.691997 584.135982 115.643528 663.475831
/Fonts/msmincho.ttc to emulate a CID font MS-Mincho ... Done.

と出まして,結果が食い違ってしまっています.

ano-tate.ps を includegraphics すると,確かにバウンディングボックスがずれている
ように見えます(添付ファイルに示しました).
なにかこちらでミスを犯してますでしょうか?

\documentclass[dvipdfmx]{jsarticle}
\usepackage{graphicx}
\pagestyle{empty}
\begin{document}

\setlength{\fboxsep}{0pt}
日本語横書きPS: \fbox{\includegraphics[clip]{ano.ps}}
日本語縦書きPS: \fbox{\includegraphics[clip]{ano-tate.ps}}
\end{document}
添付 veryshort.png
KUROKI Yusuke への返信

Re: pTeX縦書きとdvips -E

- Akira Kakuto の投稿
gsview32 で BoundingBox を表示すると、むしろ
dvips -E の結果が正しくて gswin32c -sDEVICE=bbox の結果
がずれているように見えるのですが、
pdf にすると、確かにおっしゃる通りのようです。
わかるかどうか、もう少し調べて見ます。

Akira Kakuto への返信

Re: pTeX縦書きとdvips -E

- Akira Kakuto の投稿
> わかるかどうか、もう少し調べて見ます。
調べてみてわかったこと。
(1) dvips -E の結果のほうが正しい。
(2) gs の結果がおかしいのは、gs が縦書きにちゃんと対応していない
 からである。(丸 "。" の位置を見て下さい)。
 私が compile した Windows 用の Ghostscript で
 gswin32c -dWINKANJI -sDEVICE=bbox  foo.ps
 とすれば dvips -E の結果と、実際上一致する。
 gsview32 で見て、BoudingBox が正しくなるのも、-dWINKANJI
 オプションを使っていたからである。
(3) distiller で ps ---> pdf とすると、 dvips -E で作成した
 BoundingBox を持った eps だけが include して正しい pdf を
 与える。(丸"。"の位置も正しい)。
(4) 縦書き eps を include するという意味では、dvipdfmx も
 対応していないように見える。
 これが正しくできるのは、
 platex ---> dvips ---> distiller
 だけのようである。

Akira Kakuto への返信

Re: pTeX縦書きとdvips -E

- Akira Kakuto の投稿
 > (4) 縦書き eps を include するという意味では、dvipdfmx も > 対応していないように見える。

これは、内部から Ghostscript を呼ぶので、あたりまえのことでした。
よって、すべての原因は、Ghostscript の縦書き未対応という点に
あります。

Akira Kakuto への返信

Re: pTeX縦書きとdvips -E

- KUROKI Yusuke の投稿
深く調査くださいまして,感謝申し上げます.
公式Ghostscriptの縦書き未対応により,pTeX縦書きの結果を公式Ghostscript経由で
処理する限り,結果が正しく表示されないとのこと,了解しました.
句点の位置が異なるのとBoundingBoxがずれるのは非連動かと思っていたのですが,
浅はかでした.

よく調整された日本語TeX環境を解決方法としては,
角藤先生がコンパイルされたGhostscriptを-dWINKANJI付きで呼び出すことが容易な
ようにしておくことが大事ということですね.TeX Live上流とも調整してみます.
KUROKI Yusuke への返信

Re: pTeX縦書きとdvips -E

- Akira Kakuto の投稿
> 角藤先生がコンパイルされたGhostscriptを-dWINKANJI付き
> で呼び出すことが容易なようにしておくことが大事ということですね.

残念ながら、-dWINKANJI を pdf 作成に使用すると、bitmap に
なってしまうので、拡大するとギザギザになるでしょう。
縦書き PostScript から正しい pdf を作成できるのは、今の
ところ有償の distiller だけのようです。

Akira Kakuto への返信

Re: pTeX縦書きとdvips -E

- Akira Kakuto の投稿
また、稀に -dWINKANJI オプションを設定すると、crash する
ps や eps があるようです。
従って -dWINKANJI オプションは限定的に使用したほうが
良いと思います。