1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LaTeXでコンパイルする度に番号を振りつつファイルサイズを圧縮したPDFを出力するMakefile

Last updated at Posted at 2020-02-01

背景

大抵の人はLaTeXのソースファイルについては,gitとかで管理していると思うけど,PDFファイルまでgit addしている人はなかなかいない気もする(必要なリビジョンでソースを再コンパイルすれば良いだけだから)

その関係もあって,作業中のPDFについては出力の度に上書きされてしまうから,適当なタイミングで適当に名前を変えたりしてPDFはそのまま残してGoogle Driveなりで保存していたりするのでは無いだろうか?だけど,毎回ファイル名を書き換えるのはダルい.自動化したい.

加えて,共有したり,保存する時には普通にLaTeXで出力すると元の素材画像が大きかったりするとファイルサイズは馬鹿でかくなってしまったりするので,共有する時などはAdobe Acrobatなんかでファイルを圧縮したり最適化していると思います.これもGUIじゃなくてコマンドでやりたい.

↑これをコマンド一発でやりたい

環境

  • 自分はmacでしか動作確認をしていないです.
  • PDFを圧縮するためにghostscriptが必要です.

Makefileを書く

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 ができる

体感としては少なくともファイルサイズが半分以下くらいにはなると思います.

誰かの参考になれば幸いです.

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?