为 TikZ 图片指定一个名称以便重复使用

为 TikZ 图片指定一个名称以便重复使用

如果我想重复使用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}

结果:

重复使用 tikzpictures

答案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 关于使用盒子解决这个问题的提示。希望我能帮到你。

相关内容