summaryrefslogtreecommitdiff
path: root/graphics/qcircuit
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/qcircuit
Initial commit
Diffstat (limited to 'graphics/qcircuit')
-rw-r--r--graphics/qcircuit/README.md56
-rw-r--r--graphics/qcircuit/qcircuit.pdfbin0 -> 296507 bytes
-rw-r--r--graphics/qcircuit/qcircuit.sty185
3 files changed, 241 insertions, 0 deletions
diff --git a/graphics/qcircuit/README.md b/graphics/qcircuit/README.md
new file mode 100644
index 0000000000..272dd2fff1
--- /dev/null
+++ b/graphics/qcircuit/README.md
@@ -0,0 +1,56 @@
+qcircuit
+==========
+
+A quantum circuit drawing application.
+
+The original website for this project may be found on the [qcircuit page](http://physics.unm.edu/CQuIC/Qcircuit/) through the Center for Quantum Information and Control. We use the GitHub [wiki](https://github.com/CQuIC/qcircuit/wiki) pages to make more information about qcircuit available.
+
+We welcome others to fork our project and include enhancements. See the [Issues list](https://github.com/CQuIC/qcircuit/issues?q=is%3Aopen) for requested updates and features.
+
+Installation
+========
+**Dependencies**
+
+qcircuit depends on the [xy-pic](http://www.tug.org/applications/Xy-pic/) and [ifpdf](http://www.ctan.org/pkg/ifpdf) packages.
+
+**Through a TeX package manager**
+
+qcircuit has been added to the Comprehensive Tex Archive Network (CTAN), and so can be accessed through a package manager for your TeX distribution. The package name is `qcircuit`. Should you be inclined to do so, the source files may be downloaded from [this page](http://ctan.org/pkg/qcircuit), though they contain all the same files available through GitHub.
+
+How to use this manager varies from distribution to distribution; there is a [Wikipedia page](https://en.wikibooks.org/wiki/LaTeX/Installing_Extra_Packages) which describes some of the more common ways to do so.
+
+**Simple Install**
+
+The simplest way to use qcircuit is to download the file `qcircuit.sty` and put that file in the same folder as the tex document you are compiling. Within the document preamble, use `\usepackage[options]{qcircuit}` to enable TeX to compile the circuit. See the Use section of this README for more information.
+
+**More Complicated (but more helpful) Way**
+
+*Note*: Using a TeX package manager takes care of putting the files in the right places in your TeX tree; we recommend users no longer use the approach below, and instead use the manager.
+
+A slightly more complicated way involves putting qcircuit in your TeX tree so that every time you compile your file TeX sees the `qcircuit.sty` file. This avoids the hassle of copying the file all over the place.
+
+To do so, first locate the `tex/latex` subdirectory of your TeX tree. For Mac OS X users, this is located at `users/user_name/Library/texmf/tex/latex/Qcircuit`, where `user_name` is the user name you use for your login. For Windows users, this folder is located at `C:\Program Files\texmf\tex\latex\Qcircuit`. To update the tree, run `initexmf --update-fndb` from your command line.
+
+For Linux users, one needs to locate the root TeX directory. Use the command `locate:texmf` to find all directories with a `texmf` folder. Then, after finding an appropriate folder into which `qcircuit.sty` can be put, execute the `texhash` command to update the tree.
+
+Use
+======
+Upon successful installation, one simply calls `\usepackage[options]{qcircuit}` to enable circuit-drawing functionality. Currently, we provide support for two options:
+
+* `braket`: This option provides the standard Dirac bras `\bra{A}` and kets `\ket{A}`
+* `qm`: This options provides an inner product `\ip{A}{B}`, an outer product `\op{A}{B}`, a matrix element `{j}{M}{k}`, and an expectation value `\expval{M}`.
+
+By default, none of these options are enabled, meaning if you want access to these commands, you must explicity provide them in your package call. In this way we avoid clashes with user-defined commands. For users who have defined their own commands, we welcome any feedback you may have regarding how ours are defined. Simply submit an issue and we will take a look at it.
+
+Tutorial
+=========
+A simple way to check you successfully installed qcircuit is to download the `Qtutorial.tex` file and run it in your favorite TeX compiler. Should the document compile correctly, you are ready to use qcircuit in your own documents! By inspecting the figures produced and comparing with the source code, you should obtain an understanding of how to typset your own circuits.
+
+Help
+=======
+A general FAQ can be found [on the wiki](https://github.com/CQuIC-GitHub/qcircuit/wiki/FAQ). Questions can be emailed to user [Travis-S](https://github.com/Travis-S).
+
+License
+========
+This software is licensed under a [GPLv2 license](https://www.gnu.org/licenses/gpl-2.0.html). See the corresponding documentation for a description of your rights and obligations.
+
diff --git a/graphics/qcircuit/qcircuit.pdf b/graphics/qcircuit/qcircuit.pdf
new file mode 100644
index 0000000000..d724903834
--- /dev/null
+++ b/graphics/qcircuit/qcircuit.pdf
Binary files differ
diff --git a/graphics/qcircuit/qcircuit.sty b/graphics/qcircuit/qcircuit.sty
new file mode 100644
index 0000000000..1b936386e1
--- /dev/null
+++ b/graphics/qcircuit/qcircuit.sty
@@ -0,0 +1,185 @@
+% qcircuit version 2.6.0
+% Contributors: Steve Flammia, Bryan Eastin, Travis Scholten
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+% Thanks to the Xy-pic guys, Kristoffer H Rose, Ross Moore, and Daniel Müllner,
+% for their help in making Qcircuit work with Xy-pic version 3.8.
+% Thanks also to Dave Clader, Andrew Childs, Rafael Possignolo, Tyson Williams,
+% Sergio Boixo, Cris Moore, Jonas Anderson, and Stephan Mertens for helping us test
+% and/or develop the new version.
+\ProvidesPackage{qcircuit}[2018/08/14]
+\RequirePackage{xy}
+
+\DeclareOption{braket}{
+ \newcommand{\bra}[1]{\ensuremath{\left\langle{#1}\right\vert}}
+ \newcommand{\ket}[1]{\ensuremath{\left\vert{#1}\right\rangle}}
+ }
+
+\DeclareOption{qm}{
+ \newcommand{\ip}[2]{\ensuremath{\left\langle{#1}\middle\vert{#2}\right\rangle}}
+ \newcommand{\melem}[3]{\ensuremath{\left\langle{#1}\middle\vert{#2}\middle\vert{#3}\right\rangle}}
+ \newcommand{\expval}[1]{\ensuremath{\left\langle #1 \right\rangle}}
+ \newcommand{\op}[2]{\ensuremath{\left\vert{#1}\middle\rangle\middle\langle{#2}\right\vert}}
+}
+
+\ProcessOptions\relax
+
+\xyoption{matrix}
+\xyoption{frame}
+\xyoption{arrow}
+\xyoption{arc}
+
+\usepackage{ifpdf}
+\ifpdf
+\else
+\PackageWarningNoLine{Qcircuit}{qcircuit is not loading in PDF mode. Activating all Xy-pic features to compensate. If you wish to use specific drivers for Xy-pic, you must modify the code in qcircuit.sty}
+% The following option loads all the features in Xy-pic. This
+% this is included as work-around to ensure documents compile
+% images correctly when using XeLaTeX.
+\xyoption{all}
+\fi
+
+% The following resets Xy-pic matrix alignment to the pre-3.8 default, as
+% required by Qcircuit.
+\entrymodifiers={!C\entrybox}
+
+\newcommand{\qw}[1][-1]{\ar @{-} [0,#1]}
+ % Defines a wire that connects horizontally. By default it connects to the object on the left of the current object.
+ % WARNING: Wire commands must appear after the gate in any given entry.
+\newcommand{\qwx}[1][-1]{\ar @{-} [#1,0]}
+ % Defines a wire that connects vertically. By default it connects to the object above the current object.
+ % WARNING: Wire commands must appear after the gate in any given entry.
+\newcommand{\qwa}[1][-1]{\ar @{<-} [0,#1]}
+ % Defines a wire that connects horizontally with an arrow. By default it makes an end wire with an arrow indicating the end of the circuit.
+ % WARNING: Wire commands must appear after the gate in any given entry.
+\newcommand{\cw}[1][-1]{\ar @{=} [0,#1]}
+ % Defines a classical wire that connects horizontally. By default it connects to the object on the left of the current object.
+ % WARNING: Wire commands must appear after the gate in any given entry.
+\newcommand{\cwx}[1][-1]{\ar @{=} [#1,0]}
+ % Defines a classical wire that connects vertically. By default it connects to the object above the current object.
+ % WARNING: Wire commands must appear after the gate in any given entry.
+\newcommand{\cwa}[1][-1]{\ar @{<=} [0,#1]}
+ % Defines a classical wire that connects horizontally with an arrow. By default it makes an end wire with an arrow indicating the end of the circuit.
+ % WARNING: Wire commands must appear after the gate in any given entry.
+\newcommand{\cds}[2]{*+<1em,.9em>{\hphantom{#2}} \POS [0,0].[#1,0]="e",!C *{#2};"e"+ R \qw}
+ % Allows the insertion of text without a box and exands circuit around this text.
+ % This is useful for such things as ... to indicate a generalized circuit.
+\newcommand{\barrier}[2][-0.95em]{\ar @{--}[#2,1]+<#1, -1em>;[0,1]+<#1, 1em>}
+ % Defines a barrier that is represented by a horizontal dashed line.
+ % It takes a a single argument to specify how many bits to cover
+ % To center the barrier between gates you can adjust the horizontal offset
+ % with an optional second parameter. This is the horizontal offset in em.
+ % It defaults to -0.95em
+ % WARNING: Be sure to place the barrier on the topmost bit it covers, it only propogates downwards
+\newcommand{\gate}[1]{*+<.6em>{#1} \POS ="i","i"+UR;"i"+UL **\dir{-};"i"+DL **\dir{-};"i"+DR **\dir{-};"i"+UR **\dir{-},"i" \qw}
+ % Boxes the argument, making a gate.
+\newcommand{\sgate}[2]{\gate{#1} \qwx[#2]}
+ % Creates a gate and a qwx wire going #2 spots below, for a gate split over
+ % non-adjacent rows
+\newcommand{\meter}{*=<1.8em,1.4em>{\xy ="j","j"-<.778em,.322em>;{"j"+<.778em,-.322em> \ellipse ur,_{}},"j"-<0em,.4em>;p+<.5em,.9em> **\dir{-},"j"+<2.2em,2.2em>*{},"j"-<2.2em,2.2em>*{} \endxy} \POS ="i","i"+UR;"i"+UL **\dir{-};"i"+DL **\dir{-};"i"+DR **\dir{-};"i"+UR **\dir{-},"i" \qw}
+ % Inserts a measurement meter.
+ % In case you're wondering, the constants .778em and .322em specify
+ % one quarter of a circle with radius 1.1em.
+ % The points added at + and - <2.2em,2.2em> are there to strech the
+ % canvas, ensuring that the size is unaffected by erratic spacing issues
+ % with the arc.
+\newcommand{\metersymb}{\xy ="j","j"-<.778em,.322em>;{"j"+<.778em,-.322em> \ellipse ur,_{}},"j"-<0em,.4em>;p+<.5em,.9em> **\dir{-},"j"+<2.2em,2.2em>*{},"j"-<2.2em,2.2em>*{} \endxy}
+ % A longer meter
+\newcommand{\meterB}[1]{*=<1.8em,2.6em>{\xy 0;<0em,-.8em>:
+0*{\begingroup
+\everymath{\scriptstyle}
+\tiny #1 \endgroup},<0em,.7em>*{\xy ="j","j"-<.778em,-.322em>;{"j"+<.778em,.322em> \ellipse ur,_{}},"j"-<0em,-.2em>;p+<.5em,.9em> **\dir{-},"j"+<2.2em,2.2em>*{},"j"-<2.2em,2.2em>*{} \endxy}
+\endxy} \POS ="i","i"+UR;"i"+UL **\dir{-};"i"+DL **\dir{-};"i"+DR **\dir{-};"i"+UR **\dir{-},"i" \qw}
+ % A meter that allows for a measurement operator to be added below
+\newcommand{\smeterB}[2]{\meterB{#1} \qwx[#2] \qw}
+ % A split meter that allows for a measurement operator to be split over non-
+ % adjacent rows
+\newcommand{\measure}[1]{*+[F-:<.9em>]{#1} \qw}
+ % Inserts a measurement bubble with user defined text.
+\newcommand{\measuretab}[1]{*{\xy*+<.6em>{#1}="e";"e"+UL;"e"+UR **\dir{-};"e"+DR **\dir{-};"e"+DL **\dir{-};"e"+LC-<.5em,0em> **\dir{-};"e"+UL **\dir{-} \endxy} \qw}
+ % Inserts a measurement tab with user defined text.
+\newcommand{\measureD}[1]{*{\xy*+=<0em,.1em>{#1}="e";"e"+UR+<0em,.25em>;"e"+UL+<-.5em,.25em> **\dir{-};"e"+DL+<-.5em,-.25em> **\dir{-};"e"+DR+<0em,-.25em> **\dir{-};{"e"+UR+<0em,.25em>\ellipse^{}};"e"+C:,+(0,1)*{} \endxy} \qw}
+ % Inserts a D-shaped measurement gate with user defined text.
+\newcommand{\multimeasure}[2]{*+<1em,.9em>{\hphantom{#2}} \qw \POS[0,0].[#1,0];p !C *{#2},p \drop\frm<.9em>{-}}
+ % Draws a multiple qubit measurement bubble starting at the current position and spanning #1 additional gates below.
+ % #2 gives the label for the gate.
+ % You must use an argument of the same width as #2 in \ghost for the wires to connect properly on the lower lines.
+\newcommand{\multimeasureD}[2]{*+<1em,.9em>{\hphantom{#2}} \POS [0,0]="i",[0,0].[#1,0]="e",!C *{#2},"e"+UR-<.8em,0em>;"e"+UL **\dir{-};"e"+DL **\dir{-};"e"+DR+<-.8em,0em> **\dir{-};{"e"+DR+<0em,.8em>\ellipse^{}};"e"+UR+<0em,-.8em> **\dir{-};{"e"+UR-<.8em,0em>\ellipse^{}},"i" \qw}
+ % Draws a multiple qubit D-shaped measurement gate starting at the current position and spanning #1 additional gates below.
+ % #2 gives the label for the gate.
+ % You must use an argument of the same width as #2 in \ghost for the wires to connect properly on the lower lines.
+\newcommand{\control}{*!<0em,.025em>-=-<.2em>{\bullet}}
+ % Inserts an unconnected control.
+\newcommand{\controlo}{*+<.01em>{\xy -<.095em>*\xycircle<.19em>{} \endxy}}
+ % Inserts a unconnected control-on-0.
+\newcommand{\ctrl}[1]{\control \qwx[#1] \qw}
+ % Inserts a control and connects it to the object #1 wires below.
+\newcommand{\ctrlo}[1]{\controlo \qwx[#1] \qw}
+ % Inserts a control-on-0 and connects it to the object #1 wires below.
+\newcommand{\cctrl}[1]{\control \cwx[#1] \cw}
+ % Inserts a classical control and connects it to the object #1 wires below.
+\newcommand{\cctrlo}[1]{\controlo \cwx[#1] \cw}
+ % Inserts a classical control-on-0 and connects it to the object #1 wires below.
+\newcommand{\targ}{*+<.02em,.02em>{\xy ="i","i"-<.39em,0em>;"i"+<.39em,0em> **\dir{-}, "i"-<0em,.39em>;"i"+<0em,.39em> **\dir{-},"i"*\xycircle<.4em>{} \endxy} \qw}
+ % Inserts a CNOT target.
+\newcommand{\qswap}{*=<0em>{\times} \qw}
+ % Inserts half a swap gate.
+ % Must be connected to the other swap with \qwx.
+\newcommand{\multigate}[2]{*+<1em,.9em>{\hphantom{#2}} \POS [0,0]="i",[0,0].[#1,0]="e",!C *{#2},"e"+UR;"e"+UL **\dir{-};"e"+DL **\dir{-};"e"+DR **\dir{-};"e"+UR **\dir{-},"i" \qw}
+ % Draws a multiple qubit gate starting at the current position and spanning #1 additional gates below.
+ % #2 gives the label for the gate.
+ % You must use an argument of the same width as #2 in \ghost for the wires to connect properly on the lower lines.
+\newcommand{\ghost}[1]{*+<1em,.9em>{\hphantom{#1}} \qw}
+ % Leaves space for \multigate on wires other than the one on which \multigate appears. Without this command wires will cross your gate.
+ % #1 should match the second argument in the corresponding \multigate.
+\newcommand{\cghost}[1]{*+<1em,.9em>{\hphantom{#1}} \cw}
+ % Same as ghost but with a classical incoming wire.
+\newcommand{\nghost}[1]{*+<1em,.9em>{\hphantom{#1}}}
+ % Same as ghost but with no incoming wire.
+\newcommand{\push}[1]{*{#1}}
+ % Inserts #1, overriding the default that causes entries to have zero size. This command takes the place of a gate.
+ % Like a gate, it must precede any wire commands.
+ % \push is useful for forcing columns apart.
+ % NOTE: It might be useful to know that a gate is about 1.3 times the height of its contents. I.e. \gate{M} is 1.3em tall.
+ % WARNING: \push must appear before any wire commands and may not appear in an entry with a gate or label.
+\newcommand{\gategroup}[6]{\POS"#1,#2"."#3,#2"."#1,#4"."#3,#4"!C*+<#5>\frm{#6}}
+ % Constructs a box or bracket enclosing the square block spanning rows #1-#3 and columns=#2-#4.
+ % The block is given a margin #5/2, so #5 should be a valid length.
+ % #6 can take the following arguments -- or . or _\} or ^\} or \{ or \} or _) or ^) or ( or ) where the first two options yield dashed and
+ % dotted boxes respectively, and the last eight options yield bottom, top, left, and right braces of the curly or normal variety. See the Xy-pic reference manual for more options.
+ % \gategroup can appear at the end of any gate entry, but it's good form to pick either the last entry or one of the corner gates.
+ % BUG: \gategroup uses the four corner gates to determine the size of the bounding box. Other gates may stick out of that box. See \prop.
+\newcommand{\inputgroupv}[5]{\POS"#1,1"."#2,1"."#1,1"."#2,1"!C*+<#3>\frm{\{}, \POS"#1,1"."#2,1"."#1,1"."#2,1"*!C!<1.7em,#4>=<0em>{#5}}
+ % Constructs an input group with label #5 and a grouping { from rows #1 to #2 with #3 and #4 controlling the spacing
+\newcommand{\inputgroup}[4]{\POS"#1,1"."#2,1"."#1,1"."#2,1", \POS"#1,1"."#2,1"."#1,1"."#2,1"*!C!<1em,#3>=<0em>{#4}}
+ % Constructs an input group with label #4 from rows #1 to #2 with #3 controlling the spacing
+\newcommand{\inputgrouph}[5]{\POS"#1,1"."#2,1"."#1,1"."#2,1", \POS"#1,1"."#2,1"."#1,1"."#2,1"*!C!<#5,#3>=<0em>{#4}}
+ % Constructs an input group with label #4 and a grouping /vdots from rows #1 to #2 with #3 and #5 controlling the spacing
+\newcommand{\rstick}[1]{*!L!<-.5em,0em>=<0em>{#1}}
+ % Centers the left side of #1 in the cell. Intended for lining up wire labels. Note that non-gates have default size zero.
+\newcommand{\lstick}[1]{*!R!<.5em,0em>=<0em>{#1}}
+ % Centers the right side of #1 in the cell. Intended for lining up wire labels. Note that non-gates have default size zero.
+\newcommand{\ustick}[1]{*!D!<0em,-.5em>=<0em>{#1}}
+ % Centers the bottom of #1 in the cell. Intended for lining up wire labels. Note that non-gates have default size zero.
+\newcommand{\dstick}[1]{*!U!<0em,.5em>=<0em>{#1}}
+ % Centers the top of #1 in the cell. Intended for lining up wire labels. Note that non-gates have default size zero.
+\newcommand{\Qcircuit}{\xymatrix @*=<0em>}
+ % Defines \Qcircuit as an \xymatrix with entries of default size 0em.
+\newcommand{\link}[2]{\ar @{-} [#1,#2]}
+ % Draws a wire or connecting line to the element #1 rows down and #2 columns forward.
+\newcommand{\pureghost}[1]{*+<1em,.9em>{\hphantom{#1}}}
+ % Same as \ghost except it omits the wire leading to the left.
+
+\endinput