答案1
以下是我的做法:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{circuitikz}
\usetikzlibrary{calc}
\begin{document}
\begin{circuitikz}
% Gates
\node[and port, no input leads] (A) at (0, 0) {};
\node[and port, no input leads] (B) at (0, -1.5) {};
\node[and port, number inputs=5] (C) at (0, -3) {};
\node[or port, number inputs=5] (D) at (0, -4.5) {};
% Single inputs
\draw ($(A.in 1)!0.5!(A.in 2)$) -- (A.left);
\draw ($(B.in 1)!0.5!(B.in 2)$) -- (B.left);
% identity labels
\node[left] at ($(A.in 1)!0.5!(A.in 2)$) {\(a\)};
\node[right] at (A.out) {\(a\)};
% NOT labels
\node at (B) [ocirc] {};
\node[left] at ($(B.in 1)!0.5!(B.in 2)$) {\(a\)};
\node[right] at (B.out) {\(a'\)};
% AND labels
\node[left] at (C.in 1) {\(a_1\)};
\node[left] at (C.in 2) {\(a_2\)};
\node[left] at ($(C.in 3) + (0, -0.05)$) {\(\vdots\)};
\node[left] at (C.in 5) {\(a_n\)};
\node[right] at (C.out) {\(a_1a_2\dotsm a_n\)};
% OR labels
\node[left] at (D.in 1) {\(a_1\)};
\node[left] at (D.in 2) {\(a_2\)};
\node[left] at ($(D.in 3) + (0, -0.05)$) {\(\vdots\)};
\node[left] at (D.in 5) {\(a_n\)};
\node[right] at (D.out) {\(a_1 + a_2 + \dotsb a_n\)};
% Gate labels
\node[right] at ($(A.out) + (3, 0)$) {\textbf{Identity-Gate} (symbolises \(x\));};
\node[right] at ($(B.out) + (3, 0)$) {\textbf{NOT-Gate} (or \textbf{inverter}) (symbolises \(x'\));};
\node[right] at ($(C.out) + (3, 0)$) {\textbf{AND-Gate} (symbolises \(x_1x_2\dotsm x_n\));};
\node[right] at ($(D.out) + (3, 0)$) {\textbf{OR-Gate} (symbolises \(x_1 + x_2 + \dotsb + x_n\));};
\end{circuitikz}
\end{document}
我找不到一种简单的方法来制作相同风格的单输入门,因此它是一个双输入门,输入隐藏,新输入在两者中间绘制,使用节点(A.left)
和calc
库语法在和(A)!0.5!(B)
中间绘制节点。对于命名每个门的文本,它只是一个连接到门输出的节点,然后使用库语法向右移动点 3 到右边。对于输入/输出标签,每个节点都有命名,您可以使用它来连接一个节点。最后,“非”门只是一个没有绘制输入的与门,添加了一个输入,在输出上画了一个圆圈来表示反转。(A)
(B)
calc
($(A) + (3, 0)$)
(A)
语法解释
门选项
这里使用的门的选项如下:
and port
- 这是一个与门(也用于身份和非门)or port
- 这是一个或门no input leads
- 隐藏输入引线,这用于身份门和非门,因为它们只有我手动绘制的一条引线。number of inputs=n
- 绘制带输入的逻辑门n
(默认为n=2
)
节点
在 中,tikz
可以使用 创建一个节点\node (A) at (x, y) {};
。这将(A)
在点 处创建一个名为 的节点(x, y)
。在 中放置符号时,也会自动创建节点circuitikz
。特别有趣的是逻辑门创建的节点。放置门时,我们给它命名,这里我只使用了(A)
、和(B)
,但对于较大的图像,更具描述性的名称可能会有用。除了这些作为门的节点之外,还有输入和输出节点以及其他指向门上各个点的节点。在这种情况下,我们使用(请注意,这是一个句号/句号,而不是逗号),它给出门的左中间(输入与身份门的门相遇,而不是图像中的门)。类似地,当我们有多个输入时,我们可以使用,其中是一个数字(因此是顶部输入,是从顶部开始的第二个等等)。我们还利用是门的输出。有关逻辑门创建的节点的更多详细信息,请参阅(C)
(D)
(A.left)
(A.in i)
i
(A.in 1)
(A.in 2)
(A.out)
circuitikz 手册,特别是第 3.24.5.2 节“美国逻辑端口锚点”第 124 页。
Calc 库
calc
扩展的库中还有两种语法tikz
。第一个语法如下
(A)!x!(B)
其中x
是 0 到 1 之间的某个值,并且(A)
和是节点。它的作用是定义从到 的(B)
直线上的点,使得该点沿着直线,在我们的例子中我们使用 ,所以我们得到连接和的直线的中点。(A)
(B)
x
x = 0.5
(A)
(B)
第二种语法是
($(A) + (x, y)$)
这是简单的向量加法。这使我们能够取点并定义一个向右单位和向上单位(A)
的点。有关库的更多详细信息,请参阅x
y
calc
Tikz 手册特别是第 13.5 节“坐标计算”,第 148 页。此外这备忘单有很多类似的语法,通常很有用。