这是Tikz externalize 中的草稿模式会隐藏图形,但没有 externalize 则不会
我正在写一篇很长的文档,编译需要时间。一些图以 tikz 格式包含(从 matlab2tikz 导出),其他图像则直接包含在内\includegraphics
。我使用的是 latex -> dvips -> ps2pdf 工作流程。为了加快速度,文档处于草稿模式(大多数情况下,我对查看所有图像不感兴趣)。为了加快 tikz 速度,外部化工作正常。
然而,正如Tikz externalize 中的草稿模式会隐藏图形,但没有 externalize 则不会,tikz-draft 导致框变小。原始图形大小似乎丢失,文档开始移动很多。
我收到警告:
Package pgf Warning: Missing width for image "pgflastimage" ("images/tikz/figure8") in draft mode.
(pgf) Using 1cm instead on input line 980.
Package pgf Warning: Missing height for image "pgflastimage" ("images/tikz/figure8") in draft mode.
(pgf) Using 1cm instead on input line 980.
结果只是一个小盒子。它似乎正在尝试找到正确的盒子大小,但失败了。有没有办法解决或修复这个错误?
我的外化是通过
\tikzset{external/system call={latex \tikzexternalcheckshellescape -halt-on-error
-interaction=batchmode -jobname "\image" "\texsource" &&
dvips -o "\image".ps "\image".dvi && ps2eps "\image".ps;}}
可生成优质的 .eps 图像。生成的图像质量很好,并且当手动添加时,框的大小也正确\includegraphics{figure0.eps}
。
以下是一种可能的破解方法。首先,我\subimport{path}{filename.tikz}
根据包将我的图表与子目录一起放入import
。
基于这个想法,我开始用包含以下内容替换此\tikzimport{path}{filename.tikz}
导入
\newcommand{\tikzimport}[2]{%
\ifdraft{%
% create counter, increment
\newstepcounter{\pgfkeysvalueof{/tikz/external/figure name}}%
% define next filename of externalized tikz file
\def\mynextfile{images/tikz/%
\pgfkeysvalueof{/tikz/external/figure name}%
\arabic{\pgfkeysvalueof{/tikz/external/figure name}}.eps}%
% check is file is there, then includegraphics the file
% as we are in draft, this gives a nice box
\IfFileExists{\mynextfile}{% show tikz
\includegraphics[scale=1]{\mynextfile}}{% fallback
\mbox{\nolinkurl{\mynextfile}}
}
}{% nodraft
\subimport{#1}{#2}%
}
这需要ifdraft
包和每个后缀的计数器figure name
。创建计数器(如果不存在)可以通过以下方式实现
\makeatletter
\def\newstepcounter#1{%
\@ifundefined{c@#1}{%
\newcounter{#1}}{%
\stepcounter{#1}}%
}
\makeatother
问题
这实在不太好……
tikz 外部化前缀是硬编码的,我不知道如何从 tikz 内部提取前缀。前缀由设置,
\tikzexternalize[prefix=images/tikz/]
但\pgfkeys{/tikz/external/prefix}
返回为空我有一些图形没有被外部化,因为如果被外部化,它们会返回错误。如果每个图形都启用了外部化,那么每次调用时都进行测试会很好。
我累了
\newif\isexternal
\pgfkeys{/tikz/external/export/.is if=isexternal}
\isexternal
external
\else
not external
\fi
但这个测试的结果总是错误的。