使用 Circuitikz 以整洁的方式绘制线条和圆圈

使用 Circuitikz 以整洁的方式绘制线条和圆圈

我对封装非常陌生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}

虽然画出来的图还可以,可以接受,但我并不完全满意。下面,我记下了有关逻辑电路的问题:

  1. Point 1图 1 中那样,如何绘制图 2 中的气泡Point 2?我试过,但\draw (1, -0.3) o- (not_1.in);没有成功。相反,它显示了一些额外的错误,并且没有渲染线条。
  2. 如何在图2中的Point 3、、和处绘制空心Point 4圆?Point 5Point 6
  3. 有没有办法标记一个\draw ;命令,以便我们以后可以调用它,就像我们对\node[] (node_label){};命令所做的那样?例如,在图 2 中,我标记了和 1节点使用,并且我在和(and_1)这样的地方调用过它。\draw (x1) -- (and_1.in 1);\draw (and_1.out) |- (or_1.in 1);
  4. 如果你注意到,把非门放在和 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;这就是 TiZ 写为(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}

在此处输入图片描述

相关内容