doraTeX / TeX2img

TeX2img for macOS
https://tex2img.tech
Other
26 stars 2 forks source link

出力画像ファイルにソースコードを埋め込む #7

Closed doraTeX closed 9 years ago

doraTeX commented 9 years ago

LaTeXiT に対抗して,出力画像ファイルにソース情報を埋め込み,画像ファイルからソースを復元できるようにしたい。

実現方法

doraTeX commented 9 years ago

d0cd7834c5489de53ffe34aee4e240f091152398 で実装。

abenori commented 9 years ago

(WindowsのEAがどんなものかよく知らないので後で調べるとして……) 他のOSに持って行っても変なことにはならないんでしょうか?

aminophen commented 9 years ago

うわ、実装されてしまったのですね!驚愕の早さ。

確か LaTeXiT は「ソースを埋め込むかどうか」を UI で指定できたように思えます。埋め込むとファイルサイズが確実に大きくなってしまいますので、選択できるように。

doraTeX commented 9 years ago

他のOSに持って行っても変なことにはならないんでしょうか?

FAT32やNTFSなどのファイルシステムにコピーすると,AppleDoubleの仕組みによって,

hoge.jpg ._hoge.jpg

のように2つのファイルに分裂します。._hoge.jpg の側にEAが保存されていますが,これは捨てても問題なく,hoge.jpg のみで通常のjpgファイルとして成立しますので大丈夫です。

doraTeX commented 9 years ago

埋め込むとファイルサイズが確実に大きくなってしまいますので、選択できるように。

LaTeXiTでは確かPDFのコメント部にソースが埋め込まれていたと思います。その方法だとファイルサイズが増えますが,こちらはEAを使っているので,データフォークのサイズ(Finderやlsコマンドなどで見たときのファイルサイズ)は増えません。そのため,EAを参照しない通常のプログラムでファイルを読み込むのにかかる時間などは変わりません。ですから,EAを付与するのをためらう必要性は特にないのではないでしょうか。

※補足:MacのファイルシステムHFS+は,1つのファイルに対し,

という2種類の情報を保持しています。今回,拡張属性の側にソースを書き込むことで,そのファイル内容(データフォーク)はいじらず,PDFやJPEGといったファイルのフォーマットを崩すことなくソースコードの情報を保持させるようにしました。

他のファイルシステムにコピーしたり,zip圧縮したりすると,拡張属性は ._hoge.jpg のような別ファイルとして分離して保管されます(AppleDouble)。これらの組を再びHFS+上にコピーしたりzip展開したりすると,HFS+の拡張属性として格納されます(AppleSingle)。他OS側で ._hoge.jpg が削除されても,補足的な情報が欠けるだけで,ファイル本体(データフォーク)には影響せずデータが壊れないという点がメリットです。

aminophen commented 9 years ago

LaTeXiTでは確かPDFのコメント部にソースが埋め込まれていたと思います。その方法だとファイルサイズが増えますが,こちらはEAを使っているので,データフォークのサイズ(Finderやlsコマンドなどで見たときのファイルサイズ)は増えません。

リソースフォークに書き込むとそういうメリットがあるのですね。詳細はよくわからないのですが

doraTeX commented 9 years ago
  • 仮に Mac/Win 両方で実装された場合、Mac 版で出力した画像をWindows に持って行った場合、リソースフォークを残してさえいれば Windows 版でまたソースを読み込める(あるいはその逆のようなことも)ということができるのでしょうか?

Macの閉じたデータ形式ですので,WindowsでMacの拡張属性を読むというのは望み薄だと思います。仮にWindows版で実装されても,NTFSの拡張属性を利用することになることでしょうから,そちらはそちらで閉じた形になるでしょう。それぞれのOSで閉じた形になるでしょうね。

  • 複数ページ画像を出力する場合は、一つ一つのファイルに全体のソースが記録されるのですよね?

はい,そのように実装いたしました。

aminophen commented 9 years ago

WindowsでMacの拡張属性を読むというのは望み薄だと思います。

やっぱりそうですかね。Mac 版では HFS+ の拡張属性を、Windows 版では NTFS の拡張属性を使用することになるのですね。拡張属性は今まで意識したことがなかったもので…ありがとうございます。

abenori commented 9 years ago

Windowsにも拡張ファイル属性はあるのですが(NTの頃かららしい) http://ja.wikipedia.org/wiki/%E6%8B%A1%E5%BC%B5%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%B1%9E%E6%80%A7 実際にどうなっているのかは全然しらないので,こういう目的に使えるかはわかりません.少し調べてみようと思います.(まぁ,同様のことが可能としてもMacとの互換性は無理です.)

aminophen commented 9 years ago

Mac 版の beta 9 のソース保持機能は正しく機能しているようです。

少し考えてみたのですが、LaTeXiT は生成画像のプレビュー画面を持つので、そこから直接 PowerPoint や Keynote にドラッグアンドドロップすることを想定しているようです。実ファイルを保存しないわけですので拡張属性という実装は不適切で、コメントに埋め込むのでしょうね。一方、TeX2img は実ファイルを生成して「プレビュー」で表示するという方式なので、実ファイルに拡張属性としてソースを付与するほうが都合が良いわけですね。

Mac 版はリリースできそうですね。Windows 版もコメント欄を

% compiler: platex % compiler: uplatex % compiler: latex % compiler: xelatex % compiler: lualatex

とし、テンプレート名を

  • LaTeX
  • pLaTeX
  • upLaTeX
  • XeLaTeX (Japanese)
  • LuaLaTeX (Japanese)

としたうえで一旦リリースでも良いのではないでしょうか。

doraTeX commented 9 years ago

一方、TeX2img は実ファイルを生成して「プレビュー」で表示するという方式なので、実ファイルに拡張属性としてソースを付与するほうが都合が良いわけですね。

この方式では,PDFに限らずあらゆるファイル形式にソース情報を付与できるというのが大きなメリットですね。

Mac 版はリリースできそうですね。

ではいよいよリリースしますか……!

aminophen commented 9 years ago

2月15日以来の長い改訂でしたね。ありがとうございました。Mac 版リリースお願いします!

doraTeX commented 9 years ago

2月15日以来の長い改訂でしたね。ありがとうございました。Mac 版リリースお願いします!

2つの Issue をあわせて150件以上のコメントからなる長い改訂となりましたが,お蔭さまで細部にわたるまで仕様を詰めることができ,ユーザーフレンドリーであることに極力までこだわった,質の高いアップデートになったのではないかと思います。 aminophenさん,abenoriさん,いつもながらありがとうございます。これからもぜひよろしくお願いいたします。

doraTeX commented 9 years ago

ところで,Mac版には,従来より「設定の保存/読み込み」機能があり,これは今回のプリアンブルテンプレート機能と重複することろがあります。ですが,

ということで,一応棲み分けはできていると考えてよいでしょう。

aminophen commented 9 years ago

「設定の保存/読み込み」機能

使ったことありませんでした…プリアンブルテンプレート機能があれば「ソース本文を除くあらゆる設定を保存/読み込み」ではなく「プリアンブルとソース本文を除く設定を保存/読み込み」で良いような気もしますが、仕様は変えないほうが無難ですね。棲み分けはできていると思います。

doraTeX commented 9 years ago

プリアンブルテンプレート機能があれば「ソース本文を除くあらゆる設定を保存/読み込み」ではなく「プリアンブルとソース本文を除く設定を保存/読み込み」で良いような気もしますが、仕様は変えないほうが無難ですね。

この「設定の保存/読み込み」機能は,私自身が「ブログ掲載用に \textwidth が狭いPNG出力設定」「Illustrator用に \textwidth が広いEPS出力設定」といったものを切り替えたりするのに重宝しておりまして,そのためには出力ファイル名・解像度設定・プリアンブルを一括で切り替えられるのが便利なのです。

aminophen commented 9 years ago

その場合は一括切り替えが便利ですね。現状のままが望ましいと思います。

abenori commented 9 years ago

Alternative Data Streamとかいうのを使ってできそうな気配があるのですが,実際にどうすればいいのかよくわかりません.もう少し調べてみます.

MD5 checksumとソースファイルを内部で保持してそれを参照するという実装方法を妄想しました.更に調べてもよくわからなかったらこっちでやってみようと思います.

LuaLaTeX (Japanese)についてはこちらは日本語版しかないので,LuaLaTeX(和文)でいいかなと思っています.

abenori commented 9 years ago

というわけで現状はこんな感じ http://1drv.ms/1uwNVCs

aminophen commented 9 years ago

pLaTeX のコメント欄だけが「compile」になっていたので、「compiler」に統一すれば大丈夫だと思います。 Win 版は英語リソースがないので、「和文」でも特に問題ないでしょうね。 ということで、いったんリリースでしょうか。

abenori commented 9 years ago

ありゃ本当だ.XeLaTeXもスペルミスってますね.

Alternative Data Streamですが,どうもequation.jpgというのに対してequation.jpg:sampleみたいなファイル名でアクセスすると付加情報をつけられるっぽい気がしてきました.(ファイル名に:が使えないのはそういう理由だったのか.) http://www.flexhex.com/docs/articles/alternate-streams.phtml

多分いったんリリースしますが.それも含めてともかく夜にでも作業します.

abenori commented 9 years ago

http://1drv.ms/1uwNVCs

割とあっさりできたので実装してみました.Alternative Data Streamを使って,Macのとほぼ同様の実装と思います.ソースは全部(プリアンブルも含めて)埋め込みましたが,同じでしょうか?

doraTeX commented 9 years ago

おおっ,おめでとうございます。 NTFSの Alternative Data Stream を実用的な目的で積極活用しているアプリは結構珍しいのではないでしょうか。

ソースは全部(プリアンブルも含めて)埋め込みましたが,同じでしょうか?

はい,Mac版でもその実装です。(複数ページ出力の場合も全部に全ソースを埋め込みます。)

abenori commented 9 years ago

NTFSの Alternative Data Stream を実用的な目的で積極活用しているアプリ

おそらくそうですね.調べているうちに思い出したのですが,IEはダウンロードファイルにセキュリティに関する情報を埋め込むのですが,これにADSが使われています.どっかで見た名前だと思ったらそのときに見たのでした…….

(主にセキュリティ上の懸念から)データが埋め込まれることに不快感を得る人もいるかもしれないので,こちらは一応オプションで切れるようにしました.

doraTeX commented 9 years ago

FATボリュームのUSBメモリなどに保存しようとしたときは,ソース情報が保存されないという挙動でしょうか。

(主にセキュリティ上の懸念から)データが埋め込まれることに不快感を得る人もいるかもしれないので,こちらは一応オプションで切れるようにしました.

ではこちらも一応設けてみます。 CUI版のオプションは --no-embed という具合ですかね。

abenori commented 9 years ago

一応ドライブ情報をチェックして,NTFSの時のみにしてあります.(生成時は静かに埋め込まない.インポート時はサポートしていないエラー.)チェックはしていないですが……. --embed-sourceにしていたのですが,否定的な方がMac的にいいですね.-sourceもつけて--no-embed-sourceにしませんか?

doraTeX commented 9 years ago

--embed-sourceにしていたのですが,否定的な方がMac的にいいですね.-sourceもつけて--no-embed-sourceにしませんか?

はい、そういたしましょう。

abenori commented 9 years ago

http://1drv.ms/1uwNVCs

そうしてみました. ADS書き込みをする部分はパス名が素通りなので,チェックを入れた方がよいかなぁと思っています.まぁ,TeX2img内での現在の使い方ならばおそらくそれより前のどっかでチェックされていると思いますが.NTFSか否かのチェックは甘いかもしれないです.

TeXがADSに書き込めるのを使って遊ぼうかと思ったのですが,面白いネタが思いつきませんでした……

aminophen commented 9 years ago

Win 版、試してみました。ソース埋め込みありがとうございます!

tex2img-gui-candidate8

「デフォルトで有効、ユーザが外せば無効」ですね。CUI も機能しているようです。

たまに、ソース埋め込みしていないのに「開けませんでした.」にならない例がありますね(その場合は謎の文字列が表示される)。pLaTeX で

[ \int _0 ^1 x^2 dx ]

を画像化したときなどが該当します。ただ、ソース埋め込みしていない画像を読み込むときのエラーチェックは実装されているようなので、これをかいくぐってしまうのでしょうね。

もう一点、プリアンブルテンプレートを切り替えたときに「現在のプリアンブルは破棄されます。」のメッセージ(以前の「デフォルトに戻す」ボタンの時のような)があったほうが良いと思いました。

abenori commented 9 years ago

http://1drv.ms/1uwNVCs

もう一点、プリアンブルテンプレートを切り替えたときに「現在のプリアンブルは破棄されます。」のメッセージ(以前の「デフォルトに戻す」ボタンの時のような)があったほうが良いと思いました。

いつの間にか消えていました…….

たまに、ソース埋め込みしていないのに「開けませんでした.」にならない例がありますね

生成したファイルから……のチェックを外している状態でインポートしようとしていませんか?この状態では常にTeXソースファイルと見なし単なるテキストファイルとして開こうとします.(ADSからの読み込みは行わない.)ともかく「見えないところに何か書かれるとか怖い」というためのオプションなので,ADSは完全無視の方向で動いています. チェックが入っていると,.texならばテキストとして開き,それ以外ならばADSを読もうとします.(.jpg/.png/.eps/.pdfの時のみADSを読もうとする方が自然かもしれません.)

aminophen commented 9 years ago

生成したファイルから……のチェックを外している状態でインポートしようとしていませんか?

まさにそのとおりでした(ソースを埋め込まないで TeX2img から出力したものをインポートしようとしたため)。

この状態では常にTeXソースファイルと見なし単なるテキストファイルとして開こうとします.(ADSからの読み込みは行わない.)ともかく「見えないところに何か書かれるとか怖い」というためのオプションなので,ADSは完全無視の方向で動いています.

確かに、チェックを外した状態では「いかなるファイルも単なるテキストファイルとして開こうとする」ほうがよいですね。

チェックが入っていると,.texならばテキストとして開き,それ以外ならばADSを読もうとします.

これはさすがに .jpg/.png/.eps/.pdf の時のみ ADS を読もうとする方が良いと思います。普通の .txt がADSを読まれるのはなんだか気持ち悪いので…

doraTeX commented 9 years ago

Mac版にも「生成したファイルからソースを復元できるようにする」(GUI版),--no-embed-source (CUI版) を設け,Ver. 1.8.8.1 としてリリースしました。

abenori commented 9 years ago

というわけで一段落です.

余白設定の変更がいちいち面倒だなぁとは思っていたのですが,設定の保存みたいな機能は便利ですね.

aminophen commented 9 years ago

Mac/Win ともにリリース確認しました。大規模改修で大変使いやすくなり、嬉しく思います。 今後ともよろしくお願いいたします。

設定の保存みたいな機能は便利ですね.

既に付いていた Mac 版ですらこれには触れたことがなかったので(長らく Win 版しか使ったことがなかった名残)、今後活用してみようと思います。

私の一言がここまで大規模な機能修正になるとは、予想だにしていませんでした…

例の網羅的解説記事のほうは後日修正しておきます。

doraTeX commented 9 years ago

例の網羅的解説記事のほうは後日修正しておきます。

よろしくお願いします。 新しい解説記事も公式サイトからリンクを張りましょうかね。

ちなみにMac版の設定保存画面はこんな感じです。

2015-02-26 6 22 06

aminophen commented 9 years ago

新しい解説記事も公式サイトからリンクを張りましょうかね。

貼っていただけると嬉しいです。新しい方の記事はだいたい作業完了しました。従来の記事のほうは、内容的には残すところソース埋め込みキャンセルのUIを載せて説明を書くだけですが、なにしろ今月の画像アップロード容量が限界に近いので、いったんここで止めようと思います笑

Win 版にも設定保存機能が…?

doraTeX commented 9 years ago

リンクを張っておきました!

abenori commented 9 years ago

Win 版にも設定保存機能が…?

「コンパイル回数」などを保存する必要は無いと思うので,完全な設定保存機能がいるとは思えませんが,特に余白設定を簡単に変更できる仕組みはあると便利なのではないかと思っていました.実際に思っていたのは

という感じです.プリアンブルのは今回ので満足することにすると,ほぼ余白設定のみですね.これをオプション扱いではなくてソース編集画面のどっかに置いておく,くらいでもよいのかもしれないです.(が,スペースがないぞ…….)

今月の画像アップロード容量が限界に近い

あれ,そんな容量制限があるのか.

aminophen commented 9 years ago

「コンパイル回数」などを保存する必要は無いと思うので,完全な設定保存機能がいるとは思えませんが,特に余白設定を簡単に変更できる仕組みはあると便利なのではないかと思っていました.

個人的に特に保存したい設定としては

ですね。エンジンの切り替えはその都度やるので問題ないですが、上の2つは結構重要です。プレゼン資料用の PNG は透過処理して背景に合わせたいのですが、逆にブログ用は透過するとあまり見栄えが良くないと思っていました。余白についても、ブログ用は余白を付けたいのですが、プレゼン用は余白なしにしたいと思います。この切り替えが簡単になれば便利です。