使用 \tikzexternalize[mode=list and make] 自动生成文档

使用 \tikzexternalize[mode=list and make] 自动生成文档

借助这个问题我设法使用 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}

获取文档的流程如下:

  1. 编译文档以创建 tikz 图片列表
  2. 使用 latexmk 进行 make 创建 tikz 图片 pdf 文件
  3. 再次编译以包含 tikz 图片并创建最终的 pdf 文档

我尝试使用 Texstudio 中的工具链自动执行这三个步骤。如果 tikzpicture 的 PDF 文件已经可用,则工具链可以顺利运行。但如果第一次启动该链,则第一次编译会以错误结束:

===== mode=`list and make':使用“make -f texstudio_cB6136.makefile”生成所有图像。然后,重新运行 (pdf)latex texstudio_cB6136。=====

! 软件包 tikz 警告:某些图像不是最新的,需要生成

该错误是预料之中的,但它会中断工具链。所以我想知道是否有可能在 texstudio 中执行工具链期间忽略错误或直接抑制错误?

我使用的命令是

  1. pdflatex.exe -enable-write18 -synctex=1 -interaction=nonstopmode %.tex
  2. make -j <number of threads> -f %.makefile
  3. 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 中执行此操作。

相关内容