doraTeX / TeX2img

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

SVGによるベクターアニメーション生成機能 #65

Open doraTeX opened 8 years ago

doraTeX commented 8 years ago

新機能案

SVG出力で「単一ファイルまたはアニメを生成」がONの場合には,SVGを用いたアニメーションを出力する機能を付ける。

実装法

例えばSVG出力ファイル名が hoge.svg で,変換前が100ページのPDFであったとする。

(1) まずは普通に100枚のSVGを mudraw で生成する。

(2) 各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">

(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- のように置換する。ただし,&#x301C; のような数値文字参照を置換しないように,前に & が伴う場合を除く。すなわち,正規表現で書けば,否定戻り読みをして (?<!\&)\# を置換対象にすればよい。

(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を次のように用意する。

<?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のサンプルはこちら

※ GIFアニメと同様に,コマ数が多くなるとファイルサイズがそれに比例して大きくなるので,インラインで使うのではなく <img> 要素で呼び出す場合には,gzip で圧縮した svgz形式 にしておくのがよいだろう。

doraTeX commented 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- のように置換する。ただし,&#x301C; のような数値文字参照を置換しないように,前に & が伴う場合を除く。すなわち,正規表現で書けば,否定戻り読みをして (?<!\&)\# を置換対象にすればよい。

(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>
doraTeX commented 8 years ago

実装完了し,Ver. 2.1.3 beta 1 を作成しました。

変換ルーチンを色々いじった(ついでにいくつかのパターンでのバグが見つかりそれも修正した)ので,既存の画像形式についても正しく出力できるかどうかも,改めてチェックが必要となりました。

doraTeX commented 8 years ago

変換経路図を改訂し,アニメーションSVGを追加。

aminophen commented 8 years ago

あまり試していませんが、とりあえず SVG アニメは出てきました! これは面白いです。TeX2img の仕組みを知っている人間としては mudraw で単一ページ SVG を出せてもそれほどメリットがなかったわけですが、この機能が付くと使いがいがあります。SVG アニメを自動で作るツールの前例はまだ知りませんし、イロイロ2イロイロならではですね。

doraTeX commented 8 years ago

ありがとうございます。 この記事にまとめられているように,SVGによるアニメーションの実現には,大きく分けて

  1. SMIL(
  2. CSS(
  3. Javascript(

による実現法があります。

今回の手法は,SMIL に分類されます。 ただし,特定の要素を動かすというよりは,パラパラ漫画のようにSVGの図全体を時間ごとに差し替えています。

SVGの中に複数のPNG画像を取り込み,それをSMILでコマ送りにすることで,「アニメーションPNG」的なものを実現するという試みがありました。

今回の「アニメーションSVG生成」は,SMILを用いてコマ送りにするものを,外部のPNG画像の列ではなく,SVG内に定義された別のSVGの列にすることで実現しています。

このようなベクター形式のパラパラ漫画の実現というのは,あまり先行事例が見当たらないようですが,このようなアニメSVGを簡単に生成できるのは TeX2img の強みの一つになるのではと思います。

doraTeX commented 8 years ago

せっかくつけたSMILによるSVGアニメーションですが,SMILが非推奨となり,今後利用できなくなる予定となったようですね。残念。 今後,主要ブラウザでSMILが使えなくなった暁には,SVGによるアニメーション生成機能は削除するしかなくなるのでしょうか……。

aminophen commented 8 years ago

当該記事からリンクされているここを数週間前に読んだのですが、やはり SMIL は利用できなくなる流れなのですかね… SVG 単独でアニメーションできるので有用だったと思うのですが😥

SVGによるアニメーション生成機能は削除するしかなくなるのでしょうか……。

今のうちから TeX2img 本体の気づきやすいところに「SMIL によるアニメーションだ」ということを書いておくのがよいと思います。配布サイトだけだと見ないかもしれないので。

doraTeX commented 8 years ago

UIのスペースに余裕があるところが少なくて,入れどころに困りますね…… ここはどうでしょう?

2016-01-07 17 17 37

「気づきやすいところ」ではないかもしれませんが……

aminophen commented 8 years ago

配布サイトよりは見る確率が高いので良いと思います。

abenori commented 1 year ago

関係あるかもしれないのではっておきます. https://github.com/abenori/TeX2img/issues/16 (まだこちらは何もしていません.)