如何避免使用 pgfplots/standalone 组合复制代码?

如何避免使用 pgfplots/standalone 组合复制代码?

我有一系列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.textmp_data.tex。如果 然后使用 编译独立文件pdflatex。最后,它将 移动pdfdata_01.pdf

编写该脚本的目的是允许您迭代命令行参数以创建pdf所需数据的所有单独版本。我相信,只要您的计算机上安装了 perl,无论您的操作系统是什么,此脚本都应该可以运行 find。

答案2

假设您有一个名为的独立文档myplotfile.tex和两个数据文件data1.datdata2.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}

在此处输入图片描述

相关内容