Make

僅當 tex 文件有參考書目時,Makefile 才執行 bibtex 命令

  • July 27, 2019

我想要一個包含任意數量的 .tex 文件的文件夾,我將在其中擁有一個 Makefile,它會在make執行時為每個 .tex 文件生成一個 .pdf 文件。我的限制是一些但不是所有的 .tex 文件都有參考書目。帶有參考書目的 .tex 文件將有條件地使用 bibtex 工俱生成 .bbl 文件,以在最終 .pdf 文件中建構參考。這是必需的,因為如果 bibtex 沒有找到文本中引用的參考書目,它將返回錯誤程式碼併中止建構過程。下面是生成文件的建議解決方案,它不起作用,因為 ifneq 沒有評估 FILE_BIBS 的值。

Makefile(注意:四個空格應該用製表符代替,否則解釋器將無法正常工作)

SOURCES:=$(wildcard $(SRC_DIR)*.tex)
BIBS:=$(wildcard $(SRC_DIR)*.bib)
OUTPUT:=$(patsubst %.tex, %.pdf, $(SOURCES))

.PHONY: all
all: $(OUTPUT) 

# Build procedure for all .tex files
%.pdf: %.tex $(BIBS) 
   pdflatex $(patsubst %.tex, %, $<) > /dev/null
   # Scan the current .tex file for the phrase \bibliography and put the text
   # into a variable called FILE_BIBS, if there is no bibliography phrase in 
   # the file, FILE_BIBS will be empty
   $(eval FILE_BIBS=$(shell grep -m 1 '^[[:space:]]*\\bibliography[[:space:]]*{' $< | sed 's/\\//g' | sed 's/{//g' | sed 's/}//g'))
   echo $(FILE_BIBS)
   # If there are .bib files in the project 
ifneq ($(BIBS),)
   echo "there are bibs FILE_BIBS: $(FILE_BIBS)"
   # See if FILE_BIBS is not empty (the file uses a bibliography)
ifneq ($(FILE_BIBS),)
   # This should print out for outline.tex and not for outline2.tex
   # This does not print out in either case
   echo "file has bib"
   bibtex $(patsubst %.tex, %, $<) > /dev/null
   pdflatex $(patsubst %.tex, %, $<) > /dev/null
endif
endif
   pdflatex $(patsubst %.tex, %, $<) > /dev/null

.PHONY: clean
clean:
   -rm -f *.pdf *.log *.out *.aux *.dvi *.blg *.bbl 

大綱.tex

\documentclass{article}
\usepackage{natbib}
\bibliographystyle{apa}

\begin{document}

Types of integration \cite[81-82]{INCOSE-Handbook}.

\bibliography{references}{}

\end{document}

大綱2.tex

\documentclass{article}

\begin{document}

Hello.

\end{document}

參考文獻.bib

@BOOK{INCOSE-Handbook,
 TITLE = {Systems Engineering Handbook},
 SUBTITLE = {A guide for system life cycle processes and activities},
 AUTHOR = {Walden, David D. and Roedler, Gerry J. and Forsberg, Kevin J. and Hamelin, R. Douglas and Shortell, Thomas M.},
 YEAR = {2015},
 PUBLISHER = {Wiley},
 EDITION = 4,
 ADDRESS = {7670 Opportunity Rd., Suite 220 San Diego, CA, USA 92111-2222}
}

輸出

$ make 
pdflatex  outline2 > /dev/null
echo 
echo "there are bibs FILE_BIBS: "
there are bibs FILE_BIBS: 
pdflatex  outline2 > /dev/null
pdflatex  outline > /dev/null
echo bibliographybibliography
bibliographybibliography
echo "there are bibs FILE_BIBS: bibliographybibliography"
there are bibs FILE_BIBS: bibliographybibliography
pdflatex  outline > /dev/null

我們希望在建構大綱時看到 bibtex 呼叫,但我們沒有。這表明第二個 ifneq 工作不正常。

Makefile 不起作用,因為第二個ifneq不起作用,當FILE_BIBS非空時評估 true。建議應允許使用者通過執行在文件夾中建構所有 .tex 文件,make建議解決方案之外的新解決方案應僅使用命令行interface、make、pdftex、bibtex 和 Unix/Linux 環境中的標準工具,例如 awk、sed、grep。

編寫用於排版 LaTeX 文件的 Makefile是出了名的複雜。如果可能的話,最好根據需要使用諸如latexmk自動執行latex等工具bibtex

顯然,latexmk可以將 的執行放入 Makefile 中,特別是如果將文件建構為一組文件的一部分或作為您正在編寫的某些軟體包的一部分。

引用自:https://unix.stackexchange.com/questions/532424