是否有一个脚本可以自动外部化 TikZ 图形?
(正如斯科特所建议的这里)
答案1
TikZ 2.10 库external
解决了这个问题。将所有 TikZ 图形外部化到 LaTeX 文档中非常简单:
\usetikzlibrary{external}
\tikzexternalize
如果您的文档名为report.tex
,这将转储出一系列图像:report-figure0.pdf
,report-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 脚本这符合我的目的。
您必须牢记以下事项:
- 您将脚本放在与 main.tex 文件相同的级别
- 您编写 tikz 代码。您将每个图形放在扩展名为 *.tikz 的文件中。每个文件仅包含
\begin{tikzpicture} ... \end{tikzpicture}
。 - 您编写要与 *.tikz 文件一起使用的序言。这不一定包含与 main.tex 文件的序言相同的包。您为所有图形保留一个通用序言的原因是为了便于更改字体等内容。
- 你运行脚本!
该脚本在文件夹结构中递归搜索 *.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
依次调用每个作业名称。