latexmk에서 자동으로 두 가지 작업 호출

latexmk에서 자동으로 두 가지 작업 호출

답변stackoverflow의 라텍스 소스에서 두 가지 버전의 문서를 컴파일하는 것에 대한 질문에 다음 명령을 사용하여 문제를 해결했습니다.

latexmk -pdf -pdflatex="pdflatex -synctex=1 -interaction=nonstopmode -shell-escape" -jobname=myfile -pretex="\newcommand{\version}{noanswer}" -usepretex myfile.tex | latexmk -pdf -pdflatex="pdflatex -synctex=1 -interaction=nonstopmode -shell-escape" -jobname=myfile_solution -pretex="\newcommand{\version}{}" -usepretex myfile.tex "

latexmk두 번 호출되며 이를 래퍼 스크립트에 넣는 것은 간단합니다. 그러나 .latexmkrc호출할 때 자동으로 두 작업을 모두 수행하는 방식으로 파일을 구성하는 것이 가능한지 궁금합니다 latexmk file.tex. CPU의 여러 코어를 사용하기 위해 두 작업을 병렬로 실행하는 것도 가능합니까?

그렇다면 .latexmkrc이 작업을 수행하려면 어떻게 파일을 구성해야 합니까? 가능하다고 표시되어 있습니다여기(p. 105, 여파).

답변1

나는 이것을 순전히 내에서 수행하는 방법을 알지 못합니다 latexmk. 확실히 쉽고 간단한 것은 전혀 없습니다. latexmk언급된 댓글에 대한 의견이 의심됩니다.https://www.ntg.nl/maps/45/06.pdflatexmk하나의 소스 파일에서 여러 출력 파일을 생성하는 작업을 수행하는 방법을 자세히 조사하지 않고 만들어졌습니다 .

  1. 래퍼 스크립트는 실제로 필요한 작업을 수행하는 가장 확실한 방법입니다. 그러나 나는 주어진 명령줄이 옵션을 제공하기 위해 latexmk의 옵션을 사용한다는 것을 알았습니다 . 모든 옵션이 에서 지원되므로 사용하는 것이 더 간단하고 더 좋습니다.-pdflatex=...pdflatexlatexmk

     latexmk -pdf -synctex=1 -interaction=nonstopmode -shell-escape -jobname=myfile -pretex="\newcommand{\version}{noanswer}" -usepretex myfile.tex
     latexmk -pdf -synctex=1 -interaction=nonstopmode -shell-escape -jobname=myfile_solution -pretex="\newcommand{\version}{}" -usepretex myfile.tex
    
  2. 내가 사용한 또 다른 방법은 관련 변수(이 경우 \version)를 간단히 설정한 다음 기본 파일을 입력하는 드라이버 .tex 파일을 갖는 것입니다. 나는 그것이 매우 편리하다는 것을 알았습니다. TeX 코드 중복을 방지하는 동시에 두 개의 .tex 파일을 사용하면 솔루션 버전이 어떻게 만들어지는지 더 투명하게 알 수 있습니다. 또한 latexmk또는 에 대해 특수 명령줄을 사용할 필요가 없습니다 pdflatex.

myfile_solution.tex이 경우 에는

    \newcommand{\version}{}
    \input{myfile}

또한 정의되지 않은 myfile.tex경우 적절한 동작을 제공하는 것을 갖추겠습니다 . \version예를 들어, 첫 번째 줄은 다음과 같을 수 있습니다.

  \providecommand{\version}{noanswer}

\version아직 정의되지 않은 경우 에만 정의됩니다 .

답변2

저는 latexmkrc를 사용하여 동일한 tex 소스에서 2가지 버전을 자동으로 생성합니다. 제 경우에는 시험 패키지를 사용하고 있습니다. 한 버전은 답안이고 다른 버전은 시험, 퀴즈 또는 테스트입니다.

내 tex 소스에는 컴파일할 문서의 버전을 선택하는 줄이 있습니다. \noprintanswers 명령은 시험 패키지에서 제공됩니다.

\ifdefined\answersflag\noprintanswers\else\printanswers \fi

이것은 내 tex 소스와 동일한 폴더에 있는 내 .latexmkrc의 관련 부분입니다.

my $filename = $ARGV[-1];
($base_name, $path, $ext) = fileparseB( $filename );
if  ($ext ne '.tex' ) {
   $file = "$base_name$ext";
}
else {
   $file = $base_name;
}

$tmp = 'blanks.tmp';
if (-e $tmp) {
   system( "rm $tmp" );
} else {
   system( "touch $tmp" );
   system( "latexmk -jobname=${file}blank -usepretex=\"\\def\\answersflag{}\" ${file} > ${file}blank.log &" );
}

작업은 병렬로 실행됩니다. 그것은 나를 위해 일하고 있으며 귀하의 경우에 맞게 조정할 수 있습니다.

관련 정보