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}

效果如下:

说明:

  1. 本例中绘制逻辑电路图使用的是tikz宏包,注意还要调用相应的功能库。

  2. 示例中在正文前定义了两个箭头样式,二者只是方向不一样。

  3. 代码中绘制箭头时,有些从左向右绘制,有些从右向左绘制,目的只是为了更好地对齐。

  4. 由tikz衍生出来的宏包中有一个是专门绘制电路图的,名为circuitikz,有兴趣的朋友可以去看看。

  5. 在绘制逆变器连接或门、与门时,因为tikz提供的或门、与门图形的两个输入端口靠得很近,所以没有把逆变器与第2个输入端口放在同一水平线上,否则逆变器图形会与第1个输入端口的连接线重叠。当然,把或门、与门绘制得大一些就可以避免上述问题,但不好看。