
에답변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
하나의 소스 파일에서 여러 출력 파일을 생성하는 작업을 수행하는 방법을 자세히 조사하지 않고 만들어졌습니다 .
래퍼 스크립트는 실제로 필요한 작업을 수행하는 가장 확실한 방법입니다. 그러나 나는 주어진 명령줄이 옵션을 제공하기 위해
latexmk
의 옵션을 사용한다는 것을 알았습니다 . 모든 옵션이 에서 지원되므로 사용하는 것이 더 간단하고 더 좋습니다.-pdflatex=...
pdflatex
latexmk
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
내가 사용한 또 다른 방법은 관련 변수(이 경우
\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 &" );
}
작업은 병렬로 실행됩니다. 그것은 나를 위해 일하고 있으며 귀하의 경우에 맞게 조정할 수 있습니다.