![自动缩放 Tikz-Picture 并使用外部化](https://linux22.com/image/240761/%E8%87%AA%E5%8A%A8%E7%BC%A9%E6%94%BE%20Tikz-Picture%20%E5%B9%B6%E4%BD%BF%E7%94%A8%E5%A4%96%E9%83%A8%E5%8C%96.png)
我需要自动缩放 Tikz 图片,并使用以下自定义环境执行此操作:
% Automagically scale a Tikz picture, so it has the desired (given) width.
% Does NOT scale line width/text width! Needs the package "environ"!
%
% Usage:
%
% \begin{myscaletikzwidth}{\textwidth}
% \begin{tikzpicture}[scale=\tikzscale]
% ..
% \end{tikzpicture}
% \end{myscaletikzwidth}
%
\makeatletter
\newsavebox{\measure@tikzpicture}
\NewEnviron{myscaletikzwidth}[1]{%
\def\tikz@width{#1}%
\def\tikzscale{1}\begin{lrbox}{\measure@tikzpicture}%
\BODY
\end{lrbox}%
\pgfmathparse{#1/\wd\measure@tikzpicture}%
\edef\tikzscale{\pgfmathresult}%
\BODY
}
\makeatother
该代码运行得很好,但是当我打开外部化时它就不再起作用了(图形将以其原始大小创建)。
如何使自动缩放与外部化协同工作?
我正在使用较新版本的 Tikz 中引入的现代外部化方法(“\tikzexternalize”)。
也许可以将“\def\tikzscale{MyDeterminedScaleFactor}”写入外部文件,然后输入该文件?
你能帮我一下吗?
答案1
问题是,external
图书馆会自动为遇到的每一个图像分配名称tikzpicture
- 但就您而言,您实际上有一个名称和两张图片。
人们可以考虑一种解决方案,为所涉及的两张图片分别分配单独的文件名 - 但这是浪费时间,因为您永远不会对第一张图片感兴趣。
因此,我建议采用以下解决方案:我们检查当前是否正在生成外部图片。如果是,我们将始终排版第一个图片(这是确定图片大小所必需的),并将第二个图片外部化。如果我们当前没有导出(当前)图片,我们可以放心地假设手头有一张外部图片 - 然后使用它。
这是修改。它要求\usetikzlibrary{external}
已加载(尽管不一定需要处于活动状态)。
% Automagically scale a Tikz picture, so it has the desired (given) width.
% Does NOT scale line width/text width! Needs the package "environ"!
%
% Usage:
%
% \begin{myscaletikzwidth}{\textwidth}
% \begin{tikzpicture}[scale=\tikzscale]
% ..
% \end{tikzpicture}
% \end{myscaletikzwidth}
%
\makeatletter
\newsavebox{\measure@tikzpicture}
\NewEnviron{myscaletikzwidth}[1]{%
\tikzifexternalizingnext{%
\def\tikz@width{#1}%
\def\tikzscale{1}\begin{lrbox}{\measure@tikzpicture}%
\tikzset{external/export next=false,external/optimize=false}% force translation of this BODY (and do not optimize it away as it would usually do):
\BODY
\end{lrbox}%
\pgfmathparse{#1/\wd\measure@tikzpicture}%
\edef\tikzscale{\pgfmathresult}%
\BODY
}{% this will re-use an existing external graphics:
\BODY
}%
}
\makeatother
编辑:你说得对,这个包有问题todonotes
。它(不幸的是)与 tikzexternal
图像不兼容。显然,
\usepackage{todonotes}
\makeatletter
\renewcommand{\todo}[2][]{%
\tikzexternaldisable\@todo[#1]{#2}\tikzexternalenable%
}
\makeatother
在这里提供帮助。