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 호출이 나타날 것으로 예상했지만 그렇지 않았습니다. 이는 두 번째 ifneq가 제대로 작동하지 않음을 나타냅니다.

Makefile은 두 번째 파일이 ifneq작동하지 않고 FILE_BIBS비어 있지 않으면 true로 평가되기 때문에 작동하지 않습니다. 사용자는 를 실행하여 폴더에 모든 .tex 파일을 빌드할 수 있도록 허용하는 것이 좋습니다. make권장 솔루션 외부의 새로운 솔루션은 명령줄 인터페이스, make, pdftex, bibtex 및 awk와 같은 Unix/Linux 환경의 표준 도구만 사용해야 합니다. , sed, grep.

답변1

LaTeX 문서 형식화를 위한 Makefile 작성악명이 높을 정도로 복잡하다. 가능하다면 다음과 같은 것을 사용하는 것이 좋습니다latexmk필요에 따라 자동으로 실행됩니다 latex.bibtex

분명히, Makefile에 실행을 넣는 것이 가능합니다 latexmk. 특히 문서가 문서 세트의 일부로 작성되거나 작성 중인 일부 패키지의 일부로 작성되는 경우 더욱 그렇습니다.

관련 정보