Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

出力に白紙ページが含まれる場合に挙動がおかしい #21

Closed
doraTeX opened this issue Jul 31, 2015 · 56 comments
Closed

Comments

@doraTeX
Copy link
Owner

doraTeX commented Jul 31, 2015

出力に白紙ページが含まれる場合,モードによって色々とおかしな挙動を示す。

特に,「速度優先モード かつ ビットマップ出力」の場合に,出力に白紙ページが含まれると,コンパイル後は二度と Command+T によるコンパイルが効かなくなってしまう。

@doraTeX
Copy link
Owner Author

doraTeX commented Jul 31, 2015

出力に白紙ページが含まれる場合,どの画像形式への出力の場合でも,元の用紙サイズを保持した白紙画像を出力する(余白付与はしない)ように修正。

@doraTeX doraTeX closed this as completed Jul 31, 2015
@aminophen
Copy link

うちの bcpdfcrop でもやっと応急処置したところでした。ありがとうございます。

@doraTeX
Copy link
Owner Author

doraTeX commented Jul 31, 2015

bcpdfcrop の \procinclude を参考にさせてもらいました😊

@aminophen
Copy link

bcpdfcrop では 0 0 0 0 な場合しかハンドルしていませんが、オリジナルの pdfcrop.pl は x 座標と y 座標をそれぞれ比較して、逆転がある場合を含めて対処していました。gs が返す座標が逆転したり 0 0 0 0 でない場合があり得るのか解らなかったので、手抜きです😅

@doraTeX
Copy link
Owner Author

doraTeX commented Jul 31, 2015

なるほど,本当はそのような場合への対処も必要ですね……。
ただ,TeXによる組版結果のPDFの gs -sDEVICE=bbox 結果がそんなものになる可能性はたぶんないだろうから,TeX2imgとしては現状の例外処理で実用上十分ではないかと思います。

@aminophen
Copy link

TeXによる組版結果のPDFの gs -sDEVICE=bbox 結果がそんなものになる可能性はたぶんないだろうから

私も同じことを考えていました。いまの例外処理で十分でしょう。

@aminophen
Copy link

EPS を経由する画像化の場合の挙動は問題ないでしょうか。eps(2)write を通る処理では白紙ページの扱いが気になりました。特に、epswrite のときに #18 対策で bbox を上書きしていた部分を確認したいと思います。

@doraTeX
Copy link
Owner Author

doraTeX commented Jul 31, 2015

特に、epswrite のときに #18 対策で bbox を上書きしていた部分を確認したいと思います。

図星でした。その場合に問題が生じていましたので解決しておきました。
現在の最新版を Ver. 1.9.6 beta 1 として置いておきます。よろしければテストをお願いします。

ちなみに,変換経路が複雑化してきて,新機能を加えるたびにどのようなパターンをテストすべきかを見落としやすくなってきましたので,備忘録としてテストすべき項目を列挙しておきます。

gsを通さない経路

  1. 速度優先モードでのビットマップ生成 (PDF →[pdfcrop類似処理でクロップ]→ PDF →[Quartz API でビットマップ化+余白付与]→ JPEG/PNG/GIF/TIFF/BMP)
  2. テキスト情報を残したPDF生成 (PDF →[pdfcrop類似処理でクロップ+余白付与]→ PDF)
  3. テキスト情報を残したSVG生成 (PDF →[pdfcrop類似処理でクロップ+余白付与]→ PDF →[mudraw]→ SVG)

gsを通す経路

  1. 画質優先モードでのビットマップ生成 (PDF →[gsでアウトライン化+クロップ]→ EPS →[epstopdf(gs)]→ PDF →[Quartz API でビットマップ化+余白付与]→ JPEG/PNG/GIF/TIFF/BMP)
  2. アウトライン化PDF生成 (PDF →[gsでアウトライン化+クロップ] → EPS →[epstopdf(gs)]→ PDF →[pdfcrop類似処理で余白付与]→ PDF)
  3. アウトライン化EPS生成 (PDF →[gsでアウトライン化+クロップ] → EPS →[BB情報を編集して余白付与] → EPS)

gsを通す経路については,そのそれぞれについて,

  1. gs<9.15 の epswrite デバイス,画質優先モード(-r20016 固定)
  2. gs<9.15 の epswrite デバイス,速度優先モード(-rの値は解像度レベル設定に従う)
  3. gs>=9.15 の eps2write デバイス,画質優先モード(-r20016 固定)
  4. gs>=9.15 の eps2write デバイス,速度優先モード(-rの値は解像度レベル設定に従う)

の4通りのテストが必要です。

@aminophen
Copy link

これからテストしますが、上記の「gs を通さない経路」の 1. 速度優先モードでのビットマップ生成は

PDF →[pdfcrop類似処理でクロップ+余白付与]→ PDF →[OS XのQuartz API]→ JPG/PNG/BMP/GIF/TIFF

だと思っていましたが、そうではなかったのでしたっけ…

@doraTeX
Copy link
Owner Author

doraTeX commented Jul 31, 2015

どちらでもなくて,

PDF →[pdfcrop類似処理でクロップ]→ PDF →[Quartz API でビットマップ化+余白付与]→ JPEG/PNG/GIF/TIFF/BMP

でした。上の書き込みも訂正しておきます。

@aminophen
Copy link

どちらでもなくて,

もはや把握できなくなってしまいました…😅 Windows 版と合わせて頭の中が混乱しそうですが、私の記事も今度直します…

@aminophen
Copy link

gs9.16 と gs9.05 で上の全ての場合をテストしました(つもりです)。真っ白な EPS をプレビューしようとすると、gs9.16 の eps2write で吐いた場合のみ「Preview.app の前処理 epstopdf (?) が Warning を吐いてプレビューが開かない」という現象が起きました。ほかは問題なさそうです。

gs916-epstopdf-error

@doraTeX
Copy link
Owner Author

doraTeX commented Jul 31, 2015

「Preview.app の前処理 epstopdf (?) が Warning を吐いてプレビューが開かない」という現象が起きました。

これはコマンドラインから呼び出しても同じですので,OS X の仕様ということで仕方なさそうです。

$ pstopdf hoge.eps
%%[ Warning: Empty job. No PDF file produced. ] %%

@aminophen
Copy link

OS X の仕様ということで仕方なさそうです。

ありがとうございます。ではこれで全て解決ですね。

@abenori
Copy link

abenori commented Jul 31, 2015

あんまりよくわかっていないのですが,空白ページにはpdfcropを通さないと言うことでしょうか?

@doraTeX
Copy link
Owner Author

doraTeX commented Jul 31, 2015

あんまりよくわかっていないのですが,空白ページにはpdfcropを通さないと言うことでしょうか?

はい,それで大丈夫なはずです。
とはいっても,PDFのページをバラで切り出すのも一苦労なので,bcpdfcrop.bat にならって,

\pdfoutput=1\pdfhorigin=0bp\relax\pdfvorigin=0bp\relax\setbox0=\hbox{\pdfximage page ページ番号 mediabox{ファイル名}\pdfrefximage\pdflastximage}\pdfpagewidth=\wd0\relax\pdfpageheight=\dimexpr\ht0+\dp0\relax\shipout\hbox{\raise\dp0\box0\relax}\end

のような pdfTeX ソースをコンパイルして切り出すようにしています。

@aminophen
Copy link

Windows 版の場合、空白ページが問題になるのは

だと思います(eps2write で空白ページを処理すると元の bbox が維持されるっぽいので大丈夫)。この2パターンに対して bbox = 0 0 0 0 への例外処理を加えれば良さそうです。

@abenori
Copy link

abenori commented Jul 31, 2015

ええと,「白紙ページが存在したらそのページはそのまま出力される」と言うことですよね.なんだかあまりこれを意図して使われるところが想像できないのですが……
エラーにした方がユーザの意図にあいませんか?

@aminophen
Copy link

エラーにした方がユーザの意図にあいませんか?

白紙ページを見つけたら単にそのページをスキップして、空白でないページだけ出力するということでしょうか。うーん、どちらがよいでしょう? 私の bcpdfcrop は複数ページ処理を単一ファイル出力と分割ファイル出力の両方に対応すべく、枚数を維持する方を優先しました。真っ白なページは要らないという考えも一理ありますね。

あと、bbox が 0 0 0 0 になる他の例としては「CropBox の内側は確かに真っ白だが、その外側でかつ MediaBox に入っている部分にはなんか物体があるとき」です。gs の bbox デバイスは CropBox の中しか検知しない一方、pdfTeX に mediabox を使わせるのでインクルードすればその外側が描画されて出てくるという現象が起きます。TeX2img で意図する人はいないでしょうが…

@abenori
Copy link

abenori commented Jul 31, 2015

白紙ページを見つけたら単にそのページをスキップして、空白でないページだけ出力するということでしょうか

そうではなく,「白紙ページがあったらユーザにその旨を伝える」というのが一番の意図です.(既にそうなっていたらすみません.)(基本的にはエラー扱いして何も出さなくてよいかなとも思っていますが.)意図して空白ページを生成するよりも,間違って白紙ページを作ってしまう方が遙かに多いだろうというわけです.

pdfcropの場合は白紙ページが入力に意図して含まれることも多いと思います.そもそもTeX2imgとは目的が異なるものですし……

@aminophen
Copy link

基本的にはエラー扱いして何も出さなくてよいかなとも思っていますが

それだと golden_lucky さんの牛耕式みたいなのが通らなくなってしまうなあと思います。意図していない空白ページが末尾にあって、でも対処法がよくわからないみたいなのは往々にしてあるかなと。

@abenori
Copy link

abenori commented Jul 31, 2015

繰り返しますが,「白紙ページがあったらユーザにその旨を伝える」のがどうかと言うことです.

@aminophen
Copy link

「白紙ページがあったらユーザにその旨を伝える」

そこまで必要性を感じていません。この場合は出力を見れば明らかなので敢えて言わなくても、と思います。考えるべきなのは、先ほど私が出した

白紙ページを見つけたら単にそのページをスキップして、空白でないページだけ出力する

と、Mac 版のような

空白ページはそのままページをはき出す

のどちらを採るか、かつそれらの場合にメッセージを出すべきかという最も自然な組み合わせですね。

@abenori
Copy link

abenori commented Jul 31, 2015

うーん,「勝手に空白ページはそのままページをはき出す」という仕様が「最も自然である」とはやはりまだ思えていません.

@abenori
Copy link

abenori commented Aug 1, 2015

自分で言い出しておいて何ですが,結構面倒ですね.あまり例外処理をしたくないのですが.

ところで,eps->画像の変換では,新しくepsを作りそれに古いepsを取り込ませているようですが,そうしている理由は何かあるのでしょうか?単にもともとのepsにGhostscriptをかますだけでは何か不都合がある?

@abenori
Copy link

abenori commented Aug 1, 2015

https://onedrive.live.com/redir?resid=4FABCB4EC4FA1E70!16825&authkey=!ANYoMX5Yq7PLXU4&ithint=folder%2cexe

上のを単にかますだけに変更したので,何か不具合があるかもしれません.
それと,別件ですがHiResBoundingBoxがあるときはそちらを優先して使うようにしました.

doraTeX added a commit that referenced this issue Aug 2, 2015
@doraTeX
Copy link
Owner Author

doraTeX commented Aug 2, 2015

Ver. 1.9.6 beta 6 を作りました。

ログウィンドウに表示するのはお願いします。

→ 対応しました。

  1. 出力ウィンドウ末尾にスキップしたページ番号情報が出る(複数のページがスキップされたら何行もメッセージが並ぶけど、わかりやすい) → これからですね。

複数ページがスキップされた場合は,最後にまとめて

TeX2img: [警告] 1, 3 ページ目が空白ページであったためスキップしました。

のように表示させるようにしました。

  • テキスト保持 PDF で余白0だとメッセージが出ませんでした。

→ 修正できたはずです。

  • アウトライン化 PDF で余白を10ずつにすると、PDF は出てくる一方で gs9.10 の epstopdf が凄いエラーを吐いていますが、大丈夫でしょうか。

→ epstopdf はゼロ幅のEPSを処理するとエラーを吐くようですので,ゼロ幅のページは epstopdf を経由しない別経路を通るように例外対応することで修正しました。

eps->画像の変換では,新しくepsを作りそれに古いepsを取り込ませているようですが,そうしている理由は何かあるのでしょうか?

どうでしたっけね……。Windows版を作ったのはかなり昔だったので記憶にありません……。(現在のMac版ではその変換法は用いておりません。)
直接Ghostscriptにかけて問題なさそうならそれでよいと思います。

それと,別件ですがHiResBoundingBoxがあるときはそちらを優先して使うようにしました.

Mac版では,HiResBoundingBox を用いて EPS からビットマップ画像に変換すると,小数点以下の値を持つ BoundingBox から整数値の縦横ピクセル幅を持つビットマップ画像に変換する際に,丸め誤差で BoundingBox の端の方が切り捨てられる現象が見られました。
非HiResBoundingBoxの方は,HiResBoundingBox を内包する整数値のBoundingBoxがとられていますので,変換しても端が欠けることがありません。
非HiResBoundingBoxを使うことで,「余白量がゼロ設定の場合でも厳密にタイトではない画像」が生成されますが,端が切れるよりはましだと思って,非HiResの方を採用しています。

@abenori
Copy link

abenori commented Aug 2, 2015

どうでしたっけね……。Windows版を作ったのはかなり昔だったので記憶にありません……。

ありがちですね(笑)とりあえず問題なさそうなので変更してみます.

Mac版では,HiResBoundingBox を用いて EPS からビットマップ画像に変換すると,小数点以下の値を持つ BoundingBox から整数値の縦横ピクセル幅を持つビットマップ画像に変換する際に,丸め誤差で BoundingBox の端の方が切り捨てられる現象が見られました。

なるほど,とりあえずBoundingBoxを使うように戻しました.(PDFに変換するときは大丈夫ですかね?)

@aminophen
Copy link

丸一日外出していたので、テストが遅くなりました…すみません。

Mac 版 Beta 1.9.6 beta6 で、「余白をつけたビットマップ画像」が画質優先・速度優先ともに「スキップするのにメッセージを出さない」状態になっていることが分かりました。意図しているのは「スキップせず余白の分のキャンバスを持つビットマップ画像を出す」だと思います。他は動いているようです。

例外処理、スキームが多いと難しいですね…

@doraTeX
Copy link
Owner Author

doraTeX commented Aug 3, 2015

Mac 版 Beta 1.9.6 beta6 で、「余白をつけたビットマップ画像」が画質優先・速度優先ともに「スキップするのにメッセージを出さない」状態になっていることが分かりました。意図しているのは「スキップせず余白の分のキャンバスを持つビットマップ画像を出す」だと思います。

テストありがとうございます。Ver. 1.9.6 beta 7 で修正できたはずです。

@aminophen
Copy link

Windows 版、ようやくテストしました。遅くなって申し訳ありません。

  • 余白付きの白紙がスキップされる問題はほぼ解消したようです。「空でした」と言いながら出力するわけですね。一つだけ「ビットマップ出力で、かつ px 単位の余白が小さい場合」に画像が出てこないようです(たとえば上下左右 5px だと出てきませんが、100px だと出てきます。桁落ちしているのでしょうか)。

あとは大丈夫そうです。でも上に書いたのもそんなに問題ない気がします…

@abenori
Copy link

abenori commented Aug 3, 2015

余白付きの白紙がスキップされる問題はほぼ解消したようです。「空でした」と言いながら出力するわけですね。

あくまで「白紙ページはミスだろう」と思っての警告です.

一つだけ「ビットマップ出力で、かつ px 単位の余白が小さい場合」に画像が出てこないようです(たとえば上下左右 5px だと出てきませんが、100px だと出てきます。桁落ちしているのでしょうか)。

あーそうですね.epsのマージンを増やすときにいったん解像度レベルで割っているので,5/6 = 0となっているんだと思います.ページが空とか関係なく問題になる気がしますね.極力分岐を起こさないようにしたのが失敗しました.少し考えてみます.

@aminophen
Copy link

あくまで「白紙ページはミスだろう」と思っての警告です.

白紙だったら心配されかねないので、警告があるとありがたいでしょうね。

epsのマージンを増やすときにいったん解像度レベルで割っているので

やはりそこでしたか。余白のつき方が白紙かどうかにかかわらず本来と違うことになるのはそのとおりですね。

@abenori
Copy link

abenori commented Aug 3, 2015

うーん,上で書いたEPS→IMGの処理方式の変更が早速裏目に出たようです.(とはいえ問題自身は前々からあったように思われますが.)translateは多分整数じゃなくても大丈夫ですよね?仕方ないので戻します.(がやらなきゃならないのにやっていないことがあるのを思い出したのでそれが終わってからで…….)

@aminophen
Copy link

テストありがとうございます。Ver. 1.9.6 beta 7 で修正できたはずです。

Mac 版 Ver. 1.9.6 beta 7 では画像変換およびメッセージはすべて意図したとおりになっているように思います。空白ページの扱いがキャンバスが0の場合も余白付きの場合も、ビットマップでもベクターでも、画質優先でも速度優先でも、テキスト保持でもアウトライン化でも正常のようです。ありがとうございます。

@doraTeX
Copy link
Owner Author

doraTeX commented Aug 4, 2015

Windows版のように,「白紙ページに余白付与した結果白い画像が生成された」場合にその警告を出すようにもしてみようと思います。今しばらくお待ちください。

@doraTeX
Copy link
Owner Author

doraTeX commented Aug 4, 2015

#16 とあわせて,Ver. 1.9.6 beta 8 で,「白紙ページに余白付与した結果白い画像が生成された場合に警告を表示」する機能を付けました。

@aminophen
Copy link

Mac 版 Ver. 1.9.6 beta 8 を試しました。

「白紙ページに余白付与した結果白い画像が生成された場合に警告を表示」する機能を付けました。

警告が出るようになったのを確認しました。問題ないと思います。

@doraTeX
Copy link
Owner Author

doraTeX commented Aug 4, 2015

どちらでもなくて,

もはや把握できなくなってしまいました…😅 Windows 版と合わせて頭の中が混乱しそうですが、私の記事も今度直します…

今改めて確認しました。TeX2img (Windows/Mac) の動作の詳細(改訂版)

【JPG/PNG/BMP/GIF/TIFF 出力(速度優先モード)の場合】

TeX →…→ PDF →[pdfcrop類似処理でクロップ+余白付与]→
PDF →[OS XのQuartz API]→ JPG/PNG/BMP/GIF/TIFF

は,正しくは

TeX →…→ PDF →[pdfcrop類似処理でクロップ]→
PDF →[OS XのQuartz API+余白付与]→ JPG/PNG/BMP/GIF/TIFF

となります。(PDF→PDF の変換においては,px 単位の余白付与ができないからです。)

@aminophen
Copy link

今改めて確認しました。TeX2img (Windows/Mac) の動作の詳細(改訂版)

ありがとうございます。記事を修正しました。

@abenori
Copy link

abenori commented Aug 4, 2015

https://onedrive.live.com/redir?resid=4FABCB4EC4FA1E70!16825&authkey=!ANYoMX5Yq7PLXU4&ithint=folder%2cexe

eps --> jpg等を元に戻して,更にtranslateに整数に切らない値を与えることにしました.PostScript全然知らないのでいいのかわかりませんが……とりあえず動いているっぽいです.

TeX →…→ PDF →[gs (eps(2)write)でアウトライン化+クロップ]→ EPS →[BB情報を編集して余白付与]→[gs (jpeg/pngalpha/bmp16m)]→ JPG/PNG/BMP

も厳密にはかつある意味では嘘ですね.しかし細かいことはうるさい気もするのでまぁいいか…….

これは考慮すべきパターンが非常に多くて大変でした

実はこっちは(結果的には)あまり手を加えていません.例外処理もあまり無し.API呼び出しによる複雑さ故でしょうか.

@aminophen
Copy link

Windows 版を試しました。

eps --> jpg等を元に戻して,更にtranslateに整数に切らない値を与えることにしました.

大丈夫そうです。ひとつだけ、Windows 版は生成画像のうち最初の一枚をプレビューする仕様ですが、1ページ目がスキップされた場合に欠番となった equation-1 がプレビューされうることに気づきました(前回の TeX2img 処理で当該ファイルが生成していた場合など)。画像が全てスキップされた場合はプレビューしないので大丈夫そうですが、「同じディレクトリにある“数字がいちばん小さいファイル”をプレビュー」になっているような気がして若干気になりました。

実はこっちは(結果的には)あまり手を加えていません.例外処理もあまり無し.API呼び出しによる複雑さ故でしょうか.

確かに Mac 版は「画質優先モード」と「速度優先モード」で gs を使ったり OS X の API を使ったりしているので、複雑になった感じはありますね。

@abenori
Copy link

abenori commented Aug 5, 2015

「同じディレクトリにある“数字がいちばん小さいファイル”をプレビュー」になっているような気がして若干気になりました。

別のプログラムが生成している可能性を忘れていました.生成された一番最初のファイルをプレビューするようにしました.(前々から)複数ページの場合はどれをプレビューするべきかは悩んでいます.

https://onedrive.live.com/redir?resid=4FABCB4EC4FA1E70!16825&authkey=!ANYoMX5Yq7PLXU4&ithint=folder%2cexe

@aminophen
Copy link

生成された一番最初のファイルをプレビューするようにしました.

Windows 版、確認しました。ありがとうございます。

(前々から)複数ページの場合はどれをプレビューするべきかは悩んでいます.

Mac 版は「生成した画像全て」をプレビューするようになっていますが、これは合わせても合わせなくても良いと思っていました。

別件ですが、#23 で「CUI 版の「ソース埋め込み」をデフォルトで OFF にしよう」という話が出ていますが、いかがでしょう。Windows 版は GUI の設定を引き継ぐわけですが、プレビューオプションと同様に GUI の設定を無視する形となると思いますが。

@abenori
Copy link

abenori commented Aug 5, 2015

Mac 版は「生成した画像全て」をプレビューするようになっていますが、これは合わせても合わせなくても良いと思っていました。

あ,そうなのですね.どっちが便利ですかねぇ.まぁとりあえず今のままでよいか…….

別件ですが、#23 で「CUI 版の「ソース埋め込み」をデフォルトで OFF にしよう」という話が出ていますが、いかがでしょう。

これはあっちに書いた方がよいですね.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants