我有一系列pgfplots
基于 的图形,我使用该standalone
包将它们编译为 pdf 图像。我目前每个图形都有一个 .tex 文件。这样做的问题是,由于 .tex 文件之间可能只是数据文件发生变化,因此这可能涉及大量复制的代码。请考虑以下示例:
\documentclass{standalone}
\usepackage{tikz, pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xlabel=$x$,
ylabel=$y$]
\addplot[color=black]
table[x=x, y=y] {table1.txt};
%table[x=x, y=y] {table2.txt};
%table[x=x, y=y] {table3.txt};
\end{axis}
\end{tikzpicture}
\end{document}
以上包括我目前对上述问题的解决方案:我只需根据要导入的 .txt 文件取消注释相应的行,然后重复并重新编译,直到生成所有 pdf 文件。
有没有更优雅的方法来实现这一点,最好是自动化的(这样可以一次编译一堆不同的 pdf 文件)?我最接近的解决方案是multi
中的功能standalone
,允许多页输出。但我更喜欢以多个 pdf 图像的形式输出。
答案1
这是一个可以实现您想要的功能的 perl 脚本:
#!/usr/bin/perl
use File::Copy;
use strict 'vars';
foreach my $fh (@ARGV)
{
&MAIN($fh);
}
sub MAIN {
my ($source_data) = @_;
$source_data =~ s/\.tex$//;
open SOURCE, "<$source_data.tex" or die;
my @source = <SOURCE>;
close SOURCE;
if (not -e "tmp_data.tex" )
{
open TMP, ">tmp_data.tex";
close TMP;
}
open TARGET, ">tmp_data.tex" or die;
foreach my $line ( @source )
{
print TARGET $line
}
close TARGET;
system ("pdflatex standalone.tex");
move ("standalone.pdf", $source_data . ".pdf");
}
假设您使用的数据位于以下文件中:
data_01.tex
data_02.tex
data_03.tex
此外,作为您的独立文件:
\documentclass{standalone}
\usepackage{tikz, pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xlabel=$x$,
ylabel=$y$]
\addplot[color=black]
table[x=x, y=y] {tmp_data};
\end{axis}
\end{tikzpicture}
\end{document}
如果你将上述脚本命名publish.pl
为
$ perl publish.pl data_01.tex
此脚本将复制data_01.tex
到tmp_data.tex
。如果 然后使用 编译独立文件pdflatex
。最后,它将 移动pdf
到data_01.pdf
。
编写该脚本的目的是允许您迭代命令行参数以创建pdf
所需数据的所有单独版本。我相信,只要您的计算机上安装了 perl,无论您的操作系统是什么,此脚本都应该可以运行 find。
答案2
假设您有一个名为的独立文档myplotfile.tex
和两个数据文件data1.dat
,data2.dat
然后您可以在包含同一文件的每个实例之前更改文件名
\documentclass{article}
\usepackage{filecontents}
\usepackage{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{filecontents*}{myplotfile.tex}
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xlabel=$x$,ylabel=$y$]
\addplot[color=black]table[x=a, y=b] {\myfile};
\show\myvar
\end{axis}
\end{tikzpicture}
\end{document}
\end{filecontents*}
\begin{filecontents*}{data1.dat}
a b
1 2
2 4
3 8
4 16
\end{filecontents*}
\begin{filecontents*}{data2.dat}
a b
2 1
4 2
8 3
16 4
\end{filecontents*}
\begin{document}
\def\myfile{data1.dat}
\input{myplotfile}
\def\myfile{data2.dat}
\input{myplotfile}
\end{document}