哪种做法更好:即时渲染图形,还是将其作为图像导入?

哪种做法更好:即时渲染图形,还是将其作为图像导入?

在使用 LaTeX 进行科学写作时,我陷入了哲学困境。起初,我尝试在编译时用 LaTeX 渲染所有图形,例如使用 PGFPlots 制作图表,而不是从 Excel 导入。然而,当我开始更大的项目时,我的编译时间呈指数级增长,而且我听说许多人更喜欢在图形中使用预渲染图像,而不是在编译时渲染图形。对于包含许多图表的大型项目来说,哪种做法更好?

我现在正在进行的项目包括 circuitikz 中的一些图表和电路图,用于提供一定程度的背景信息。我还在考虑采用 LaTeX 中设计的图形,将它们导出为图像,然后将它们重新导入到最终文档中。谢谢。

答案1

standalone可以设置为仅在需要时重新编译包含的图片。否则,它将包含之前编译的 PDF。因此,无需切换到\includegraphics以从预编译中受益。

这是一个基本的例子。

图示:

% mytikz.tex
\documentclass[tikz,border=5pt]{standalone}
\usetikzlibrary{cathod}
\begin{document}
  \begin{tikzpicture}
    \pic {cath gorwedd={blue!50}{blue!25}{green}{yellow}{red!20!brown}};
  \end{tikzpicture}
\end{document}

这里真正需要的是tikzpicture环境,但是其余部分在最初处理图像时很方便,并且standalone会在适当的时候忽略它,因此它最好保留下来。

现在主要文件:

\documentclass{article}
\usepackage[mode=buildnew]{standalone}
\usepackage{tikz}
\usetikzlibrary{cathod}
\begin{document}
  \begin{figure}
    \includestandalone{mytikz}
  \end{figure}
\end{document}

如果使用 完成编译-shell-escape,则会发生以下情况:

  • 第一次运行时,将运行单独的编译过程来创建图像的裁剪版本,mytikz.pdf然后将其包含在内\includegraphics{}
  • \includegraphics{}在后续运行中,除非源已发生改变,否则将包含图像,在这种情况下它将首先重新编译。

通过改变的值mode=,可以根据需要定制此行为。

在所有情况下,我都会得到一只可爱的蓝猫:

蓝猫

不过,你也可以用它处理其他猫的图片。即使是非猫内容也可以,至少我是这么理解的。

另一种方法是使用externalTikZ 库来外部化图像。同样,这需要-shell-escape并且可以配置。默认情况下,它还会仅在图形发生变化时重新编译图形。然而,这显然仅限于 PGF/TikZ 图片,而standalone提供了一种更通用的方法。

答案2

在我看来,出版物大多需要预编译的图形。你可以相对轻松地缓解你的困境,方法是将序言和Tikz/PGF图形移动到单独的.tex文件中,并\input在编译时给自己一个选择。例如,你的主文档可能看起来像:

\documentclass{report}
\input{preamble}
\begin{document}
\begin{figure}
  %\includegraphics{pgf_graphic.pdf}
  \input{pgf_graphic.tex}
  \caption{\label{fig:...}...}
\end{figure}
\end{document}

如果您想要预编译,您可以为您的图形制作一个包装器,如下所示:

\documentclass{standalone}
\input{preamble}
\begin{document}
\input{pgf_graphic.tex}
\end{document}

然后,您可以根据需要、心情等将行上的注释与主文档中的注释交换\input{pgf......\includegraphics{pgf...

我这样做了,但我仍在尝试确定最佳的文件结构以使工作流程无缝衔接。

答案3

我目前正在更新一本图解数学概念词典。它包含很多 3D 图形,我知道如果每次编译文档时都保留源代码并生成所有图形,编译时间将大幅增加。

所以我的解决方案是这样的:

我创建了一个单独的 tex 文件,名为“DrawTest.tex”,以便为要包含在字典中的图形和图表编写源代码。一旦我对图表的外观感到满意,我就会生成两个文件:一个带有图表的 PDF 和一个不带序言和行的源代码文件\end{document}。两个文件必须具有相同的名称。并通过以下指令:


% 指示是否需要添加 PDF
%或相应的源代码
\newcounter{最终}
\setcounter{最终}{0}
\newcommand{\insertfigure}[1]{
    \ifthenelse{\thefinal=1}{\input{./source/#1}}{\pgfimage{./gallery/#1.pdf}}
}

当我创建与字典草稿对应的 PDF 时,PDF 文件会作为图像插入。当我完成整个文档时(即完成字典时),最后一次生成它时,我只需要切换计数器的值final,(我通常将其更改为零),然后图形就会从其 latex 源代码生成。

从前面的代码中,不言而喻,tex 文件被保存到名为“source”的文件夹中,而 PDF 则位于名为“gallery”的文件夹中。

文件“DrawTest.tex”的源代码如下:

\documentclass{文章}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{数学}
\usepackage[active,tightpage]{预览}
\预览环境{tikzpicture}
\setlength\预览边框{0.1pt}
\开始{文档}
\开始{中心}
\开始{tikzpicture}
  % 在此处包含图形的代码行。
\结束{tikzpicture}
\结束{中心}
\结束{文档}

生成该图的 PDF 文件,并将 PDF 复制到“gallery”文件夹中。然后从该代码中删除前言(包括该\begin{document}行)以及最后一行(包括\end{document}说明),这就是“source”文件夹中所需的文件。只需记住将两个文件命名为完全相同的名称即可。

这是我采用的方法,以避免因编制图形而浪费时间。

如果有人提出更好的方法,我会很乐意复制该策略。

相关内容