Drawing quantum circuits
Some macros
\def\gl#1{\setbox0\hbox{$#1$}%
\setbox0\hbox{\kern-.5\wd0\kern.2pt\raise-.5\ht0\box0}%
\ht0=0pt \wd0=0pt \dp0=0pt \box0}
\def\bdot{\gl{\bullet}}
\def\gvr{\vrule height 2ex}
\def\gvz{\vrule height 2ex width 0pt \kern .4pt}
\def\gline{\kern 1.8ex & & \kern 2ex
&\vrule height 1.7ex
&\kern 2ex & & \kern 1.8ex}
\def\glinz{\kern 1.8ex & & \kern 2ex
& \vrule height 1.7ex width 0pt \kern .4pt
&\kern 2ex & & \kern 1.8ex}
\def\ghrl#1{\multispan#1\hrulefill\ignorespaces}
\def\ghrs{\vrule height .4pt}
\def\ghrz{\vrule height .4pt width 0pt \kern 0pt}
\def\grket#1{\vbox{\offinterlineskip\halign{##&#\cr
\glinz \cr
& & & \ghrz \cr
& \gvz & & \gvz & & \gvz \cr
\ghrl2 & & \gl{\rlap{$|#1\rangle$}} \cr
& \gvz & & \gvz & & \gvz \cr
& & & \ghrz \cr
\glinz \cr}}\ignorespaces}
\def\glket#1{\vbox{\offinterlineskip\halign{##&#\cr
\glinz \cr
& & & \ghrz \cr
& \gvz & & \gvz & & \gvz \cr
& & & \gl{\llap{$|#1\rangle$}} & & \ghrl2 \cr
& \gvz & & \gvz & & \gvz \cr
& & & \ghrz \cr
\glinz \cr}}\ignorespaces}
\def\nog{\vbox{\offinterlineskip\halign{##&#\cr
\glinz \cr
& & & \ghrz \cr
& \gvz & & \gvz & & \gvz \cr
\ghrl3 & \ghrs & \ghrl3 \cr
& \gvz & & \gvz & & \gvz \cr
& & & \ghrz \cr
\glinz \cr}}}
\def\jump{\vbox{\offinterlineskip\halign{##&#\cr
\gline \cr
& & & \ghrs \cr
& \gvz & & \gvr & & \gvz \cr
\ghrl3 & \ghrs & \ghrl3 \cr
& \gvz & & \gvr & & \gvz \cr
& & & \ghrs \cr
\gline \cr}}}
\def\cont{\vbox{\offinterlineskip\halign{##&#\cr
\gline \cr
& & & \ghrs \cr
& \gvz & & \gvr & & \gvz \cr
\ghrl3 & \bdot & \ghrl3 \cr
& \gvz & & \gvr & & \gvz \cr
& & & \ghrs \cr
\gline \cr}}}
\def\contup{\vbox{\offinterlineskip\halign{##&#\cr
\gline \cr
& & & \ghrs \cr
& \gvz & & \gvr & & \gvz \cr
\ghrl3 & \bdot & \ghrl3 \cr
& \gvz & & \gvz & & \gvz \cr
& & & \ghrz \cr
\glinz \cr}}}
\def\contdn{\vbox{\offinterlineskip\halign{##&#\cr
\glinz \cr
& & & \ghrz \cr
& \gvz & & \gvz & & \gvz \cr
\ghrl3 & \bdot & \ghrl3 \cr
& \gvz & & \gvr & & \gvz \cr
& & & \ghrs \cr
\gline \cr}}}
\def\gate#1{\vbox{\offinterlineskip\halign{##&#\cr
\glinz \cr
& \ghrl5 \cr
& \gvr & & & & \gvr \cr
\ghrl2 & & \gl{#1} & & \ghrl2 \cr
& \gvr & & & & \gvr \cr
& \ghrl5 \cr
\glinz \cr}}\ignorespaces}
\def\gateup#1{\vbox{\offinterlineskip\halign{##&#\cr
\gline \cr
& \ghrl5 \cr
& \gvr & & & & \gvr \cr
\ghrl2 & & \gl{#1} & & \ghrl2 \cr
& \gvr & & & & \gvr \cr
& \ghrl5 \cr
\glinz \cr}}\ignorespaces}
\def\gatedn#1{\vbox{\offinterlineskip\halign{##&#\cr
\glinz \cr
& \ghrl5 \cr
& \gvr & & & & \gvr \cr
\ghrl2 & & \gl{#1} & & \ghrl2 \cr
& \gvr & & & & \gvr \cr
& \ghrl5 \cr
\gline \cr}}\ignorespaces}
\def\gcr{\cr\noalign{\vskip-1pt}}
\font\bss=cmssbx10
\def\qop#1{\mathop{\hbox{\bss#1}}\nolimits}
\def\X{\qop X} \def\Y{\qop Y} \def\Z{\qop Z} \def\H{\qop H}
Examples
$$ \matrix{
\glket{\phi} \gatedn{\S} \nog \gatedn{\S\dag} \grket{\phi} \gcr
\glket{x} \cont \nog \cont \grket{x} \gcr
\glket{0} \gateup{\oplus f}\contdn
\gateup{\oplus f} \grket{0} \gcr
\glket{y} \nog \gateup{\X}\nog \grket{y\oplus f(x)}
} $$
$$ \matrix{
\gate{\H} \nog \contdn \gate{\H} \gcr
\gate{\H} \nog \jump \gate{\H} \gcr
\gate{\H} \contdn \jump \gate{\H} \gcr
\gate{\H} \gateup{\X} \gateup{\X} \gate{\H} }
= \matrix{
\nog \gatedn{\X} \gcr
\nog \jump \gcr
\gatedn{\X} \jump \gcr
\contup \contup }
$$