背景
大抵の人はLaTeXのソースファイルについては,gitとかで管理していると思うけど,PDFファイルまでgit addしている人はなかなかいない気もする(必要なリビジョンでソースを再コンパイルすれば良いだけだから)
その関係もあって,作業中のPDFについては出力の度に上書きされてしまうから,適当なタイミングで適当に名前を変えたりしてPDFはそのまま残してGoogle Driveなりで保存していたりするのでは無いだろうか?だけど,毎回ファイル名を書き換えるのはダルい.自動化したい.
加えて,共有したり,保存する時には普通にLaTeXで出力すると元の素材画像が大きかったりするとファイルサイズは馬鹿でかくなってしまったりするので,共有する時などはAdobe Acrobatなんかでファイルを圧縮したり最適化していると思います.これもGUIじゃなくてコマンドでやりたい.
↑これをコマンド一発でやりたい
環境
- 自分はmacでしか動作確認をしていないです.
- PDFを圧縮するために
ghostscript
が必要です.
Makefileを書く
FILE=main
V=0
.SUFFIXES: .tex .dvi .pdf
all: $(FILE).pdf
gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -sOutputFile=$(FILE)_min.pdf $(FILE).pdf
open $(FILE).pdf
open .
generate: $(FILE).pdf
$(eval V := $(shell find -E . -maxdepth 2 -type f -regex '.*$(FILE)_*v*[0-9]*\.pdf' | sed -e 's/[^0-9]//g' | sort -n | tail -n 1| awk '{print "v"$$1+1}'))
cp $(FILE).pdf $(FILE)_$(V).pdf
gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -sOutputFile=$(FILE)_$(V)_min.pdf $(FILE).pdf
open $(FILE)_$(V).pdf
open .
clean:
rm -rf *.aux *.dvi *.log *.bbl *.blg *.lof *.toc *.idx *.ind *.out *.fls *.ilg *.tdo *.gz *fdb_latexmk
find . -name "*.aux" | xargs rm
.tex.dvi:
uplatex $<
upbibtex $(FILE)
mendex $(FILE).idx
uplatex $<
uplatex $<
.dvi.pdf:
dvipdfmx -p a4 $<
$(FILE).pdf: $(FILE).dvi
$(FILE).dvi: $(FILE).tex
作ったもの
まず,前提としてtexファイルの名前はmain.tex
を想定していますので,FILE=main
としていますが,適宜書き換えてください.main.tex
をコンパイルするとmain.pdf
ができますが,このファイル名に対してmain_v1.pdf, main_v2.pdf
というように番号を振って出力できます.
カレントディレクトリから深さ2まで範囲でファイル名が,main_v<番号>.pdf
となるようなものを見つけて,その番号のうち最大のものに1を足した番号で新しいPDFを作ります.デフォルトの形式はmain_v2.pdf, main_v3.pdf
の様な形式ですが任意の文字列にも対応しています.
また,同時に,PDFのファイルサイズを縮小したもので,main.pdf
に対してmain_min.pdf
のようなものを作成します.
# 1. 普通にコンパイル+圧縮したファイルを出力したい
$ make
// → main.pdf main_min.pdf ができる
# 2. 番号のついたファイルを出力したい
$ make generate
// → main.pdf main_v1.pdf main_v1_min.pdf ができる
# (main.texを編集する)
# 3. 編集したので,また番号のついたファイルを出力したい
$ make generate
# → main.pdf main_v2.pdf main_v2_min.pdf ができる
のような感じです.ちなみに,
V=
と言うオプションを渡してあげると任意の文字列にできます.
# 任意の文字を入れたい
$ make generate V=10
# → main.pdf main_10.pdf main_10_min.pdf ができる
$ make generate V=提出用
# → main.pdf main_提出用.pdf main_提出用_min.pdf ができる
体感としては少なくともファイルサイズが半分以下くらいにはなると思います.
誰かの参考になれば幸いです.