我对封装非常陌生Circuitikz
。我必须绘制如下所示的电路(图 1)。
Fig. 1: Original Circuit
在互联网的帮助下,我能够以某种方式绘制所需的电路,如下图所示(图 2)。
Fig. 2: My Drawn Circuit
这是我用来绘制图 2 的代码。
\documentclass[12pt]{article}
\usepackage[siunitx]{circuitikz}
\ctikzset{
logic ports=ieee
}
\begin{document}
\begin{circuitikz} [line width=1pt]
\node[and port](and_1) at (3,0) {\footnotesize AND 1};
\node[and port](and_2) at (3,-4) {\footnotesize AND 2};
\node[not port, rotate=-90](not_1) at (1,-2) {\tiny NOT};
\node[or port](or_1) at (6,-2) {\footnotesize OR};
\node[left, xshift=-60pt] at (and_1.in 1) (x1) {$x_1$};
\node[left, xshift=-60pt] at (and_1.in 2) (x2) {$x_2$};
\node[left, xshift=-60pt] at (and_2.in 2) (x3) {$x_3$};
\node[right] at (or_1.out) {$f$};
\draw (x1) -- (and_1.in 1);
\draw (x2) -- (and_1.in 2);
\draw (x3) -- (and_2.in 2);
\draw (1, -0.3) -- (not_1.in);
\draw (not_1.out) -- ++(0, -0.85) -- (and_2.in 1);
\draw (and_1.out) |- (or_1.in 1);
\draw (and_2.out) |- (or_1.in 2);
\end{circuitikz}
\end{document}
虽然画出来的图还可以,可以接受,但我并不完全满意。下面,我记下了有关逻辑电路的问题:
- 像
Point 1
图 1 中那样,如何绘制图 2 中的气泡Point 2
?我试过,但\draw (1, -0.3) o- (not_1.in);
没有成功。相反,它显示了一些额外的错误,并且没有渲染线条。 - 如何在图2中的
Point 3
、、和处绘制空心Point 4
圆?Point 5
Point 6
- 有没有办法标记一个
\draw ;
命令,以便我们以后可以调用它,就像我们对\node[] (node_label){};
命令所做的那样?例如,在图 2 中,我标记了和 1节点使用,并且我在和(and_1)
这样的地方调用过它。\draw (x1) -- (and_1.in 1);
\draw (and_1.out) |- (or_1.in 1);
- 如果你注意到,把非门放在和 1门的第二个输入线和和 2门的第一个输入行,我不得不像
\draw (1, -0.3) -- (not_1.in);
和一样对绘图位置进行硬编码\draw (not_1.out) -- ++(0, -0.85) -- (and_2.in 1);
。现在我的问题是,有没有更好的方法来实现这一点(以更强大和自动化的方式),以便将非门放置在和 1门的第二个输入线等等?
答案1
首先欢迎大家的光临!
您可以将极点(即“连接点”或“开点”的名称)放置在您想要的任何位置\node[circ] at (coordinate){}
(或ocirc
用于开点)。但是您构建电路的方式使得识别坐标变得困难。
例如,你定位一个节点(x1)
,然后从该节点开始绘制——注意,线将从节点开始边界,而不是从精确的坐标。我将以这种方式从端口绘制:
\draw (and_1.in 1) -- ++(-60pt,0) coordinate(x1) node[left]{$x_1$};
现在你可以使用short
双极子来代替--
添加极点:
\draw (and_1.in 1) to[short, -o] ++ (-60pt, 0) coordinate(x1) node[left]{$x_1$};
现在,黑点所在的位置就是水平方向与 处于同一水平、x2
垂直方向在 上的坐标not_1.in
;这就是 Ti钾Z 写为(x2 -| not_1.in)
。
所以:
\documentclass[12pt]{article}
\usepackage[siunitx]{circuitikz}
\ctikzset{logic ports=ieee}
\begin{document}
\begin{circuitikz} [line width=1pt]
\node[and port](and_1) at (3,0) {\footnotesize AND 1};
\node[and port](and_2) at (3,-4) {\footnotesize AND 2};
\node[not port, rotate=-90](not_1) at (1,-2) {\tiny NOT};
\node[or port](or_1) at (6,-2) {\footnotesize OR};
\draw (and_1.in 1) to[short, -o] ++ (-60pt, 0) coordinate(x1) node[left]{$x_1$};
\draw (and_1.in 2) to[short, -o] ++ (-60pt, 0) coordinate(x2) node[left]{$x_2$};
\draw (and_2.in 2) to[short, -o] ++ (-60pt, 0) coordinate(x3) node[left]{$x_3$};
\node[ocirc] at (or_1.out) {};
\node[right] at (or_1.out) {$f$};
\draw (x2 -| not_1.in) to[short, *-] (not_1.in);
\draw (not_1.out) |- (and_2.in 1);
\draw (and_1.out) |- (or_1.in 1);
\draw (and_2.out) |- (or_1.in 2);
\end{circuitikz}
\end{document}
(线宽会在 okular 上产生可怕的抗锯齿效果,抱歉......)
对于第 4 点,您可以使用inline not
:
\documentclass[12pt]{article}
\usepackage[siunitx]{circuitikz}
\ctikzset{logic ports=ieee}
\begin{document}
\begin{circuitikz} [line width=1pt]
\node[and port](and_1) at (3,0) {\footnotesize AND 1};
\node[and port](and_2) at (3,-4) {\footnotesize AND 2};
\node[or port](or_1) at (6,-2) {\footnotesize OR};
\draw (and_1.in 1) to[short, -o] ++ (-60pt, 0) coordinate(x1) node[left]{$x_1$};
\draw (and_1.in 2) to[short, -o] ++ (-60pt, 0) coordinate(x2) node[left]{$x_2$};
\draw (and_2.in 2) to[short, -o] ++ (-60pt, 0) coordinate(x3) node[left]{$x_3$};
\node[ocirc] at (or_1.out) {};
\node[right] at (or_1.out) {$f$};
\draw (x2) ++(1,0) coordinate(tmp) to[inline not={\tiny NOT}, *-] (tmp |-and_2.in 1) -- (and_2.in 1);
\draw (and_1.out) |- (or_1.in 1);
\draw (and_2.out) |- (or_1.in 2);
\end{circuitikz}
\end{document}
您还可以使用以下表达式计算c1
和之间的中间坐标......c2
($(c1)!0.5!(c2)$)
答案2
通过使用相对坐标和inline port
。仅用于练习(因为很难与包作者的答案竞争(+1);-):
\documentclass[border=3.141592]{standalone}
\usepackage[siunitx]{circuitikz}
\ctikzset{logic ports=ieee}
\usetikzlibrary{positioning}
\begin{document}
\begin{circuitikz}[font=\scriptsize,
node distance=4mm,
]
\draw (0,0) coordinate[label=left:$x_2$] (in_2)
to[short, o-*] ++ (1,0) coordinate (aux-1)
-- ++ (0.5,0) node[and port, anchor=in 2] (and_1) {AND 1}
(in_2 |- and_1.in 1) node[left] {$x_1$}
to[short, o-] (and_1.in 1)
%
(aux-1) to[inline not=NOT, component text=left, name=not] ++ (0,-3)
-- ++ (0.5,0) node[and port, anchor=in 1] (and_2) {AND 2}
(and_2.in 2) to[short, -o] (and_2.in 2 -| in_2)
node[left] {$x_3$};
\node[or port, right=of not -| and_1.out] (or) {OR};
\draw (or.out) to[short, -o] ++ (0.5,0) node[right] {$f$}
(and_1.out) |- (or.in 1)
(and_2.out) |- (or.in 2);
\end{circuitikz}
\end{document}