问题。在 TikZ 中,如果使用形式为 (x,y)+(0.5*rand,0.5*rand) 的坐标,是否可以恢复上次编译时用于生成 pdf 的坐标?
评论。
- 这似乎是一个难题。原则上,应该可以做到这一点(信息就在那里),尽管看起来必须对 TikZ 的内部工作原理有深入的了解。如果我没有忽略一些简单的事情(我很可能正在做),那么这是为了以某种方式将您正在使用的有限状态机的状态映射到明确的可编译的 TikZ 代码。
问题含义的一个例子是:假设你已经编写了 TikZ 代码,使用随机坐标,使用 'rand' 函数来模拟 随机几何图,假设你希望保存代码的特定“运行”。(“保留”的意思是“创建明确的确定性 TikZ 代码,它将永远重新创建这个特定的 pdf。”)你现在面临以下情况:你有 pdf(当然你可以保存),但(实际上)不当前代码的未来运行将重现此特定 pdf。如何才能从正在使用的机器的当前状态转到重新创建此 pdf 的明确 TikZ 代码?
我知道 TikZ 允许与所用伪随机数生成器的“种子”进行交互,我也知道手册中提到了这一点。但我无法将其变成一个实用的解决方案。问题实际上是:假设您正在盯着您想要保留的“运行”(在上述意义上)。原则上,信息应该是可恢复的,但如何恢复呢?
答案1
当前随机种子存储在\pgfmath@rnd@z
(见如何获取 tikzpicture 中使用的随机种子?)。您可以使用设置种子\pgfmathsetseed
。因此,对于给定的运行,您可以显示种子(在 pdf 中或在控制台和日志文件中),如果您愿意,您可以记住该值并将其设置为新的运行。
示例(网络代码来自我如何随机扰乱节点网格的位置?):
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
% pseudo-random seed value, uncomment to create new random graph
%\pgfmathsetseed{\number\pdfrandomseed}
% fixed seed value, use to reproduce graphs
\pgfmathsetseed{856811429}
\tikzset{
small-node/.style={
shape=circle,
fill=white,
draw,
minimum size=+4mm}
}
\begin{document}
\begin{tikzpicture}
% define macro to retrieve current seed
\makeatletter
\def\pgfcurrentseed{%
\pgfmathparse{\pgfmath@rnd@z}\pgfmathresult%
}
\makeatother
% call the macro
\pgfcurrentseed
% print in console and in log file
\typeout{Current seed: \pgfmathresult}
% print in pdf
%\node (a) at (7,0) {Current seed is \pgfcurrentseed};
\foreach \i in {0,...,4}
\foreach \j in {0,...,4}
\node [small-node] (n-\i\j) at (\i + 0.5*rand,\j + 0.5*rand) {};
\foreach \i in {0,...,4}
\foreach \j [count=\jj] in {0,...,3}
\draw (n-\i\j) -- (n-\i\jj) (n-\j\i) -- (n-\jj\i);
\end{tikzpicture}
\end{document}
pdf:
控制台和日志文件(接近末尾):
Current seed: 856811429
[1] (./randomgraph.aux) )
(see the transcript file for additional information)
Output written on randomgraph.pdf (1 page, 4538 bytes).