在我的图表中,我有一些经常重复使用的组件,因此在 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
放置“和”。Source
Sink
\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}