自动外部化 TikZ 图形的脚本

自动外部化 TikZ 图形的脚本

是否有一个脚本可以自动外部化 TikZ 图形?

(正如斯科特所建议的这里

答案1

TikZ 2.10 库external解决了这个问题。将所有 TikZ 图形外部化到 LaTeX 文档中非常简单:

\usetikzlibrary{external}
\tikzexternalize

如果您的文档名为report.tex,这将转储出一系列图像:report-figure0.pdfreport-figure1.pdf, 等等。为了获得更易于管理的输出,您可以指定要放置文件的目录以及比 更具描述性的名称report-figure0.pdf

\usetikzlibrary{external}
\tikzexternalize[prefix=figures/]

% Rest of preamble
% Begin document, write stuff

% Set a filename for the next tikzpicture.
\tikzsetnextfilename{importantFigure}
\begin{tikzpicture}  % This will be output to figures/importantFigure.pdf
  % Picture code
\end{tikzpicture}

要编译该文档,您需要确保figures目录存在并pdflatex在启用 shell 执行的情况下运行:

mkdir figures
pdflatex -shell-escape <tex file>

有一大堆选项可用于自定义图形的输出方式。请参阅第 52.4 节(此编号可能会更改!)开发版本文档了解完整信息和选项。手册还介绍了如何获取 EPS 输出 - 但此选项看起来不如 PDF 输出那么完善。

答案2

当我撰写我的硕士论文时,我使用 tikz 和 pgfplots(使用 matplotlib2tikz)创建了所有图形和图表。将它们全部保留在源代码中是不可接受的,因为编译速度变得非常慢,所以我在寻找一种可以让我自动将所有这些图形编译为 pdf 文件的方法,以便我可以将其包含在我的文本中。

由于各种原因,我对其他解决方案都不完全满意,所以我写了一个Python 脚本这符合我的目的。

您必须牢记以下事项:

  1. 您将脚本放在与 main.tex 文件相同的级别
  2. 您编写 tikz 代码。您将每个图形放在扩展名为 *.tikz 的文件中。每个文件仅包含\begin{tikzpicture} ... \end{tikzpicture}
  3. 您编写要与 *.tikz 文件一起使用的序言。这不一定包含与 main.tex 文件的序言相同的包。您为所有图形保留一个通用序言的原因是为了便于更改字体等内容。
  4. 你运行脚本!

该脚本在文件夹结构中递归搜索 *.tikz 文件并使用指定的前言编译它们。每次运行脚本时,它都会存储每个 *.tikz 文件的修改时间,并在后续运行时仅编译自上次运行以来已修改的文件的新创建文件。如果您在前言中进行更改,只需传递一个命令行参数,它就会编译所有 *.tikz 文件。

在 Linux 上它运行良好。我还没有在 Windows 上测试过,但我不明白为什么它不能运行。无论如何,即使有任何问题,修复也将非常简单

答案3

这是我的选择;康拉德的答案可能同样好,并且肯定有更好的记录。

for job in `grep -o beginpgfgraphicnamed\{[0-9A-Za-z-]*\} < $1 | sed -e 's/beginpgfgraphicnamed{//' | sed -e 's/}//'`; do
    pdflatex --jobname $job $1;
    rm $job.log;
    rm $job.out;
    rm $job.aux;
done

答案4

我刚刚想到了以下方法。它似乎运行得很好(在 Unix/Linux 和 Mac 上):

SOURCE=$1
for name in $( \
    grep '^[:space:]*\\beginpgfgraphicnamed' $SOURCE | \
    sed s'/[:space:]*\\beginpgfgraphicnamed{\(.*\)}/\1/' \
); do
    pdflatex --jobname=$name $SOURCE
done

一个解释:

它用于grep过滤掉所有包含以下内容的行\beginpgfgraphicsnamed但只有如果行中的命令前只有空格。这可以防止注释掉的命令也被发现。

接下来,它调用sed从这些行中过滤出相关部分,即用作pdflatex作业名称的命令参数。然后它使用for迭代所有这些作业名称并pdflatex依次调用每个作业名称。

相关内容