如果我想重复使用TikZ
图片,我通常会定义一个新命令,例如
\newcommand{\mypic}{%
\begin{tikzpicture}
%...
\end{tikzpicture}%
}%
然后我稍后通过 重新使用它\mypic
。
但是我认为这不太优雅。所以我的问题是,是否可以通过一个键为图片分配一个名称,然后可以调用它来在其他地方重复使用图片?例如:
\begin{tikzpicture}[rname=mypic]
%...
\end{tikzpicture}
\mypic
并像或 类似的方式重复使用它\rtikz{mypic}
。
如果我能做这样的事情就更好了\rtikz[scale=0.5,every label/.style={red}]{mypic}
。
答案1
将您的TiKZ
图形声明为,pic
并在需要时多次重复使用。
\documentclass{article}
\usepackage{tikz}
\tikzset{
mygauss/.pic={
\draw[yscale=2.0,yshift=-3,xscale=0.1,domain=0:10] plot[id=gauss1]
function{exp(-(x-5)*(x-5)/2/2/2.0)/sqrt(pi)/2};
\draw[yscale=2.0,yshift=-3,xscale=0.1,domain=5:15] plot[id=gauss2]
function{exp(-(x-10)*(x-10)/2/2/2.0)/sqrt(pi)/2};
}}
\begin{document}
This is my \tikz \pic{mygauss}; which can be easly repeated here: \tikz \pic{mygauss}; or with variants like \tikz \pic[red]{mygauss}; or \tikz \pic[blue,dashed]{mygauss};.
\end{document}
答案2
(必须承认,与仅仅定义一个新命令相比,这似乎有点复杂......)
这是执行您所要求的操作的方法:在主 tikzpicture 上使用键。它很可能会中断!它tikzpicture
使用 Will Robertson 的environ
包重新定义环境。此包将环境转换为宏,使其内容更容易按书面形式保存。所以我们这样做是为了获取内容。使用它就是恢复环境的原始含义tikzpicture
并简单地执行保存的宏。
\documentclass{article}
%\url{http://tex.stackexchange.com/q/56664/86}
\usepackage{tikz}
\usepackage{environ}
\makeatletter
\let\orig@tikzpicture=\tikzpicture
\let\orig@endtikzpicture=\endtikzpicture
\let\env@tikzpicture@save@env=\pgfutil@empty
\let\env@tikzpicture@process=\pgfutil@empty
\RenewEnviron{tikzpicture}[1][]{%
\begingroup
\let\tikzpicture=\orig@tikzpicture
\let\endtikzpicture=\orig@endtikzpicture
\let\tikz@picname=\pgfutil@empty
\begin{tikzpicture}[#1]
\BODY
\end{tikzpicture}
\ifx\tikz@picname\pgfutil@empty
\else
\expandafter\gdef\csname tikz@savedpic@\tikz@picname\expandafter\endcsname\expandafter{\BODY}
\fi
\endgroup
}
\newcommand\usetikzpicture[2][]{%
\begingroup
\let\tikzpicture=\orig@tikzpicture
\let\endtikzpicture=\orig@endtikzpicture
\let\tikz@picname=\pgfutil@empty
\begin{tikzpicture}[#1]
\csname tikz@savedpic@#2\endcsname
\end{tikzpicture}
\endgroup}
\tikzset{
save picture as/.code={
\gdef\tikz@picname{#1}%
}
}
\makeatother
\begin{document}
\begin{tikzpicture}[save picture as=mypic]
\draw (0,0) -- (1,1);
\end{tikzpicture}
\usetikzpicture[every path/.style={red}]{mypic}
\end{document}
结果:
答案3
创建一组适当的 PGF 密钥。
\pgfkeys{/pictures/.is family}
\def\cxset{\pgfqkeys{/pictures}}
\cxset{bar chart scale/.store in=\barchartscale@my,
bar chart/.store in=\barchartcolor@my,
bar chart font/.store in=\barchartfont@my,
bar chart draw/.code=\mypic}
您将无法避免使用新命令来存储原始命令,
\newcommand{\mypic}{%
\begin{tikzpicture}
%...
\end{tikzpicture}%
}%
但是,这样您可以定义任意数量的变量,并节省大量输入。发挥您的想象力,设计一个易于记忆的界面。例如,我正在开发一个应用程序,它将页面参数叠加在页面上,如下所示:
可以设置的一些参数如下:
\cxset{geometry lines color=orange,
geometry show grid,
geometry grid=10,
geometry units=cm}
这种方法的另一个优点是,所有样式和宏都放在样式文件中。您只需使用 进行绘制cxset{}
,您可以使用适当的语义对其进行命名。
到目前为止,效果很好。
答案4
使用一个盒子来保存它,这里是一个 MWE:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\begin{document}
\newsavebox{\mypicture}
\begin{lrbox}{\mypicture}
\begin{tikzpicture}[auto,>=latex']
\tikzstyle{block} = [draw, shape=rectangle, minimum height=3em, minimum width=3em, node distance=2cm, line width=1pt]
\tikzstyle{block1} = [draw,shape=rectangle, minimum height=3em, minimum width=3em, node distance=3cm, line width=1pt]
\tikzstyle{sum} = [draw, shape=circle, node distance=1.5cm, line width=1pt, minimum width=1.25em]
\tikzstyle{branch}=[fill,shape=circle,minimum size=4pt,inner sep=0pt]
\node at (-2.5,0) (input) {$x[n]$};
\node [block] (h1) {$h_1[n]$};
\node [block, right of=h1] (h2) {$h_2[n]$};
\node [sum, right of=h2] (sum) {};
\node at (sum) (plus) {{\footnotesize$+$}};
\node at (5,0) (output) {$y[n]$};
\path (h1) -- coordinate (med) (h2);
\path (input) -- coordinate(branch1) (h1);
\node [block, below of=med] (h3) {$h_3[n]$};
\begin{scope}[line width=1pt]
\draw[->] (input) -- (h1);
\draw[->] (h1) -- (h2);
\draw[->] (h2) -- (sum);
\draw[->] (sum) -- (output);
\draw[->] (branch1) node[branch] {} |- (h3);
\draw[->] (h3) -| (sum);
\end{scope}
\end{tikzpicture}
\end{lrbox}
\usebox{\mypicture}\par\vspace{10pt}
Lalalalalala\par\vspace{10pt}
\usebox{\mypicture}
\end{document}
它生成:
我想你会记住@Martin Scharrer 关于使用盒子解决这个问题的提示。希望我能帮到你。