gnu make を使用して LaTeX ドキュメントをコンパイルしています。私は過去にそれを何度も行ってきましたが、今では 2 つの異なる形式でドキュメントをコンパイルする必要があります。私がやっていることの背景として、LaTeX ファイルにLaTeX 条件式を実装しました。ファイルの例を次に示します。
% TheTexFile.tex
% This accepts makefile definitions
% \isTwoColumn
% \isDoubleSpaced
\ifdefined\isTwoColumn
\documentclass[letterpaper, twocolumn]{article}
\else
\documentclass[letterpaper]{article}
\fi
%\documentclass[letterpaper]{article}
\ifdefined\isDoubleSpaced
\usepackage{setspace}
\doublespacing
\fi
\begin{document}
Some document text for a document that should be able to be compiled using
two different methods. There seems to be a problem though, but OP thinks
that it is in the makefile not in the LaTeX since it can be compiled using
both methods by issuing the same commands that are in the makefile directly
enter code here`from the command line.
\end{document}
私はこれらを別の make ターゲットを使ってコンパイルすることができますが、私はどちらか一方、通常は読みやすいバージョンしかコンパイルしていないため、常に人々に古いバージョンを送っていて、ほとんどの人は他のバージョンを見る必要があります。推奨事項。Makefileの質問に関するアドバイスに従いました。可能であればサブディレクトリの使用を避けたいという例外を除いて、異なるフラグで 2 回コンパイルされた同じソースからの 2 つのターゲット。それを念頭に置いて、次のmakefileを考え出しました。
# The makefile
# The targets
OBJS=TheTexFile.pdf
# The different build methods
DBL_SPACE_PREFIX=DBL_SPACE_
TWO_COL_PREFIX=TWO_COL_
DBL_SPACE_OBJS=$(addprefix $(DBL_SPACE_PREFIX), $(OBJS))
TWO_COL_OBJS=$(addprefix $(TWO_COL_PREFIX), $(OBJS))
# A variable for defining the job information (output files)
JOBNAME=$(shell echo $@ | sed 's/\.pdf//')
all: $(TWO_COL_OBJS) $(DBL_SPACE_OBJS) clean
$(DBL_SPACE_PREFIX)%.pdf: TEXDEF=\def\isDoubleSpaced{1}
$(TWO_COL_PREFIX)%.pdf: TEXDEF=\def\isTwoColumn{1}
$(DBL_SPACE_PREFIX)%.pdf $(TWO_COL_PREFIX)%.pdf: %.tex
pdflatex -jobname=$(JOBNAME) -shell-escape --enable-write18 "$(TEXDEF) \input{$<}"
pdflatex -jobname=$(JOBNAME) -shell-escape --enable-write18 "$(TEXDEF) \input{$<}"
bibtex $(JOBNAME)
pdflatex -jobname=$(JOBNAME) -shell-escape --enable-write18 "$(TEXDEF) \input{$<}"
pdflatex -jobname=$(JOBNAME) -shell-escape --enable-write18 "$(TEXDEF) \input{$<}"
.PHONY: clean
clean:
# Get rid of pdflatex files
rm *.aux *.bbl *.blg *.log *.nav *.out *.snm *.toc
.PHONY: cleanall
cleanall:
rm $(DBL_SPACE_OBJS) $(TWO_COL_OBJS)
これはほぼ完璧に機能します。この問題は、すべてのターゲットが削除されていることを確認したときに発生します。つまり、コマンドmake clean
andを発行してmake cleanall
から を発行しmake
ます。最初は、 のみTWO_COL_OBJS
がコンパイルされます。すべてのターゲットをそのままにしてコマンドを再発行すると、DBL_SPACE_OBJS
コンパイルされます。これですべてのオブジェクトがコンパイルされましたが、同じコマンドを 2 回発行する必要がありました。これは回避したかったことです。
同様に、 のターゲット オブジェクトを逆にするとall
、つまり
all: $(TWO_COL_OBJS) $(DBL_SPACE_OBJS) clean
になる
all: $(DBL_SPACE_OBJS) $(TWO_COL_OBJS) clean
DBL_SPACE_OBJS
1回目も2回目も全て頂きますTWO_COL_OBJS
。私は何が欠けていますか?