« Scarcity, abundance, and lost ... | Home | Spywar »

MakeでLaTeX言語のビルドしましょう

Fri 17 Dec 2021 by mskala Tags used: , , ,

今日MakeでLaTeX言語のビルドしましょう。

これは「TeX & LaTeX Advent Calendar 2021」の17日目の記事です。 (16日目はCareleSmith9さん18日目はSpark Hiroさんです。) 悪い日本語でごめんなさい。 練習ので、一年に一つの記事を書いています。 早く流暢になりますかな?

LaTeXの必要なコマンド

初心者には、「LaTeXが易い」と教えています。 文章を作ったら、たった一つのコマンドあります。

   pdflatex foo

それは.texから.pdfまで訳します。

しかしイザコザありできます。 たとえば、古いdvipsで、二つのコマンドが必需です。
   latex foo
   dvips foo

pdflatexでも、クロスレファレンスは余分なコマンドあります。

   pdflatex foo
   pdflatex foo

書誌も索引も、専用のコマンドあります。

   latex foo
   bibtex foo
   makeindex foo
   latex foo
   latex foo
   dvips foo

それ上に、もしかしてMetapostからのフィギュアーとかGnuplotからの図表とか書きました。 ビルドのコマンドは数々です。

make

ソフトウェアエンジニアはこの問題が日常です。 C言語のビルドは数々なコマンドが必需です。 コンパイルとかアセンブラとかリンクとかです。 易いになってMakeを使います。 LaTeXがプログラミング言語なら、Makeを使わないんですか?

Makeはソフトウェアのビルドのツールです。 Makefileでプログラムのソースコードを教えています。 ファイルのエディットしたら、「make」だけをタイプしています。 全部ビルドのコマンドがされます。

これは初心者のMakefileです。

   foo.pdf: foo.tex
	   pdflatex foo

「make」をタイプしたら、foo.texが新しいかチェックして、新しいなら「pdflatex foo」をしています。 不必要コマンドを抜かします。

数個の文章ので、Makefileで書きできます。

   all: foo.pdf bar.pdf baz.pdf
 
   foo.pdf: foo.tex
	   pdflatex foo
 
   bar.pdf: bar.tex
	   pdflatex bar
 
   baz.pdf: baz.tex
	   pdflatex baz

「make」や「make all」をタイプしたら、新しいファイルをビルドしています。 もう、「make foo.pdf」とかできます。

GNU Makeの型ルールは手頃です。 全部の文章でも一つのルールあります。 コマンドは一つの場所で書かれました。

   all: foo.pdf bar.pdf baz.pdf
 
   %.pdf: %.tex
	   pdflatex $*

それでも、難しい文章は問題になります。 LaTeXは、出力のファイルをいつも書き換えます。 Makeの新しいファイルチェックが慌てます。 クロスレファレンスなら、いくら繰り返しは分かりません。 書誌とか、索引とか難しいです。 その上に、一本で全部のファイルあるなら依存関係のリストが必要で難しいです。

latex-makeのパケージ

その問題だから、latex-makeのパケージあります。 Vincent DanjeanさんとArnaud Legrandさんは著者です。 難しい文章でも、latex-makeとGNU Makeでビルドが易いです。 CTANからダウンロードが出来て、TeXliveとかでパケージあります。

パケージでLaTeX.mkのファイルあります。 MakeはインクルードディレクトリでLaTeX.mkのファイルを探しています。 たとえばLinuxで/usr/local/includeにインストールがいいです。 TEXMFにソフトリンクができます。

   $ # 例だけ
   $ locate LaTeX.mk
   /usr/local/texlive/2020/texmf-dist/doc/support/latex-make/LaTeX.mk
   /usr/local/texlive/2020/texmf-dist/doc/support/latex-make/LaTeX.mk.conf
   $ sudo ln -s /usr/local/texlive/2020/texmf-dist/doc/support/latex-make/LaTeX.mk /usr/local/include

latex-makeパケージから他のファイルも必要でも、TeXディストリビューションはTEXMFでそのファイルあります。

ちょくちょく小さいMakefileが満足です。

   echo 'include LaTeX.mk' > Makefile

そのあと、ビルドがたった一つのコマンドです。

   make

LaTeX.mkはオートマチックですよ。

もしかしたら、ここで読むことをやめできます。

フレーバー

しかし、latex-makeはいつもpdflatexがデフォルトです。 ある全部で、オートマチックな依存関係チェックは満足ないです。 LaTeXほかにプログラミング言語使いなら、余分なコマンドが必要です。

latex-makeで、フレーバー(味)あります。 Makefileの上にフレーバーを書き出来ます。 たとえば、pdflatexせずにlualatexを使って。

   LU_FLAVORS=LUALATEX
   include LaTeX.mk

実は、僕がXeLaTeXが好きです。 latex-makeで、xelatexのフレーバーありません。 でも、カスタムフレーバーを作ったです。 2011年のブログで書きました。

   define lu-define-flavor-XELATEX
     $$(eval $$(call lu-create-flavor,XELATEX,tex,XELATEX,.pdf,pdf,\
       .pdftex_t .$$(_LU_XELATEX_EXT)))
   endef
 
   LU_FLAVORS=XELATEX
   XELATEX=xelatex
 
   include LaTeX.mk

ほかのルール

LaTeXの上にほかのツールを使いなら、Makefileで余分なルールを書いています。 たとえば、Leapfrog VCFのマニュアルでGnuplotからグラフあります。

Gnuplotからグラフ

Gnuplotは.gpファイルから.epsファイルまでコンパイルをします。 だから、このルールがいいです。

   define lu-define-flavor-XELATEX
     $$(eval $$(call lu-create-flavor,XELATEX,tex,XELATEX,.pdf,pdf,\
       .pdftex_t .$$(_LU_XELATEX_EXT)))
   endef
 
   LU_FLAVORS=XELATEX
   XELATEX=xelatex
 
   include LaTeX.mk
 
   %.eps: %.gp
	   gnuplot $*.gp

msk-007.texでは、「\input{calculations.tex}」あります。 calculations.texで「\includegraphics{mnelp-bode.eps}」あります。 mnelp-bode.gpのファイルあります。 だから、make msk-007.pdfのタイプ時、latex-makeとGNU Makeはオートマチックに依存関係を知ります。 msk-007.pdfだからmsk-007.texを読んで、msk-007.texだからgeneral.texを読んで、general.texだからmnelp-bode.epsが欲しいです。 それから、余分なルールでgnuplotを使っています。

そのマニュアルも、Circuit-macrosのスキマティク図あります。 2016年でCircuit-macrosについて書きました。

スキマティク図

これは二つの余分なルールあります。

   %.pic: %.m4
	   m4 -I /usr/local/share/texmf/tex/latex/circuit_macros \
	     pgf.m4 $*.m4 > $*.pic
 
   %.tex: %.pic
	   dpic -g $*.pic > $*.tex

二歩の依存関係です。 m4から.picまで、.picから.texまでです。 だから、Makeルールでもオートマチックないです。 手動に依存関係をリストします。

   msk-007.pdf: \
     coretopo.tex fibonacci.tex fibsv.tex galois.tex galsv.tex \
     linca.tex passivelc.tex simplres.tex

プログラミング言語の母語に話す人のために、Makeが楽なビルド出来ます。

0 comments



(optional field)
(optional field)
Answer "bonobo" here to fight spam. ここに「bonobo」を答えてください。SPAMを退治しましょう!
I reserve the right to delete or edit comments in any way and for any reason. New comments are held for a period of time before being shown to other users.