通过使用 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
。
只要您可以使用Makefile
s,这个问题在 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]
这将执行以下操作:
- 在第一次编译时,每个
tikzpicture
都会获得一个指定的名称,并且作业调用的相应条目会添加到一个名为的单独的 makefile 中:\jobname.makefile
。tikzpicture
它不会像库通常所做的那样,在单独的命令中实际编译external
,而是会插入一个文本,显示图像已被丢弃:[[ 由于 `/tikz/external/mode=list and make' 而丢弃的图像 ]]
- 第二次运行时会发生同样的事情,图像将不会被排版。
- 您必须调用该命令
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}
希望这能澄清我所寻找的内容。如果任何人有任何意见或更好的方法,请添加!!!:)