![TikZ-宏绘制的图像定位错误](https://linux22.com/image/266019/TikZ-%E5%AE%8F%E7%BB%98%E5%88%B6%E7%9A%84%E5%9B%BE%E5%83%8F%E5%AE%9A%E4%BD%8D%E9%94%99%E8%AF%AF.png)
关于 TikZ 中如何定位,这可能是一个蹩脚的问题。我正在尝试绘制一些电气的东西(从单个门的级别开始),并且由于其中许多东西一遍又一遍地重复,所以我想定义宏来绘制它们。我有这个简单的东西:
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\def\halfadderplain{%
\draw +(0,2) -- +(3,2);
\draw +(0,1) -- +(3,1);
\draw +(0,0) -- +(3,0);
\draw +(0.5,-0.5) [fill=white] rectangle +(2.5,2.5);
\node at +(1.5,1) {QHA};
}
\begin{tikzpicture}
\coordinate (0,0);
\halfadderplain;
\coordinate (3,3);
\halfadderplain;
\end{tikzpicture}
\end{document}
我希望它执行以下操作:我设置一个起始坐标并调用宏来绘制组件,然后我将坐标设置在其他地方并再次调用绘制。我希望最终绘制出两个组件,如下所示:
但结果却只是:
我尝试使用 \newcommand 并参数化 \halfadderplain 来设置坐标,结果正确。我还尝试用其定义替换上述代码中的 \halfadderplain,但什么也没发生,所以我认为这不是宏的问题,只是我对 TikZ 如何计算位置的误解。有人能帮忙吗?
(请注意,使用某些特定的库来绘制这类东西对我来说不是一个解决方案。)
答案1
这是一个肮脏的解决方案,需要手动放置半加器单元;使用 TikZ 形状一定可以实现更聪明的解决方案......
编辑:根据 Peter Grill 的评论,我删除了第二个(无用的)第二个参数。
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\def\halfadderplain#1{%
\begin{scope}[xshift=#1]
\draw +(0,2) -- +(3,2);
\draw +(0,1) -- +(3,1);
\draw +(0,0) -- +(3,0);
\draw +(0.5,-0.5) [fill=white] rectangle +(2.5,2.5);
\node at +(1.5,1) {QHA};
\end{scope}
}
\begin{tikzpicture}
\halfadderplain{0};
\halfadderplain{3cm};
\end{tikzpicture}
\end{document}
答案2
所有路径都无法相互识别。您指定的第一个坐标与\coordinate …;
后续路径无关(定位除外)。
您可以在一条路径上执行此操作:
\documentclass[tikz]{standalone}
\begin{document}
\def\halfadderplain{
\foreach \y in {0,1,2} {+(0,\y) -- +(0.5,\y) +(2.5,\y) -- +(3,\y)}
+(0.5,-0.5) rectangle +(2.5,2.5)
node [midway] {QHA}
}
\begin{tikzpicture}
\draw (0,0) \halfadderplain;
\draw (3,0) \halfadderplain;
\end{tikzpicture}
\end{document}
或者作为一种insert path
风格:
\documentclass[tikz]{standalone}
\begin{document}
\tikzset{
halfadderplain/.style={
insert path={
\foreach \y in {0,1,2} {+(0,\y) -- +(0.5,\y) +(2.5,\y) -- +(3,\y)}
+(0.5,-0.5) rectangle +(2.5,2.5)
node [midway] {QHA}
}
}
}
\begin{tikzpicture}
\draw (0,0) [halfadderplain];
\draw (3,0) [halfadderplain];
\end{tikzpicture}
\end{document}
输出
答案3
可以减少代码:像其他答案一样放置节点的方法是使用xshift
,所有坐标都被修改。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[qha/.style={minimum width= 2cm, minimum height= 3cm,draw,fill=white}]
\draw \foreach \y in {0,...,2} {(0,\y) -- (6,\y)};
\foreach \y in {0,3} \node[qha,xshift=\y cm] at (1.5,1) {QHA};
\end{tikzpicture}
\end{document}
另一种风格的变体是:
\begin{tikzpicture}[qha/.style={minimum width= 2cm, minimum height= 3cm,draw,fill=white,xshift=#1}]
\draw \foreach \y in {0,...,2} {(0,\y) -- (6,\y)};
\foreach \y in {0,3} \node[qha=\y cm] at (1.5,1) {QHA};
\end{tikzpicture}
备注:最好避免\foreach
仅使用两个节点的第二种情况。