私のダイアグラムには、頻繁に再利用するコンポーネントがいくつかあるため、それらのコンポーネント用に 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パッケージ \usetikzlibrary{positioning} %相対位置 \begin{ドキュメント} \tikzset{% EDFA/.pic={ \begin{スコープ}[スケール=.5, シフト={(1,0)}] \draw (-1,0) 座標 (-in) -- (-1,1) -- (1,0) 座標 (-out) -- (-1,-1) -- 循環; \node[anchor=north,inner sep=2pt] (0,-1) {EDFA}; \end{スコープ} }, カプラー/.pic={ \begin{スコープ}[スケール=.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); \end{スコープ} } } \begin{tikzpicture}[ ブロック/.style={draw}, ] \node[ブロック] (ソース) {ソース}; \path 座標[ソースの右] (ヘルパー a); \draw (ヘルパー a) pic (edfa) {EDFA}; \path 座標[edfa-out の右] (ヘルパー b); \draw (helper b) pic (coupler) {カプラー}; \node[block, coupler-out1の右=] (sink) {Sink}; \draw[->] (ソース) -- (edfa-in); \draw (edfa-out) -- (coupler-in1); \draw[->] (カプラ出力1) -- (シンク); \end{tikzpicture} \end{ドキュメント}
答え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
あなたの例は単純なので、 andで始まりSource
、Sink
その後にand を置くことを好みます。
\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}