借助这个问题我设法使用 tikzexternalize 选项实现了多个 tikz 图片渲染的并行外部化mode=list and make
。考虑以下示例
\documentclass{article}
\usepackage{tikz,pgfplots}
\usetikzlibrary{external}
\tikzexternalize[mode=list and make]
\begin{filecontents}{plot.tikz}
\begin{tikzpicture}
\begin{axis}
\addplot coordinates {(1,1) (2,2) (3,3)};
\end{axis}
\end{tikzpicture}%
\end{filecontents}
\begin{document}
\input{plot.tikz}
\end{document}
获取文档的流程如下:
- 编译文档以创建 tikz 图片列表
- 使用 latexmk 进行 make 创建 tikz 图片 pdf 文件
- 再次编译以包含 tikz 图片并创建最终的 pdf 文档
我尝试使用 Texstudio 中的工具链自动执行这三个步骤。如果 tikzpicture 的 PDF 文件已经可用,则工具链可以顺利运行。但如果第一次启动该链,则第一次编译会以错误结束:
===== mode=`list and make':使用“make -f texstudio_cB6136.makefile”生成所有图像。然后,重新运行 (pdf)latex texstudio_cB6136。=====
! 软件包 tikz 警告:某些图像不是最新的,需要生成
该错误是预料之中的,但它会中断工具链。所以我想知道是否有可能在 texstudio 中执行工具链期间忽略错误或直接抑制错误?
我使用的命令是
pdflatex.exe -enable-write18 -synctex=1 -interaction=nonstopmode %.tex
make -j <number of threads> -f %.makefile
pdflatex.exe -enable-write18 -synctex=1 -interaction=nonstopmode %.tex
答案1
这可以通过配置来完成latexmk
。以下代码将放在一个latexkmrc
文件中。它是从链接问题中的代码改进和修正的集成 latexmk 和 TikZ 外部模式=list 和 make。
$clean_ext .= ' %R.figlist %R-figure* %R.makefile fls.tmp';
$latex = 'internal tikzlatex latex %B %O %S';
$pdflatex = 'internal tikzlatex pdflatex %B %O %S';
$lualatex = 'internal tikzlatex lualatex %B %O %S';
$xelatex = 'internal tikzlatex xelatex %B %O %S';
$hash_calc_ignore_pattern{'pdf'} = '^(/CreationDate|/ModDate|/ID)';
$hash_calc_ignore_pattern{'ps'} = '^%%CreationDate';
sub tikzlatex {
my ($engine, $base, @args) = @_;
my $ret = 0;
print "Tikzlatex: ===Running '$engine @args'...\n";
$ret = system( $engine, @args );
print "Tikzlatex: Fixing .fls file ...\n";
system "echo INPUT \"$aux_dir1$base.figlist\" > \"$aux_dir1$base.fls.tmp\"";
system "echo INPUT \"$aux_dir1$base.makefile\" >> \"$aux_dir1$base.fls.tmp\"";
system "cat \"$aux_dir1$base.fls\" >> \"$aux_dir1$base.fls.tmp\"";
rename "$aux_dir1$base.fls.tmp", "$aux_dir1$base.fls";
if ($ret) { return $ret; }
if ( -e "$aux_dir1$base.makefile" ) {
if ($engine eq 'xelatex') {
print "Tikzlatex: ---Correcting '$aux_dir1$base.makefile' made under xelatex\n";
system( 'perl', '-i', '-p', '-e', 's/^\^\^I/\t/', "$aux_dir1$base.makefile" );
}
elsif ($engine eq 'latex') {
print "Tikzlatex: ---Correcting '$aux_dir1$base.makefile' made under latex\n";
system( 'perl', '-i', '-p', '-e', 's/\.epsi/\.ps/', "$aux_dir1$base.makefile" );
}
print "Tikzlatex: ---Running 'make -f $aux_dir1$base.makefile' ...\n";
if ($aux_dir) {
# latexmk has set $ENV{TEXINPUTS} in this case.
my $SAVETEXINPUTS = $ENV{TEXINPUTS};
$ENV{TEXINPUTS} = good_cwd().$search_path_separator.$ENV{TEXINPUTS};
pushd( $aux_dir );
$ret = system "make", "-j", "5", "-f", "$base.makefile";
&popd;
$ENV{TEXINPUTS} = $SAVETEXINPUTS;
}
else {
$ret = system "make", "-j", "5", "-f", "$base.makefile";
}
if ($ret) {
print "Tikzlatex: !!!!!!!!!!!!!! Error from make !!!!!!!!! \n",
" The log files for making the figures '$aux_dir1$base-figure*.log'\n",
" may have information\n";
}
}
else {
print "Tikzlatex: No '$aux_dir1$base.makefile', so I won't run make.\n";
}
return $ret;
}
然后只需运行latexmk
,您可以从 TeXstudio 中执行此操作。