排列嵌套的 tikz 环境或如何摆脱它们

排列嵌套的 tikz 环境或如何摆脱它们

在我的图表中,我有一些经常重复使用的组件,因此在 tikz 中为它们创建了“宏”。我目前的代码使用嵌套的 tikzpicture 环境,并没有完全按照预期工作。你有什么建议可以改进这一点吗?

我发现了其他问题,但似乎没有一个能帮助我?

我的代码

\documentclass[]{article}

% tikz
\usepackage{tikz}
\usetikzlibrary{positioning} %relative positioning
\usetikzlibrary{fit} %box around multiople nodes
\usetikzlibrary{calc} %complex positioning
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\begin{document}

\begin{tikzpicture}[
block/.style={draw},
container/.style={inner sep=0,},
]

\def\EDFA{
\begin{tikzpicture}[scale=0.25]
\draw (-1,1) --  (1,0) --  (-1,-1) -- (-1,1);
\node[anchor=north,inner sep=2pt] at (0,-1) {$1$};
\end{tikzpicture}
}


\node[block] (source) {Source};

\node[container,right= of source] (edfa) {\EDFA};

\node[block, right= of edfa] (sink) {Sink};

\draw[->] (source) -- (edfa);
\draw[->] (edfa) -- (sink);

\end{tikzpicture}

\end{document}

更新 我现在有这个代码,有没有一种 tex-ninja 方法可以摆脱辅助坐标?

\documentclass[]{独立}

%tikz
\usepackage{tikz}
\usetikzlibrary{positioning} %相对定位

\开始{文档}

\tikz设置{%
    EDFA/.pic={
        \开始{范围}[比例=.5,移位={(1,0)}]
        \draw (-1,0) 坐标 (-in) -- (-1,1) -- (1,0) 坐标 (-out) -- (-1,-1) -- 循环;
        \node[anchor=north,inner sep=2pt] 在 (0,-1) {EDFA} 处;
        \结束{范围}
    },
    耦合器/.pic={
        \开始{范围}[比例=.5,移位={(1,-1)}]
        \draw (-1,1) 坐标 (-in1) 到[out=0,in=180] (0,0) 到[out=0,in=180] (1,1) 坐标 (-out1);
        \draw (-1,-1) 坐标 (-in2) 到[out=0,in=180] (0,0) 到[out=0,in=180] (1,-1) 坐标 (-out2);
        \结束{范围}
    }
}

\开始{tikzpicture}[
块/.style={draw},
]


\node[block] (源) {源};

\path 坐标[right=of source](助手 a);
\draw (helper a) pic (edfa) {EDFA};

\path 坐标[right=of edfa-out](助手 b);
\draw(helper b)pic(耦合器){耦合器};


\node[block, right= of coupler-out1] (sink) {Sink};

\draw[->] (源)—— (edfa-in);
\draw(edfa-out)--(耦合器输入1);
\draw[->] (耦合器输出1) -- (接收器);

\结束{tikzpicture}

\结束{文档}

答案1

正如解释的那样如何在 tikz 节点内绘制形状? pics可用于定义新对象。我使用图片的主要问题是如何将它们放置在您想要的位置,因为它们并不在您想要的位置,nodes而且定位它们并不容易。

以下代码显示如何定义EDFA块。

    EDFA/.pic={
        \begin{scope}[scale=.5]
        \draw (-1,0) coordinate (in) --  (-1,1) -- (1,0) coordinate (out) --  (-1,-1) -- cycle;
        \node[anchor=north,inner sep=2pt] at (0,-1) {$1$};
        \end{scope}

在这种情况下,坐标 (-1,0) 将充当west锚点和1,0东。两个点将有一个特殊名称以供进一步参考。每个点都pic根据其自己的原点放置(0,0)。您可以使用 Claudio 的答案来固定 TiKZ 图片以便更好地定位。

由于您的示例很简单,我更喜欢用星号开头并在其后EDFA放置“和”。SourceSink

\documentclass[]{article}

% tikz
\usepackage{tikz}
\usetikzlibrary{positioning} %relative positioning

\begin{document}

\tikzset{%
    EDFA/.pic={
        \begin{scope}[scale=.5]
        \draw (-1,0) coordinate (in) --  (-1,1) -- (1,0) coordinate (out) --  (-1,-1) -- cycle;
        \node[anchor=north,inner sep=2pt] at (0,-1) {$1$};
        \end{scope}
    }
}

\begin{tikzpicture}[
block/.style={draw},
]

\draw pic (edfa) {EDFA};

\node[block, left=of edfain] (source) {Source};

\node[block, right= of edfaout] (sink) {Sink};

\draw[->] (source) -- (edfain);
\draw[->] (edfaout) -- (sink);

\end{tikzpicture}

\end{document}

在此处输入图片描述

我理解您的组件比更复杂,EDFA因为对于这种特殊情况,isosceles triangle带有的节点label将完成工作,并且可以用作node而不是pic

\documentclass[]{article}

% tikz
\usepackage{tikz}
\usetikzlibrary{positioning} %relative positioning
\usetikzlibrary{shapes.geometric}

\begin{document}

\begin{tikzpicture}[
    block/.style={draw},
    edfa/.style={isosceles triangle, minimum width=1cm, 
         draw, anchor=west, isosceles triangle stretches, 
         minimum height=1cm, label=-80:#1}
]

\node[block] (source) {Source};

\node[edfa=1, right=of source] (edfa) {};

\node[block, right= of edfa] (sink) {Sink};

\draw[->] (source) -- (edfa);
\draw[->] (edfa) -- (sink);

\end{tikzpicture}

\end{document}

相关内容