LaTeX绘制简单逻辑电路图示例
以下示例中选用的图形来自《离散数学及其应用》第8版。
环境
- Ubuntu 20.04
- LuaLaTeX 1.10.0
- Visual Studio Code 1.67.1
完整代码
% 博客园,繁星间漫步,陆巍的博客
\documentclass{article}
% 注意宏包顺序,有可能会报错
\usepackage{ctex}% 中文支持
\usepackage{geometry}% 用于页面设置
\usepackage{amssymb}% 数学符号
\usepackage{amsmath}% 数学相关支持
\usepackage{tikz}% 绘图
% 载入tikz中的各种功能库
\usetikzlibrary{shapes.gates.logic, circuits.logic.US, arrows.meta, positioning}
% 设置为A4纸,边距适中模式(参考永中office)
\geometry{
a4paper,
left = 19.1mm,
right = 19.1mm,
top = 25.4mm,
bottom = 25.4mm
}
% tikz图形样式定义
% single arrow
\tikzset{
Arrow1/.style = {
draw,
-{Latex[length = 2mm, width = 2mm]},
}
}
\tikzset{
Arrow2/.style = {
draw,
{Latex[length = 2mm, width = 2mm]}-,
}
}
% ------------------ 开始 -------------------
\begin{document}
\section{LaTeX绘制简单逻辑电路图示例}
\begin{center}
\begin{tikzpicture}
\node[or gate US, draw, minimum width = 10mm](or1){};
\node[left = 28mm of or1.input 1](p1){$p$};
\node[below = 2mm of p1](r1){$r$};
\node[below = 4mm of r1](p2){$p$};
\node[or gate US, draw, minimum width = 10mm, below = 14mm of or1](or2){};
\node[left = 28mm of or2.input 1](q){$q$};
\node[below = 2mm of q](r2){$r$};
\node[not gate US, right = 10mm of r1, draw](not1){};
\node[not gate US, right = 10mm of p2, draw](not2){};
\node[not gate US, right = 10mm of r2, draw](not3){};
\node[or gate US, draw, minimum width = 10mm, right = 20mm of or2, yshift = 4mm](or3){};
\node[and gate US, draw, minimum width = 10mm, right = 20mm of or3, yshift = 8mm](and1){};
\draw(p1)[Arrow1] -- (or1.input 1);
\draw(r1)[Arrow1] -- (not1.input);
\draw(not1.output)[Arrow1][below right]node{$\neg r$} -- ++(4mm,0) |- (or1.input 2);
\draw(p2)[Arrow1] -- (not2.input);
\draw(r2)[Arrow1] -- (not3.input);
\draw(not3.output)[Arrow1][below right]node{$\neg r$} -- ++(4mm,0) |- (or2.input 2);
\draw(q)[Arrow1] -- (or2.input 1);
\draw(or3.input 1)[Arrow2] -- ++(-6mm,0) |- (not2.output)[above right]node{$\neg p$};
\draw(or3.input 2)[Arrow2] -- ++(-6mm,0) |- (or2.output)[below right]node{$q \lor\neg r$};
\draw(and1.input 1)[Arrow2] -- ++(-6mm,0) |- (or1.output)[above right]node{$p\lor\neg r$};
\draw(and1.input 2)[Arrow2] -- ++(-6mm,0) |- (or3.output)[below right]node{$\neg p\lor(q\lor\neg r)$};
\draw(and1.output)[Arrow1][above right]node{$(p\lor\neg r)\land(\neg p\lor(q\lor\neg r))$} -- ++(46mm,0);
\end{tikzpicture}
图3 $(p\lor\neg r)\land(\neg p\lor(q\lor\neg r))$的电路
\end{center}
\end{document}
效果如下:
说明:
-
本例中绘制逻辑电路图使用的是tikz宏包,注意还要调用相应的功能库。
-
示例中在正文前定义了两个箭头样式,二者只是方向不一样。
-
代码中绘制箭头时,有些从左向右绘制,有些从右向左绘制,目的只是为了更好地对齐。
-
由tikz衍生出来的宏包中有一个是专门绘制电路图的,名为circuitikz,有兴趣的朋友可以去看看。
-
在绘制逆变器连接或门、与门时,因为tikz提供的或门、与门图形的两个输入端口靠得很近,所以没有把逆变器与第2个输入端口放在同一水平线上,否则逆变器图形会与第1个输入端口的连接线重叠。当然,把或门、与门绘制得大一些就可以避免上述问题,但不好看。