VSCode +LaTeX Workshop を利用してpdftocairo をrecipes から実行することが出来ることを紹介した.
しかし,この中で,SVG の変換に関しては単数ページPDF またはPDF 内の特定の1ページの変換しか対応していない. そのために,いちいちPDF を単数ページで作成したり,単数ページのPDF に分割するのは面倒である.
上手く1つのコマンドから複数ページのPDF を一気にSVG に変換したい. これを実現するために,BAT (バッチ) ファイルを利用してスクリプトを組みたい.Windows であれば誰でも利用することが可能なためBAT ファイルを採用している.
BAT ファイルとは,コマンドプロンプトから実行することのできるコマンドをまとめたファイルです.一連のコマンドをまとめておくことで1回の操作で実現できるようになります.
もしも他の言語が好みであれば作成してみると良いだろう.Bash とか? Batch の他ではrecipe から実行できるかは検証していません.
LaTeX Workshop を利用している際にrecipes からBAT ファイルを実行させることでpdftocairo を-svg
オプション付きで利用したい.
settings.json を見れば明らかだが,サブフォルダに成果物を出力するようにしている.これは大量の画像をTeX ファイルと同じディレクトリに出力してごちゃごちゃになることを避けるためである.
TeX ファイルのあるフォルダにmppdf2svg.bat
(Multi Page PDF to SVG) ファイルを設置する.
BAT ファイルの設計目標は以下の通りになる.
- pdfinfo からPDF の諸情報を取得
- findstr で"Pages:" の行からPDF のページ数を取得
- pdftocairo をページ数分だけ繰り返し実行し,1ページずつSVG に変換
また,該当するPDF ファイルが存在しない場合には停止する(SVG への変換をスキップする) ようにしている.
実際に作成すると次のファイルで示すBatch ファイルのようになった.
基本的な使い方は以下を想定している.
$ mppdf2svg.bat <PDF-file-name-without-extension> <[option] SVG-folder-name>
Option
オプションのデフォルトはimage
フォルダが作成されSVG がその中に生成される.任意のフォルダ名を入力すればそのフォルダ内にSVG が生成される.
PDF と同じディレクトリに出力したい場合には.\
をオプションで付与すれば良い.
option | subfolder |
---|---|
no type (default) | image folder |
hoge |
hoge folder |
.\ |
same PDF folder |
オプションは2つ目に課すようにする.また,スペースを含みたい場合はダブルクオーテーション"
で囲んでいても良い.
3ページのtest.pdf
に対して以下を実行したとする.
$ mppdf2svg.bat test svg-image
test.pdf
のフォルダ内にsvg-image
フォルダが作成され,その中にSVG ファイルが生成される.
Result folder and files structure
. (x:\path\to\PDF\file\test)
├── mppdf2svg.bat
├── test.pdf
└── svg-image
├── test-image-1.svg
├── test-image-2.svg
└── test-image-3.svg
OUTPUT: (LaTeX Compiler)
Running mppdf2svg.bat (`pdftocairo`)...
Search "test.pdf"...
... ... Found it
----- ----- BEGIN TO CONVERT ----- -----
Get PDF information...
+++: x:\path\to\PDF\file\test\pdfinfo.txt
Make SVG output "image-svg" folder
Convert 4 page PDF to SVG...
+++: x:\path\to\PDF\file\test\svg-image\test-image-1.svg
+++: x:\path\to\PDF\file\test\svg-image\test-image-2.svg
+++: x:\path\to\PDF\file\test\svg-image\test-image-3.svg
----- ----- END TO CONVERT ----- -----
`mppdf2svg.bat` ERRORLEVEL: 0
PDF やSVG が出力されているサブフォルダ内にpdfinfo.txt
ファイルが出力されているが,これはpdfinfo によって得たPDF の諸情報が記載されている.
もしもこれを自動的に削除したい場合は,次のスクリプトをecho COMPLETED!!
の前に加えておけば良いだろう.(下のコードではコメントアウトにしている)
echo Delete "pdfinfo.txt" ...
for /f %%d in ('dir /s/b "pdfinfo.txt"') do (
del /q %%d
echo ---: %%d
)
少しだけ問題点がある.
カレントディレクトリ以下に含まれる同一名PDF が複数ある場合,これらを区別することは出来ない.(存在しない場合のみははじくことが出来る)
LaTeX Workshop でLaTeX を編集している際に利用することを想定しているので,カレントディレクトリ以下に同一名のPDF が複数ある可能性はほとんどないものと考えている.
その他問題があれば...
recipes とtools に以下を加える.
settings.json
"latex-workshop.latex.recipes": [
// another recipes ...
{
"name": "Convert multi page PDF to SVG",
"tools": ["mppdf2svg_batch"]
},
],
"latex-workshop.latex.tools": [
// another tools ...
{
"name": "mppdf2svg_batch",
"command": "./mppdf2svg.bat",
"args": [
"%DOCFILE%",
// "OUTDIR_NAME",// OPTION SVG DIRECTORY
]
},
],
カレントディレクトリにBAT ファイルを設置しているが,任意のディレクトリに設置することも可能である.(ホームディレクトリとか?)
これは,"command"
を絶対パスで指定すれば良い.
ちなみに,~
を利用したホームディレクトリの指定は出来ないようだ.絶対パスで指定しよう.
FAQ - # You cannot use a tilde
~
in PATH LaTeX -Workshop Wiki - GitHub
これでpdftocairo を利用して複数ページのPDF をSVG に変換することが出来るようになった. 他に良い方法があれば教えてほしい.
LaTeX Workshop を利用してBAT ファイルを実行することが出来るという知見を得ることが出来ました.これからさまざまなことを出来るようになりそうですね.
調子乗って作成していたら初めに作成したものから比べると倍ほど長いコードとなった.処理の各セクションにはコメントアウトで注釈を挿入しているので,もしも利用したい人がいれば確認しておいてほしい. 変なコードにはなっていないはずです.
これに加えて,pdftocairo ではPNG の変換なども可能だが,サブフォルダ内に生成することは出来ない.したがって,このBAT ファイルをいじっても良いだろうと思われる.(ほとんどいらない部分が多い気がする)
これまで示していたmppdf2svg.bat
では以下のようなの不自由さがあったように思われる.
- 複数の引数を使用してBAT ファイルを利用していた
- PDF のあるフォルダ名を限定していた
- SVG を出力するフォルダをPDF と同一のフォルダに指定していた
これらの点から,少し改修を試みた.この結果として以下のように自由度を持たせることが出来た.
- 変換したいPDF を探して自動的に作業ディレクトリを移動
- SVG を出力するフォルダを簡易的に変更可能
また,基本的な引数をPDF のファイル名のみに限定した.