Makefileは、texファイルに参考文献がある場合にのみbibtexコマンドを実行します。

Makefileは、texファイルに参考文献がある場合にのみbibtexコマンドを実行します。

make私は実行時に、各.texファイルに対して.pdfファイルを生成するMakefileを含む複数の.texファイルを含むフォルダが欲しいです。私の制限は、一部(すべてではない).texファイルに参考文献があることです。参考文献を含む.texファイルは、bibtexツールを使用して条件付きで生成され、最終的な.pdfファイルに参照を構築する.bblファイルを生成します。これは、bibtexがテキストに引用された参考文献を見つけることができない場合、bibtexがエラーコードを返し、ビルドプロセスを中断するために必要です。以下は提案されたmakefileソリューションです。これは、ifneq が FILE_BIBS 値を評価しないため、機能しません。

ファイルの生成(注:4つのスペースをタブに置き換える必要があります。そうしないと、通訳は正しく機能しません。)

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呼び出しが表示されると予想しましたが、そうではありませんでした。これは、2番目のifneqが正しく機能していないことを示します。

Makefile は、2 番目のファイルがifneq機能せず、FILE_BIBS空でない場合は true と評価されるため、機能しません。ユーザーは、を実行してフォルダにすべての.texファイルをビルドできるようにすることをお勧めします。make推奨ソリューション以外の新しいソリューションは、コマンドラインインターフェイス、make、pdftex、bibtex、awkなどのUnix / Linux環境の標準ツールのみを使用する必要があります。 、sed、grep。

ベストアンサー1

LaTeXドキュメントのフォーマット用のMakefileの作成悪名が高いほど複雑。可能であれば、次のようなものを使用することをお勧めしますlatexmk必要に応じて自動的に実行されますlatexbibtex

明らかに、Makefileに実行を入れることが可能ですlatexmk。特に、文書が文書セットの一部として作成されている場合、または作成中の一部のパッケージの一部として作成されている場合は、そうです。

おすすめ記事