elsarticle에 필요한 최소한의 횟수만큼 pdflatex를 실행합니다.

elsarticle에 필요한 최소한의 횟수만큼 pdflatex를 실행합니다.

pdflatex다음에서 한 번 실행

\documentclass{elsarticle}%%% version 3.1 from CTAN
\begin{document}
\begin{frontmatter}
\author[1]{Johann Sebastian Bach}
\author[2]{Ludwig van Beethoven\corref{cor2}}
\cortext[cor2]{Corresponding author}%
\address[1]{Thomaskirche, Leipzig}
\address[2]{Zentralfriedhof Wien}
\end{frontmatter}
\end{document}

다음과 같은 출력이 생성됩니다.

첫 번째 실행의 출력

보시다시피 두 저자의 레이블은 1이고 Mr. Beethoven 뒤의 위 첨자 별이 누락되었습니다. pdflatex이 문제를 해결하려면 의 두 번째 실행이 필요합니다 .

그러나 pdflatex항상 두 번 이상 실행하는 것은 원하는 것이 아닙니다. 특히 큰 문서의 경우 시간을 많이 소모하는 반면, pdflatex이전 실행에서 올바른 .aux 파일을 사용할 수 있는 경우 한 번 실행하는 것으로 충분할 수도 있습니다. 두 번째 재실행이 필요한지 여부에 대한 힌트를 찾기 위해 .log 파일과 콘솔 출력을 조사했지만 사용할 수 있는 항목을 찾을 수 없었습니다. 재실행이 필요한지 확인하기 위한 나의 이전 접근 방식은 다음과 같습니다.

MESSAGE_FOR_RERUN := '(LaTeX Warning: Label\(s\) may have changed\. Rerun to get cross\-references right\.)|(LaTeX Warning: There were undefined references\.)|(LaTeX Warning: Citation [^[:cntrl:]]* on page [0-9]* undefined on)|(Package natbib Warning: There were undefined citations\.)|(\(mparhack\) *Rerun to get them right\.)'

makefile의 시작 부분에

for i in $(SOURCES); do \
  $(PDFLATEX) $$i ; \
done
if (egrep $(MESSAGE_FOR_RERUN) $(OBJECTS)); then \
  for i in $(SOURCES); do $(PDFLATEX) $$i ; done; \
fi

(변수가 적절하게 정의된 경우) makefile의 규칙에 있습니다. (물론 MWE가 아닌 경우 sed, awk, rm, bibtex, bibtex8, biber, makeglossaries, makeindex, xindy, dvi2ps, zip, chmod 또는 god-knows-what 중 하나를 선택하여 실행해야 할 수도 있습니다. , 그러나 다른 프로그램에 대한 자세한 내용은 여기서 모두 주제에서 벗어났습니다.)

물론 작업을 수행할 수 있지만 latexmk메이크 \usepackage[mainaux]{rerunfilecheck}파일을 통해 이전 방식으로 계속 수행할 수 있는지 궁금합니다. 그렇다면 로그 파일에서 어떤 문자열을 검색해야 할까요?

답변1

내 의견을 답변으로 모아보세요.

간단한 .log파일 구문 분석은 필요한 재실행을 감지하는 데 충분하다고 보장할 수 없습니다. 재실행 경고는 LaTeX가 또 다른 LaTeX 실행이 필요한 것처럼 보이는 경우와 인용(그리고 아마도 다른 몇 가지 사항) .log이 사용자에게 경고하도록 경험적 방법을 설정했기 때문에 나타납니다 . \labels그러나 패키지는 모니터링되는 메커니즘을 사용할 의무가 없으며 자체적으로 작업을 수행할 수도 있습니다.

문제의 코드는 그러한 코드의 대표적인 예입니다. 관련 레이블은 \Newlabel(대신 \newlabel) 사용자 정의 명령을 사용하여 작성되며 해당 레이블의 변경 사항을 감지하는 코드는 없습니다.

.log실제로 첫 번째 실행 파일과 두 번째 실행 파일 간의 유일한 관련 차이점은 다음과 같습니다.

No file <jobname>.aux.

(<jobname>.aux)

그리고 호출된 파일이 로드되었는지 여부 <jobname>.spl.

.log이제 파일은 동일하게 유지되지만(시간 및 메모리 정보 제외) 출력에는 여전히 또 다른 LaTeX 실행이 필요한 예제를 구성하는 것이 쉽습니다 .

  1. 질문에서 예제를 가져와 두 번 컴파일하십시오.
  2. 세 번째 저자 추가: \author[3]{Antonín Dvořák}주소 포함\address[3]{Vyšehrader Friedhof}
  3. 엮다한 번Dvořák의 각주 "1"을 확인하세요.
  4. 다시 컴파일하여 "".

3단계와 4단계 사이에서 .log파일은 날짜/시간 정보, 메모리 사용량 및 글꼴 정보의 줄 번호를 제외하고 동일하게 유지됩니다. 그러나 이러한 변경 사항 중 어느 것도 또 다른 LaTeX 실행이 필요함을 나타내지 않습니다.

따라서 사용하는 패키지에 재실행이 필요한지 다시 확인하고 에서 경고하는 일종의 경험적 방법이 LaTeX 측에 내장되어 있지 않으면 .log파일 .log만으로는 LaTeX 재실행 여부를 결정하기에 충분하지 않습니다.

latexmk이것이 보조 파일의 변경 사항도 모니터링하는 이유 중 하나입니다 . 실행 사이에 보조 파일이 안정적이면 출력도 안정적이어야 합니다. 실제로 위의 예에서는 3단계의 LaTeX 실행 시 파일 \Newlabel{3}{c}에 추가됩니다. 따라서 3단계 실행 전후는 다르지만 4단계 실행에서는 파일이 변경되지 않습니다. (물론 new 를 사용하지 않는 등 파일이 변경 되더라도 재실행이 필요하지 않은 상황이 있습니다 . 따라서 해당 문서에 대해 결과 빌드 주기가 가장 짧다고 보장할 수는 없습니다. 또한 상황이 있습니다. 파일이 절대 안정화되지 않는 경우 :.aux.aux.aux.aux\label.auxbiblatex ibid 인용 스타일로 무한 컴파일러 통과를 피하시겠습니까?.)

rerunfilecheck질문에서 언급한 패키지를 사용하면 .auxLaTeX 실행 사이에 파일을 모니터링할 수 있습니다. 특히 .aux현재 LaTeX 실행 전후의 파일 해시가 비교됩니다. 해시가 변경된 경우 이는 재실행이 유용할 수 있음을 나타내며 다음 형식의 경고가 표시됩니다.

Package rerunfilecheck Warning: File `<jobname>.aux' has changed. Rerun.

Package rerunfilecheck Info: Checksums for `<jobname>.aux':
(rerunfilecheck)             Before: AE406B0DDBF18055292F1343793AC8CB;63
(rerunfilecheck)             After:  ED9C2E0E40AE4680FD0E58AB745EA3BF;80.

반면에 가 .aux안정적이면 다음과 같이 보고합니다.

Package rerunfilecheck Info: File `<jobname>.aux' has not changed.
(rerunfilecheck)             Checksum: ED9C2E0E40AE4680FD0E58AB745EA3BF;80.

따라서 rerunfilecheck작업은 해당 패키지의 재실행 경고를 구문 분석하는 것으로 줄어듭니다.

rerunfilecheckmakefile에서 외부적으로 수행하는 작업을 다시 실행하는 것이 가능할 수도 있습니다 .

  • 현재를 해시 .aux하고 해시를 기억하세요.
  • LaTeX를 실행합니다.
  • 새로운 해시를 해시 .aux하고 이전 해시와 비교합니다.
  • 해시가 다르면 다시 실행하세요.

노력할 가치가 있을지는 의문이지만, bash 스크립팅에 대한 학문적 연습이 될 수도 있습니다(실제로 이 작업을 수행하는 방법을 아는 것은 아닙니다).

관련 정보