外部化为其他格式,Makefile。向 makefile 添加新规则

外部化为其他格式,Makefile。向 makefile 添加新规则

通过使用 Christian 的外化方法(如下所示),人们可以在外化之后立即将 pdf 转换为任何选择的格式。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[mode=list and make]
\tikzset{
    % Defines a custom style which generates BOTH, .pdf and .png export
    png export/.style={
        external/system call/.add={}%
        {; convert -density 300 -transparent white "\image.pdf" "\image.png"}
    }
}
\begin{document}
\bgroup
\tikzset{png export} % Will be exported to a png as-well
\begin{tikzpicture}
  \draw[red] (0,0) -- (1,1);
\end{tikzpicture}
\egroup
\begin{tikzpicture}
  \draw (0,0) -- (1,1);
\end{tikzpicture}
\end{document}

以上代码将外部化两个图像。其中一个(第一个)也将创建为 png。要创建图像,您还需要调用:make -f \jobname.makefile

只要您可以使用Makefiles,这个问题在 Linux 和 Windows 上应该是等效的。

使用这个,我总是可以立即得到我的 png 图片。但是,我经常会遇到较大的图片,因此由于 png 创建(首先 TeX -> Pdf,然后 Pdf -> Png,然后是下一张图片),处理会花费更多时间。

当数据发生变化等时,我总是使用密钥external/mode=list and make来根据需要制作/重新制作图像。这使它对我来说更加强大。

那么,如何外部化框架并向 Makefile 中添加适当的信息,以便可以分别制作 pdf 和 png,但 png 需要依赖于 pdf?

附言:我找到了一种方法,但希望其他人能加入进来,找到其他可能的解决方案。我将在几天内提供我的答案以及其他答案。

答案1

我可以看到,就用户群而言,我的问题可能非常有限,或者根本没有多少人处理过这个问题。

因此我将在这里尝试详细说明它的用法。

为什么需要/实施它

每个人都对快速排版的需求感兴趣。你是否经常不重新编译文档来查看公式是否排版​​正确,或者是否需要最后调整间距等。

这意味着你想在第二个(s)。为了实现这一点,在相当大的文档中,您有几种选择:

  • 创建一个包含页面设置的单独文档,并设置方程式、过程、编辑、过程编辑。
  • 强制您当前的发货TeX忽略任何图像或tikzpicture任何其他冗长的宏(我避免使用长宏,因为它可能会被误认为\long:) )。我相信我听说过这样的包,尽管我自己从未使用过它们。
  • 填写您自己的方法,我的方法如下

对于重复使用上述功能,每个人都希望这个开关快速而简单。在这方面,我的解决办法是快的

如何使用外部化

我对外部化的运用只与环境有关tikzpicture。然而,这个想法也可以用在其他情况下。

我爱Makefiles。我不会撒谎!他们让我的生活更轻松。

这就是为什么我很快就爱上了使用 进行外部化的方法Makefiles。您需要做的就是:

\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[mode=list and make]

这将执行以下操作:

  1. 在第一次编译时,每个tikzpicture都会获得一个指定的名称,并且作业调用的相应条目会添加到一个名为的单独的 makefile 中:\jobname.makefile
    • tikzpicture它不会像库通常所做的那样,在单独的命令中实际编译external,而是会插入一个文本,显示图像已被丢弃

      [[ 由于 `/tikz/external/mode=list and make' 而丢弃的图像 ]]

  2. 第二次运行时会发生同样的事情,图像将不会被排版。
  3. 您必须调用该命令make -f \jobname.makefile才能生成图片。

那么目的是什么?

首先,使用 makefile 方法,您可以更轻松地设置依赖项(库会为您设置!)。假设您使用pgfplots依赖\addplot table {data.dat};项方案,则会自动得出该图仅在文件数据文件更改。
多么方便啊!

如果您以其他方式需要文件,该实现甚至允许自定义依赖项设置。请参阅命令\tikzpicturedependsonfile

另一个关键特性是,现在可以利用多个处理器的功能,例如:make -j 4 -f \jobname.makefile它将在 4 个处理器上并行运行(每个处理器编译自己的图形)。手册中也提到了这一点。
现在,这是编译文档的一种快速方法。

那么需要什么

在编写/制作文档的过程中,您会发现最好将所有图形都创建为 png 或任何其他格式。手册还介绍了如何做到这一点。

现在我发现,如果我有大图像并想将它们转换为 png,则需要花费大量时间。这仅仅是因为我要么使用 pdf 格式的转换png 或仅 pdf。

我想要的是果断地说出我现在想要 png 或者现在我想要两者。

因此,我四处寻找,最终找到了自己的解决方法。解决方法是,在Makefile其他宏完成后,将命令添加到。

因此,我在库中添加了几个键,external从而轻松添加了我需要的功能。

\makeatletter
\tikzset{%
    external/mode=list and make,
    % Make the keys for automatic generation of images
    external/new make rule/.code args={make #1; ext .#2}{%
        % Add the rules for the new format
        \tikzexternalwritetomakefile{}%
        \tikzexternalwritetomakefile{ALL_FIGURES_#2=\tikzexternal@DOLLARchar(ALL_FIGURE_NAMES:\tikzexternal@PERCENTchar=\tikzexternal@PERCENTchar .#2)}%
        \tikzexternalwritetomakefile{}%
        \tikzexternalwritetomakefile{#1: \tikzexternal@DOLLARchar(ALL_FIGURES_#2)}%
        \tikzexternalwritetomakefile{\tikzexternal@TABchar @echo All #2 images exist now. Use make -B to re-generate them.}%
        \tikzexternalwritetomakefile{}%
    },
    external/add fig rule/.code args={.#1 depends: .#2,cmd:#3}{%
        % Generate the extra system call for the format
        \tikzset{%
            % The \@firstoftwo Removes the \tikzexternal@TABchar, which is inserted
            external/system call/.add={}{\noexpand\@firstoftwo ^^J},
            external/system call/.add={}{\noexpand\@firstoftwo ^^J\image.#1: \image.#2},
            external/system call/.add={}{^^J#3}
        }
    }
}
\makeatother

这段代码可以让你调用:

\tikzset{
    external/new make rule={%
        make allimagespng; ext .png
    },
    external/add fig rule={%
        .png depends: .pdf,cmd:convert -density 300 "\image.pdf" "\image.png"
    },
    external/new make rule={%
        make allimagesjpeg; ext .jpeg
    },
    external/add fig rule={%
        .jpeg depends: .pdf,cmd:convert -density 300 "\image.pdf" "\image.jpeg"
    }
}

首先制定一条名为 的新规则allimagespng。接下来制定单个文件的规则,即从 pdf 创建 png。然后我也为 jpeg 制定了相同的规则。原则上,您可以随意执行此操作。

尝试一下并检查一下\jobname.makefile

数学方程

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[mode=list and make]
\makeatletter
\tikzset{%
    external/mode=list and make,
    external/new make rule/.code args={make #1; ext .#2}{%
        \tikzexternalwritetomakefile{}%
        \tikzexternalwritetomakefile{ALL_FIGURES_#2=\tikzexternal@DOLLARchar(ALL_FIGURE_NAMES:\tikzexternal@PERCENTchar=\tikzexternal@PERCENTchar .#2)}%
        \tikzexternalwritetomakefile{}%
        \tikzexternalwritetomakefile{#1: \tikzexternal@DOLLARchar(ALL_FIGURES_#2)}%
        \tikzexternalwritetomakefile{\tikzexternal@TABchar @echo All #2 images exist now. Use make -B to re-generate them.}%
        \tikzexternalwritetomakefile{}%
    },
    external/add fig rule/.code args={.#1 depends: .#2,cmd:#3}{%
        \tikzset{%
            external/system call/.add={}{\noexpand\@firstoftwo ^^J},
            external/system call/.add={}{\noexpand\@firstoftwo ^^J\image.#1: \image.#2},
            external/system call/.add={}{^^J#3}
        }
    }
}
\makeatother
\tikzset{
    external/new make rule={make allimagespng; ext .png},
    external/add fig rule={.png depends: .pdf,cmd:convert -density 300 "\image.pdf" "\image.png"}
}
\begin{document}
\begin{tikzpicture}
  \begin{axis}
    \addplot coordinates {(1,20)(2,23)(3,24.5)};
  \end{axis}
\end{tikzpicture}
\end{document}

希望这能澄清我所寻找的内容。如果任何人有任何意见或更好的方法,请添加!!!:)

相关内容