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

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

Closed
doraTeX opened this issue Feb 23, 2015 · 39 comments

Comments

@doraTeX
Copy link
Owner

commented Feb 23, 2015

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

実現方法

  • 出力画像ファイルの EA(拡張属性) にソース情報を書き込む。
  • インポートメニューまたはドラッグ&ドロップによるTeXソースインプット機能において,許容ファイルの種類に .pdf / .eps / .jpg / .png を追加し,それらがインポートされた場合はEAからソースをロードする。
  • EAにソース情報が含まれない画像ファイルをインプットしようとした場合にはエラーを出す。

@doraTeX doraTeX added the enhancement label Feb 23, 2015

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 23, 2015

d0cd7834c5489de53ffe34aee4e240f091152398 で実装。

@abenori

This comment has been minimized.

Copy link

commented Feb 23, 2015

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 23, 2015

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

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 23, 2015

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

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

hoge.jpg
._hoge.jpg

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 23, 2015

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

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

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

  • データフォーク:通常のプログラムが読み取る内容。Finderやlsコマンドが表示するファイルサイズはこれのサイズ
  • 拡張属性:Finderで表示したときのアイコンや,Spotlight検索用メタデータなど補足情報,拡張子による関連づけから外れたこのファイルだけの特別な関連づけ(Finderの「情報を見る」で設定できる)など,その他の情報を保持する領域

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

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 23, 2015

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

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

  • 仮に Mac/Win 両方で実装された場合、Mac 版で出力した画像をWindows に持って行った場合、リソースフォークを残してさえいれば Windows 版でまたソースを読み込める(あるいはその逆のようなことも)ということができるのでしょうか?
  • 複数ページ画像を出力する場合は、一つ一つのファイルに全体のソースが記録されるのですよね?
@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 23, 2015

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

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

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

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 23, 2015

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

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

@abenori

This comment has been minimized.

Copy link

commented Feb 23, 2015

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

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

This comment has been minimized.

Copy link
Owner Author

commented Feb 24, 2015

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

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

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

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 24, 2015

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

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 24, 2015

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

  • プリアンブルテンプレート機能はプリアンブルのみを復元する。
  • 設定の保存/読み込み機能は,プリアンブルの内容,コンパイラ設定をはじめとする設定ウィンドウの全設定,出力ファイル名など,ソース本文を除くあらゆる設定を保存/読み込みする。

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

@doraTeX doraTeX added the done label Feb 24, 2015

@aminophen

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 24, 2015

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

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

@abenori

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

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

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

@abenori

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

@abenori

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

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

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

@abenori

This comment has been minimized.

Copy link

commented Feb 24, 2015

http://1drv.ms/1uwNVCs

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 24, 2015

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

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

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

@abenori

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

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

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 24, 2015

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

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

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

@abenori

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 24, 2015

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

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

@abenori

This comment has been minimized.

Copy link

commented Feb 24, 2015

http://1drv.ms/1uwNVCs

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

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

tex2img-gui-candidate8

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

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

[
\int _0 ^1 x^2 dx
]

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

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

@abenori

This comment has been minimized.

Copy link

commented Feb 24, 2015

http://1drv.ms/1uwNVCs

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

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

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

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 24, 2015

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

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

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

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

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

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 25, 2015

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

@abenori

This comment has been minimized.

Copy link

commented Feb 25, 2015

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

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 25, 2015

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

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

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

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

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 25, 2015

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

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

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

2015-02-26 6 22 06

@aminophen

This comment has been minimized.

Copy link

commented Feb 25, 2015

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

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

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

@doraTeX

This comment has been minimized.

Copy link
Owner Author

commented Feb 25, 2015

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

@abenori

This comment has been minimized.

Copy link

commented Feb 25, 2015

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

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

  • 余白設定
  • プリアンブル
  • コンパイラ?(重要度は低め)

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

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

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

@aminophen

This comment has been minimized.

Copy link

commented Feb 26, 2015

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

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

  • PNG 透過処理の有無
  • 余白設定

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

@doraTeX doraTeX closed this Mar 9, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants
You can’t perform that action at this time.