Open doraTeX opened 8 years ago
上記の(6)に限らず,テキスト保持PDFをアニメーションSVGに変換すると何かとトラブルを引き起こすようなので,アニメーションSVG形式の出力の場合はPDFをアウトライン化してからSVG化するように変更。
新しい変換ルーチンは以下の通り。
例えばSVG出力ファイル名が hoge.svg
で,変換前が100ページのPDFであったとする。
(1) まずPDFのアウトラインをとる。
(2) そこから mudraw で100枚のSVGで生成する。
(3) 各SVGファイルのヘッダ2行を削除する。
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
(4) 後で1枚のSVGに合体したときに id のコンフリクトが起こらないように,各SVG内の各要素の id に別々のプレフックスを付ける。
具体的には,1枚目のSVG内の id="
という文字列を id="hoge-1-
に,2枚目は id="hoge-2-
のようにページ番号を付ける。(1枚のHTML内にインラインSVGを複数配置した場合の id のコンフリクトを防ぐため。)
(5) 各SVG内の id への参照をプレフックス付きのものに置換する。そのため,#
を #hoge-1-
や #hoge-2-
のように置換する。ただし,〜
のような数値文字参照を置換しないように,前に &
が伴う場合を除く。すなわち,正規表現で書けば,否定戻り読みをして (?<!\&)\#
を置換対象にすればよい。
(6) 各SVGファイル冒頭の <svg
の部分に id を振り,<svg id="hoge-1-svg"
, <svg id="hoge-2-svg"
のように置換する。
(7) 出力用SVGを次のように用意する。
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<defs>
【SVGソース】
</defs>
<use>
<animate attributeName="xlink:href" begin="0s" dur="【総秒数】s" repeatCount="【繰り返し数】" values="【id一覧】" />
</use>
</svg>
【SVGソース】
部分には,(1)~(6) で作成した100枚のSVGのソースを流し込む。【総秒数】
部分には,総ページ数*ウエイト秒数
の値を書き込む。【繰り返し数】
部分には,繰り返し数を書き込む。無限ループの場合は indefinite
という文字列を書き込む。【id一覧】
部分には,#hoge-1-svg;#hoge-2-svg;#hoge-3-svg;...;#hoge-98-svg;#hoge-99-svg
のような列を書き込む。実装完了し,Ver. 2.1.3 beta 1 を作成しました。
変換ルーチンを色々いじった(ついでにいくつかのパターンでのバグが見つかりそれも修正した)ので,既存の画像形式についても正しく出力できるかどうかも,改めてチェックが必要となりました。
あまり試していませんが、とりあえず SVG アニメは出てきました! これは面白いです。TeX2img の仕組みを知っている人間としては mudraw で単一ページ SVG を出せてもそれほどメリットがなかったわけですが、この機能が付くと使いがいがあります。SVG アニメを自動で作るツールの前例はまだ知りませんし、イロイロ2イロイロならではですね。
ありがとうございます。 この記事にまとめられているように,SVGによるアニメーションの実現には,大きく分けて
による実現法があります。
今回の手法は,SMIL に分類されます。 ただし,特定の要素を動かすというよりは,パラパラ漫画のようにSVGの図全体を時間ごとに差し替えています。
SVGの中に複数のPNG画像を取り込み,それをSMILでコマ送りにすることで,「アニメーションPNG」的なものを実現するという試みがありました。
今回の「アニメーションSVG生成」は,SMILを用いてコマ送りにするものを,外部のPNG画像の列ではなく,SVG内に定義された別のSVGの列にすることで実現しています。
このようなベクター形式のパラパラ漫画の実現というのは,あまり先行事例が見当たらないようですが,このようなアニメSVGを簡単に生成できるのは TeX2img の強みの一つになるのではと思います。
せっかくつけたSMILによるSVGアニメーションですが,SMILが非推奨となり,今後利用できなくなる予定となったようですね。残念。 今後,主要ブラウザでSMILが使えなくなった暁には,SVGによるアニメーション生成機能は削除するしかなくなるのでしょうか……。
当該記事からリンクされているここを数週間前に読んだのですが、やはり SMIL は利用できなくなる流れなのですかね… SVG 単独でアニメーションできるので有用だったと思うのですが😥
SVGによるアニメーション生成機能は削除するしかなくなるのでしょうか……。
今のうちから TeX2img 本体の気づきやすいところに「SMIL によるアニメーションだ」ということを書いておくのがよいと思います。配布サイトだけだと見ないかもしれないので。
UIのスペースに余裕があるところが少なくて,入れどころに困りますね…… ここはどうでしょう?
「気づきやすいところ」ではないかもしれませんが……
配布サイトよりは見る確率が高いので良いと思います。
関係あるかもしれないのではっておきます. https://github.com/abenori/TeX2img/issues/16 (まだこちらは何もしていません.)
新機能案
SVG出力で「単一ファイルまたはアニメを生成」がONの場合には,SVGを用いたアニメーションを出力する機能を付ける。
実装法
例えばSVG出力ファイル名が
hoge.svg
で,変換前が100ページのPDFであったとする。(1) まずは普通に100枚のSVGを mudraw で生成する。
(2) 各SVGファイルのヘッダ2行を削除する。
(3) 後で1枚のSVGに合体したときに id のコンフリクトが起こらないように,各SVG内の各要素の id に別々のプレフックスを付ける。 具体的には,1枚目のSVG内の
id="
という文字列をid="hoge-1-
に,2枚目はid="hoge-2-
のようにページ番号を付ける。(1枚のHTML内にインラインSVGを複数配置した場合の id のコンフリクトを防ぐため。)(4) 各SVG内の id への参照をプレフックス付きのものに置換する。そのため,
#
を#hoge-1-
や#hoge-2-
のように置換する。ただし,〜
のような数値文字参照を置換しないように,前に&
が伴う場合を除く。すなわち,正規表現で書けば,否定戻り読みをして(?<!\&)\#
を置換対象にすればよい。(5) 各SVGファイル冒頭の
<svg
の部分に id を振り,<svg id="hoge-1-svg"
,<svg id="hoge-2-svg"
のように置換する。(6) Chrome で文字部分が表示されないバグ(?)に対応するため,
<symbol id="(.*?font.*?)"><path
を<symbol><path id="\1"
へ正規表現置換。(7) 出力用SVGを次のように用意する。
【SVGソース】
部分には,(1)~(6) で作成した100枚のSVGのソースを流し込む。【総秒数】
部分には,総ページ数*ウエイト秒数
の値を書き込む。【繰り返し数】
部分には,繰り返し数を書き込む。無限ループの場合はindefinite
という文字列を書き込む。【id一覧】
部分には,#hoge-1-svg;#hoge-2-svg;#hoge-3-svg;...;#hoge-98-svg;#hoge-99-svg
のような列を書き込む。こうして作ったアニメーションSVGのサンプルはこちら。
※ GIFアニメと同様に,コマ数が多くなるとファイルサイズがそれに比例して大きくなるので,インラインで使うのではなく
<img>
要素で呼び出す場合には,gzip で圧縮した svgz形式 にしておくのがよいだろう。