diff options
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/pgf/contrib/quantikz/quantikz.pdf | bin | 513931 -> 510921 bytes | |||
-rw-r--r-- | graphics/pgf/contrib/quantikz/quantikz.sty | 11 | ||||
-rw-r--r-- | graphics/pgf/contrib/quantikz/quantikz.tex | 294 | ||||
-rw-r--r-- | graphics/pgf/contrib/quantikz/tikzlibraryquantikz.code.tex | 171 |
4 files changed, 373 insertions, 103 deletions
diff --git a/graphics/pgf/contrib/quantikz/quantikz.pdf b/graphics/pgf/contrib/quantikz/quantikz.pdf Binary files differindex 39a11433e5..6e99c7bc66 100644 --- a/graphics/pgf/contrib/quantikz/quantikz.pdf +++ b/graphics/pgf/contrib/quantikz/quantikz.pdf diff --git a/graphics/pgf/contrib/quantikz/quantikz.sty b/graphics/pgf/contrib/quantikz/quantikz.sty new file mode 100644 index 0000000000..be72bcd7ab --- /dev/null +++ b/graphics/pgf/contrib/quantikz/quantikz.sty @@ -0,0 +1,11 @@ +%This is the quantikz library for typesetting quantum circuits using LaTeX/Tikz. version 0.9.6 +% Written by Alastair Kay, 2018. Published under a CC-BY-4.0 licence +% Please email me (alastair.kay@rhul.ac.uk) with any bug reports or feature requests. +% If you find this library useful, please cite its usage in your work, using arXiv:1809.03842, and possibly the DOI: 10.17637/rh.7000520. +% Usage is at your own risk. + +\ProvidesPackage{quantikz}[2020/04/27 typeset quantum circuit diagrams] +\RequirePackage{tikz}[2013/12/13] % pgf version 3.0.0 required +\usetikzlibrary{quantikz} + +\endinput diff --git a/graphics/pgf/contrib/quantikz/quantikz.tex b/graphics/pgf/contrib/quantikz/quantikz.tex index 1153b735af..72784f67e7 100644 --- a/graphics/pgf/contrib/quantikz/quantikz.tex +++ b/graphics/pgf/contrib/quantikz/quantikz.tex @@ -128,6 +128,20 @@ Since we have built quantikz on top of tikzcd, any of the standard arrow command \end{lstlisting} \end{Code} +One particularly common reason for wanting an arrow is to indicate that a qubit is not being measured. There is a \verb!\trash! command in this instance. +\begin{Code} +\begin{center} +\begin{quantikz} +\lstick{$\ket{0}$} & \gate{H} & \trash{\text{trash}} +\end{quantikz} +\end{center} +\tcblower +\begin{lstlisting} +\lstick{$\ket{0}$} & \gate{H} & \trash{\text{trash}} +\end{lstlisting} +\end{Code} + + Sometimes, you may want to group a whole bunch of wires together. Use \verb!\qwbundle! instead of \verb!\qw!. \begin{Code} \begin{center} @@ -154,11 +168,11 @@ You can access an alternative form for the multi-qubit wire using the \verb!alte \tcblower \begin{lstlisting} \begin{quantikz} -\lstick{$\ket{0}^{\otimes n}$} & \gate{H} \qwbundle[alternate]{}& \control\qwbundle[alternate]{} +\lstick{$\ket{0}^{\otimes n}$} & \gate{H} \qwbundle[alternate]{}& \qwbundle[alternate]{} \end{quantikz} \end{lstlisting} \end{Code} -\noindent The alternate version does not represent how many wires are supposed to be in the bundle. +\noindent The alternate version does not typically represent how many wires are supposed to be in the bundle. However, there is the \texttt{alternate=2} option if you only want 2 wires. \section{Multiple Qubits} @@ -220,6 +234,39 @@ If you want to use classical controls with both horizontal and vertical componen \end{lstlisting} \end{Code} +Standard gate commands will typically work well with the alternate option for bundled quantum wires. However, when using the \texttt{alternate=2} option, you may need to disable to default wire using the \texttt{nwires} option, as described in Sec.\ \ref{sec:wires}. However, the control can look messy. To that end, we use the \texttt{ctrlbundle} command. +\begin{Code} +\begin{center} +\begin{quantikz} +\lstick{\ket{x}} & \ctrlbundle{1} & \rstick{\ket{x}}\qwbundle[alternate]{} \\ +& \gate[nwires=1]{U_x}\qwbundle[alternate=2]{} & \qwbundle[alternate=2]{} +\end{quantikz} +\end{center} +\tcblower +\begin{lstlisting} +\begin{quantikz} +\lstick{\ket{x}} & \ctrlbundle{1} & \rstick{\ket{x}}\qwbundle[alternate]{} \\ +& \gate[nwires=1]{U_x}\qwbundle[alternate=2]{} & \qwbundle[alternate=2]{} +\end{quantikz} +\end{lstlisting} +\end{Code} +If \texttt{ctrlbundle} should only use two wires, supply the optional parameter \texttt{[2]}, +\begin{Code} +\begin{center} +\begin{quantikz} +\lstick{\ket{x}} & \ctrlbundle[2]{1} & \rstick{\ket{x}}\qwbundle[alternate=2]{} \\ +& \gate{U_x}\qwbundle[alternate]{} & \qwbundle[alternate]{} +\end{quantikz} +\end{center} +\tcblower +\begin{lstlisting} +\begin{quantikz} +\lstick{\ket{x}} & \ctrlbundle[2]{1} & \rstick{\ket{x}}\qwbundle[alternate=2]{} \\ +& \gate{U_x}\qwbundle[alternate]{} & \qwbundle[alternate]{} +\end{quantikz} +\end{lstlisting} +\end{Code} + \section{Operating on Many Qubits} We have already met the \verb!\lstick!, \verb!\rstick!, and \verb!\gate! commands. By default, these all act on a single quantum wire. However, they also take the optional parameter \verb!wires=n! to specify that they should extend over $n$ wires. The syntax is otherwise unchanged\footnote{Strictly, the \texttt{wires=} statement should not be necessary, as this is presumed to be the default key, but it is useful for readability.}. @@ -328,28 +375,28 @@ Sometimes, it might be that you want a multi-line label, and it should not be th \end{lstlisting} \end{Code} -\subsection{Different Connections} +\subsection{Different Connections}\label{sec:wires} -It is assumed that most of the time you want to connect your gates with quantum wires. However, it is possible to override that, and either use classical wires or no wire. These appear as option keys for the gate command, both of which are a comma-separated list of incoming wires that should be altered. +It is assumed that most of the time you want to connect your gates with quantum wires. However, it is possible to override that, and either use classical wires, an alternate wire bundle, or no wire. These appear as option keys for the gate command, each of which are a comma-separated list of incoming wires that should be altered. \begin{Code} \begin{center} \begin{quantikz} -& \gate[5,cwires={2,4},nwires={3}]{U} & \qw \\ +& \gate[5,cwires={2,4},nwires={3},bundle={5}]{U} & \qw \\ & & \cw \\ & & \qw \\ & & \cw \\ -& & \qw +& & \qwbundle[alternate]{} \end{quantikz} \end{center} \tcblower \begin{lstlisting} \begin{quantikz} -& \gate[5,cwires={2,4},nwires={3}]{U} & \qw \\ +& \gate[5,cwires={2,4},nwires={3},bundle={5}]{U} & \qw \\ & & \cw \\ & & \qw \\ & & \cw \\ -& & \qw +& & \qwbundle[alternate]{} \end{quantikz} \end{lstlisting} \end{Code} @@ -613,90 +660,167 @@ If you cannot identify the offending gate, and particularly if the operation is \end{quantikz} \end{lstlisting} \end{Code} - -\subsubsection{Perfecting Vertical Alignment} - -If you want total control over vertical alignment between several different circuits, the trick is to use the \verb!baseline! key. All the baselines of different items are placed on the same level. This is particularly helpful if you give certain wires in the circuit a name, and that will let you place the baseline directly on a level with that wire. - -To name a wire as `name', place an \verb!\alias{name}! command in any cell which is either empty, or contains a \verb!\qw!, \verb!\cw! or \verb!\push! \emph{only}, and place it before that command\footnote{Alternatively, for any node that accepts tikz styling parameters directly as an option, passing the option \texttt{alias=name} should do.}. That lets you align circuit identities such as +Alternatively, you can use a \texttt{midstick} command, which is a bit like \texttt{rstick} or \texttt{lstick}. By default, it places braces both before and after, but these can be replaced using the optional argument \texttt{brackets=none|left|right|both}. This is typically the simplest options. Thus, \begin{Code} -$$ -\begin{quantikz}[baseline=(W.base)] -\lstick{\ket{0}} & \qw & \ctrl{1} & \qw \\ -& \gate{H} & \targ{} & \alias{W} \qw -\end{quantikz} -\equiv -\begin{quantikz}[baseline=(W.base)] -& \gate{H} & \gate{X} & \alias{W} \qw +\begin{center} +\begin{quantikz} +& \qw & \ctrl{1} & \midstick[2,brackets=none]{=}\qw& \ctrl{1} & \gate{Z} & \qw \\ +& \gate{Z} & \targ{} & \qw& \targ{} & \gate{Z} & \qw \end{quantikz} -$$ +\end{center} \tcblower \begin{lstlisting} -$$ -\begin{quantikz}[baseline=(W.base)] -\lstick{\ket{0}} & \qw & \ctrl{1} & \qw \\ -& \gate{H} & \targ{} & \alias{W} \qw -\end{quantikz} -\equiv\begin{quantikz}[baseline=(W.base)] -& \gate{H} & \gate{X} & \alias{W} \qw +\begin{quantikz} +& \qw & \ctrl{1} & \midstick[2,brackets=none]{=}\qw& \ctrl{1} & \gate{Z} & \qw \\ +& \gate{Z} & \targ{} & \qw& \targ{} & \gate{Z} & \qw \end{quantikz} -$$ \end{lstlisting} \end{Code} -This has aligned the bottom wire of the first circuit with the wire in the second circuit, making the correspondence more obvious. However, the $\equiv$ sign is now in the wrong place, with its baseline placed at the same point as the baseline of the circuits. We can fix this with a vertical shift of the two diagrams. We demonstrate two different ways of achieving the same effect (the only important feature is that both diagrams have the same shift). +Another example that doesn't remove the braces: \begin{Code} -$$ -\begin{quantikz}[baseline={($(W.base)+0.3*(0,1cm)$)}] -\lstick{\ket{0}} & \qw & \ctrl{1} & \qw \\ -& \gate{H} & \targ{} & \alias{W} \qw -\end{quantikz} -\equiv\begin{quantikz}[baseline={([yshift=0.3cm]new.base)}] -& \gate{H} & \gate{X} & \alias{new} \qw +\begin{center} +\begin{quantikz}[column sep=0.2cm] +\lstick{\ket{x}} & \gate{H} & \ctrl{1} & \midstick[2]{$\mapsto\ket{\psi_{xy}}\mapsto$}\qw & \ctrl{1} & \gate{H} & \rstick{\ket{x}}\qw \\ +\lstick{\ket{y}} & \qw & \targ{} & \qw&\targ{} & \qw & \rstick{\ket{y}}\qw \end{quantikz} -$$ +\end{center} \tcblower \begin{lstlisting} -$$ -\begin{quantikz}[baseline={($(W.base)+0.3*(0,1cm)$)}] -\lstick{\ket{0}} & \qw & \ctrl{1} & \qw \\ -& \gate{H} & \targ{} & \alias{W} \qw -\end{quantikz} -\equiv\begin{quantikz}[baseline={([yshift=0.3cm]new.base)}] -& \gate{H} & \gate{X} & \alias{new} \qw +\begin{quantikz} +\lstick{\ket{x}} & \gate{H} & \ctrl{1} & \midstick[2]{$\mapsto\ket{\psi_{xy}}\mapsto$}\qw & \ctrl{1} & \gate{H} & \rstick{\ket{x}}\qw \\ +\lstick{\ket{y}} & \qw & \targ{} & \qw&\targ{} & \qw & \rstick{\ket{y}}\qw \end{quantikz} -$$ \end{lstlisting} \end{Code} -If you have an even number if wires, you might choose to calculate the centre of the circuit from \verb!current bounding box.center!, or you could perform a calculation to average the position of two wires. This calculation can then be adjusted to take into account the desire to vertically align on the centre of an equals sign rather than the baseline (which is below the bottom of the equals) + \subsubsection{Perfecting Vertical Alignment} +Sometimes when you're typesetting circuit identities as multiple separate circuits, the vertical alignment of the equals sign doesn't appear quite right (and can really niggle). Here, for example, the equals seems a bit high: \begin{Code} -$$ -\begin{quantikz}[baseline={($(W.base)!.5!(W2.base) - height("$\vcenter{}$")*(0,1pt)$)}] -& \gate{X} & \ctrl{1} & \alias{W} \qw \\ -& \ghost{X}\qw & \targ{} & \alias{W2} \qw -\end{quantikz} -=\begin{quantikz}[baseline={($(W.base)!.5!(W2.base) - height("$\vcenter{}$")*(0,1pt)$)}] -& \ctrl{1} & \gate{X} & \qw \\ -& \targ{} & \gate{X} & \qw +\begin{center} +\begin{quantikz}[column sep=0.3cm] +& \targ{} & \ctrl{1} & \targ{} & \qw \\ +\lstick{\ket{0}} & \ctrl{-1} & \targ{} & \ctrl{-1} & \qw +\end{quantikz}=\begin{quantikz}[column sep=0.3cm] + & \ctrl{1} & \targ{} & \qw \\ +\lstick{\ket{0}} & \targ{} & \ctrl{-1} & \qw \end{quantikz} -$$ +\end{center} \tcblower \begin{lstlisting} -$$ -\begin{quantikz}[baseline={($(W.base)!.5!(W2.base) - height("$\vcenter{}$")*(0,1pt)$)}] -& \gate{X} & \ctrl{1} & \alias{W} \qw \\ -& \ghost{X}\qw & \targ{} & \alias{W2} \qw +\begin{quantikz}[column sep=0.3cm] +& \targ{} & \ctrl{1} & \targ{} & \qw \\ +\lstick{\ket{0}} & \ctrl{-1} & \targ{} & \ctrl{-1} & \qw +\end{quantikz}=\begin{quantikz}[column sep=0.3cm] + & \ctrl{1} & \targ{} & \qw \\ +\lstick{\ket{0}} & \targ{} & \ctrl{-1} & \qw \end{quantikz} -=\begin{quantikz}[baseline={($(W.base)!.5!(W2.base) - height("$\vcenter{}$")*(0,1pt)$)}] -& \ctrl{1} & \gate{X} & \qw \\ -& \targ{} & \gate{X} & \qw +\end{lstlisting} +\end{Code} +To that end, we have added the key \texttt{align equals at=} option for the tikzcd and quantikz environments. This specifies which wire should be align with the equals sign. You can even use a non-integer. For instance, 2.5 will set it half way between wires 2 and 3. +\begin{Code} +\begin{center} +\begin{quantikz}[align equals at=1.5,column sep=0.3cm] +& \targ{} & \ctrl{1} & \targ{} & \qw \\ +\lstick{\ket{0}} & \ctrl{-1} & \targ{} & \ctrl{-1} & \qw +\end{quantikz}=\begin{quantikz}[align equals at=1.5,column sep=0.3cm] + & \ctrl{1} & \targ{} & \qw \\ +\lstick{\ket{0}} & \targ{} & \ctrl{-1} & \qw +\end{quantikz} +\end{center} +\tcblower +\begin{lstlisting} +\begin{quantikz}[align equals at=1.5,column sep=0.3cm] +& \targ{} & \ctrl{1} & \targ{} & \qw \\ +\lstick{\ket{0}} & \ctrl{-1} & \targ{} & \ctrl{-1} & \qw +\end{quantikz}=\begin{quantikz}[align equals at=1.5,column sep=0.3cm] + & \ctrl{1} & \targ{} & \qw \\ +\lstick{\ket{0}} & \targ{} & \ctrl{-1} & \qw \end{quantikz} -$$ \end{lstlisting} \end{Code} -For more details on the possible syntax here, see the \verb!calc! library in tikz. +% If you want total control over vertical alignment between several different circuits, the trick is to use the \verb!baseline! key. All the baselines of different items are placed on the same level. This is particularly helpful if you give certain wires in the circuit a name, and that will let you place the baseline directly on a level with that wire. + +% To name a wire as `name', place an \verb!\alias{name}! command in any cell which is either empty, or contains a \verb!\qw!, \verb!\cw! or \verb!\push! \emph{only}, and place it before that command\footnote{Alternatively, for any node that accepts tikz styling parameters directly as an option, passing the option \texttt{alias=name} should do.}. That lets you align circuit identities such as +% \begin{Code} +% $$ +% \begin{quantikz}[baseline=(W.base)] +% \lstick{\ket{0}} & \qw & \ctrl{1} & \qw \\ +% & \gate{H} & \targ{} & \alias{W} \qw +% \end{quantikz} +% \equiv +% \begin{quantikz}[baseline=(W.base)] +% & \gate{H} & \gate{X} & \alias{W} \qw +% \end{quantikz} +% $$ +% \tcblower +% \begin{lstlisting} +% $$ +% \begin{quantikz}[baseline=(W.base)] +% \lstick{\ket{0}} & \qw & \ctrl{1} & \qw \\ +% & \gate{H} & \targ{} & \alias{W} \qw +% \end{quantikz} +% \equiv\begin{quantikz}[baseline=(W.base)] +% & \gate{H} & \gate{X} & \alias{W} \qw +% \end{quantikz} +% $$ +% \end{lstlisting} +% \end{Code} +% This has aligned the bottom wire of the first circuit with the wire in the second circuit, making the correspondence more obvious. However, the $\equiv$ sign is now in the wrong place, with its baseline placed at the same point as the baseline of the circuits. We can fix this with a vertical shift of the two diagrams. We demonstrate two different ways of achieving the same effect (the only important feature is that both diagrams have the same shift). +% \begin{Code} +% $$ +% \begin{quantikz}[baseline={($(W.base)+0.3*(0,1cm)$)}] +% \lstick{\ket{0}} & \qw & \ctrl{1} & \qw \\ +% & \gate{H} & \targ{} & \alias{W} \qw +% \end{quantikz} +% \equiv\begin{quantikz}[baseline={([yshift=0.3cm]new.base)}] +% & \gate{H} & \gate{X} & \alias{new} \qw +% \end{quantikz} +% $$ +% \tcblower +% \begin{lstlisting} +% $$ +% \begin{quantikz}[baseline={($(W.base)+0.3*(0,1cm)$)}] +% \lstick{\ket{0}} & \qw & \ctrl{1} & \qw \\ +% & \gate{H} & \targ{} & \alias{W} \qw +% \end{quantikz} +% \equiv\begin{quantikz}[baseline={([yshift=0.3cm]new.base)}] +% & \gate{H} & \gate{X} & \alias{new} \qw +% \end{quantikz} +% $$ +% \end{lstlisting} +% \end{Code} + +% If you have an even number if wires, you might choose to calculate the centre of the circuit from \verb!current bounding box.center!, or you could perform a calculation to average the position of two wires. This calculation can then be adjusted to take into account the desire to vertically align on the centre of an equals sign rather than the baseline (which is below the bottom of the equals) + +% \begin{Code} +% $$ +% \begin{quantikz}[baseline={($(W.base)!.5!(W2.base) - height("$\vcenter{}$")*(0,1pt)$)}] +% & \gate{X} & \ctrl{1} & \alias{W} \qw \\ +% & \ghost{X}\qw & \targ{} & \alias{W2} \qw +% \end{quantikz} +% =\begin{quantikz}[baseline={($(W.base)!.5!(W2.base) - height("$\vcenter{}$")*(0,1pt)$)}] +% & \ctrl{1} & \gate{X} & \qw \\ +% & \targ{} & \gate{X} & \qw +% \end{quantikz} +% $$ +% \tcblower +% \begin{lstlisting} +% $$ +% \begin{quantikz}[baseline={($(W.base)!.5!(W2.base) - height("$\vcenter{}$")*(0,1pt)$)}] +% & \gate{X} & \ctrl{1} & \alias{W} \qw \\ +% & \ghost{X}\qw & \targ{} & \alias{W2} \qw +% \end{quantikz} +% =\begin{quantikz}[baseline={($(W.base)!.5!(W2.base) - height("$\vcenter{}$")*(0,1pt)$)}] +% & \ctrl{1} & \gate{X} & \qw \\ +% & \targ{} & \gate{X} & \qw +% \end{quantikz} +% $$ +% \end{lstlisting} +% \end{Code} + +% For more details on the possible syntax here, see the \verb!calc! library in tikz. \subsection{Scaling} @@ -855,7 +979,7 @@ Individual gates can be modified using optional arguments of the calling functio \begin{Code} \begin{center} \begin{quantikz} -& \gate[style={fill=red!20},label style=cyan]{H} & \phase[green,label position=above]{\beta} & \gate{H} & \qw & \meter{$\ket{\pm}$} +& \gate[style={fill=red!20},label style=cyan]{H} & \phase[green,label position=above]{\beta} & \gate{H} & \qw & \meter[draw=blue]{$\ket{\pm}$} \end{quantikz} \end{center} \tcblower @@ -863,7 +987,7 @@ Individual gates can be modified using optional arguments of the calling functio \begin{quantikz} & \gate[style={fill=red!20},label style=cyan]{H} & \phase[green,label position=above]{\beta} - & \gate{H} & \qw & \meter{$\ket{\pm}$} + & \gate{H} & \qw & \meter[draw=blue]{$\ket{\pm}$} \end{quantikz} \end{lstlisting} \end{Code} @@ -872,7 +996,7 @@ The specific syntax varies a little depending on the type of gate \begin{tabular}{p{0.4\textwidth}|p{0.4\textwidth}} gates that don't accept formatting parameters & \verb!\qw!,\verb!\vqw!,\verb!\qwbundle!,\verb!\cw!,\verb!\vcw!,\verb!\cwbend!,\verb!\push! \\ \hline -gates that accept tikz node formatting keys directly in optional argument & \verb!\phase!, \verb!\control!, \verb!\ocontrol!, \verb!\targ!, \verb!\targX!, \verb!\meter!, \verb!\meterD!, \verb!\measure!, \verb!\measuretab!, \verb!\wave! \\ +gates that accept tikz node formatting keys directly in optional argument & \verb!\phase!, \verb!\control!, \verb!\ocontrol!, \verb!\targ!, \verb!\targX!, \verb!\trash!, \verb!\meter!, \verb!\meterD!, \verb!\measure!, \verb!\measuretab!, \verb!\wave! \\ \hline gates that accept node formatting keys as \verb!label style! key in optional argument & \verb!\gate!, \verb!\slice!, \verb!\lstick!, \verb!\rstick!, \verb!\gategroup!, \verb!\gateinput!, \verb!\gateoutput! \end{tabular} @@ -898,7 +1022,7 @@ This styling is really quite flexible, as we can override the default shapes wit \lstick{$\ket{0}$} & \qw & \targ{} & \qw & \qw & \qw & \ctrl{3} & \qw & \qw \\ \lstick{$\ket{0}$} & \qw & \targ{}& \qw & \qw & \qw & \qw & \ctrl{2} & \qw\\ &&&&\lstick{$\ket{0}$} & \targ{} & \targ{} & \qw & \meter{} \\ -&&&&\lstick{$\ket{0}$} & \qw & \targ{} & \targ{} & \meter{} +&&&&\lstick{$\ket{0}$} & \qw & \targ{} & \targ{} & \meter[draw=blue]{} \end{quantikz} \end{center} \tcblower @@ -910,7 +1034,7 @@ This styling is really quite flexible, as we can override the default shapes wit \lstick{$\ket{0}$} & \qw & \targ{} & \qw & \qw & \qw & \ctrl{3} & \qw & \qw \\ \lstick{$\ket{0}$} & \qw & \targ{}& \qw & \qw & \qw & \qw & \ctrl{2} & \qw\\ &&&&\lstick{$\ket{0}$} & \targ{} & \targ{} & \qw & \meter{} \\ -&&&&\lstick{$\ket{0}$} & \qw & \targ{} & \targ{} & \meter{} +&&&&\lstick{$\ket{0}$} & \qw & \targ{} & \targ{} & \meter[draw=blue]{} \end{quantikz} \end{lstlisting} \end{Code} @@ -1033,6 +1157,24 @@ A wave for separating rows. Do we really need this? Perhaps not, but it's fun! \end{lstlisting} \end{Code} + +Creating an ebit. The single parameter is whatever text you want. The first optional parameter specifies the angle of the initial line relative to the vertical, which defaults to -45. The second optional parameter gives stylings for the text label. +\begin{Code} +\begin{center} +\begin{tikzcd} +& \makeebit[-60][blue]{test} & \qw & \qw \\ + & & \qw & \qw +\end{tikzcd} +\end{center} +\tcblower +\begin{lstlisting} +\begin{tikzcd} +& \makeebit[-60][blue]{test} & \qw & \qw \\ + & & \qw & \qw +\end{tikzcd} +\end{lstlisting} +\end{Code} + \section{Converting from QCircuit} I've updated all of my existing teaching materials from QCircuit to Quantikz with very little trouble. There are a few standard replacements: @@ -1079,16 +1221,12 @@ Beamer is particularly annoying with doing this. It probably helps to issue a gl every matrix/.style={ampersand replacement=\&} } \end{lstlisting} -Beamer is particularly annoying with doing this. It probably helps to issue a global command -\begin{lstlisting} -\tikzcdset{ - every matrix/.style={ampersand replacement=\&} -} -\end{lstlisting} somewhere in your document preamble. The tikzcd manual suggests another possible strategy, but I haven't had much success with it. +\item If you're using a circuit diagram inside an \texttt{align} environment, the \texttt{tikzcd} environment works better than \texttt{quantikz}. You may also need to use the ampersand replacement strategy. \item If you have a \verb!\cwbend! in the bottom right cell of the matrix, sometimes you get an error (I have no understanding of why). Add an extra \& after, and all seems to be well. \item If you're using transparency, and the width of gates seems to be greater than you expected, it may be worthwhile removing the .aux file and recompiling. If your tex editor isn't good at resetting the .aux file, the system may be remembering older widths. \item The code provides definitions for \verb!\bra!, \verb!\ket!, \verb!\proj!, \verb!\braket!. If you don't like them, just define your own versions \emph{before} you load the quantikz library. +\item Package load order: I've had reports that if you load certain packages in the wrong order it can create weird errors. For example, if you load the package cleveref after quantikz, and then use a split environment, it can lead to the error ``Only one \# is allowed per tab.''. Change the load order and it goes away. I have no idea why this happens. \end{itemize} For any bug reports (please make sure you've checked the above list first!) or feature requests, please contact alastair.kay@rhul.ac.uk. diff --git a/graphics/pgf/contrib/quantikz/tikzlibraryquantikz.code.tex b/graphics/pgf/contrib/quantikz/tikzlibraryquantikz.code.tex index 3c67e016da..ff85895781 100644 --- a/graphics/pgf/contrib/quantikz/tikzlibraryquantikz.code.tex +++ b/graphics/pgf/contrib/quantikz/tikzlibraryquantikz.code.tex @@ -1,9 +1,20 @@ -%This is the quantikz library for typesetting quantum circuits using LaTeX/Tikz. version 0.9.4 +%This is the quantikz library for typesetting quantum circuits using LaTeX/Tikz. version 0.9.6 % Written by Alastair Kay, 2018. Published under a CC-BY-4.0 licence % Please email me (alastair.kay@rhul.ac.uk) with any bug reports or feature requests. % If you find this library useful, please cite its usage in your work, using arXiv:1809.03842, and possibly the DOI: 10.17637/rh.7000520. % Usage is at your own risk. +%version 0.9.6: +% changed packaging so there isn't a compile warning any more +% modified the meter command so that \meter[draw=blue]{} colours everything blue, not just outline. +% added trash command +% added \ctrlbundle command so that \ctrl works well with \qwbundle[alternate]. If you supple \ctrlbundle[2]{}, then the bundle only contains 2 wires instead of the default of 3 +% \qwbundle[alternate] now also works with the parameter \qwbundle[alternate=2] to only have 2 wires in the bundle. +% added \midstick. Works a bit like rstick and lstick, but reserves space for the text. Can choose to have brackets=none|left|right|both (default is both). Gives better method for circuit identities and other things. +% added "align equals at" key for setting circuit identities (specifies wire number that should line up with equals. can be non-integer) +% added makeebit command. accepts one parameter which is the text. Haven't got tyling and different angles of the split working yet. +% added bundle option to supplement nwires and cwires. +% fixed bug where you couldn't put a wire command after the declaration of a multi-qubit gate command. %version 0.9.5: % fixed bug which meant multi-wire gates didn't work outside of an environment such as center. %version 0.9.4: @@ -32,13 +43,13 @@ %version 0.9.0: %original release. -\ProvidesPackage{quantikz}[2019/04/24 typeset quantum circuit diagrams] +%\ProvidesPackage{quantikz}[2020/04/27 typeset quantum circuit diagrams] % Package(s) to include -\RequirePackage{xargs,ifthen,xstring,xparse,etoolbox,mathtools} +\RequirePackage{xargs,ifthen,xstring,xparse,etoolbox,mathtools,pgfmath} \RequirePackage{environ} %in an attempt to help with compatibility with the external library of tikz. -\RequirePackage{tikz} -\usetikzlibrary{cd,decorations.pathreplacing,calc,positioning,fit,shapes.symbols,decorations.pathmorphing,shapes.misc,backgrounds,decorations.markings} +%\RequirePackage{tikz} +\usetikzlibrary{cd,decorations.pathreplacing,calc,positioning,fit,shapes.symbols,decorations.pathmorphing,shapes.misc,backgrounds,decorations.markings,math} \newlength{\myl} \newlength{\myh} @@ -126,6 +137,10 @@ % \minwidth % } +%find the vertical position of the middle of an equals sign +%https://tex.stackexchange.com/questions/355680/how-can-i-vertically-align-an-equals-sign-in-a-tikz-node/355686 +\pgfmathsetmacro\MathAxis{height("$\vcenter{}$")} + %the main gate command \DeclareExpandableDocumentCommand{\gate}{O{}O{1.5pt}O{1.5pt}m}{%optional parameter contains styling info. compulsory is gate text. |[inner sep=4pt,minimum width=#2,minimum height=#3]|% @@ -143,6 +158,7 @@ \pgfkeysgetvalue{/quantikz/label style}{\b} \pgfkeysgetvalue{/quantikz/cwires}{\mylist} \pgfkeysgetvalue{/quantikz/nwires}{\nowires} + \pgfkeysgetvalue{/quantikz/bundle}{\bundle} \ifthenelse{\toswap=1}{%if it's a swap gate... \def\quantwires{2} \phantom{wide} @@ -162,29 +178,32 @@ } } % - \IfInList{1}{\mylist}{\cw}{\IfInList{1}{\nowires}{}{\qw}}%do we need classical, no wire, or quantum wire? + \IfInList{1}{\mylist}{\cw}{\IfInList{1}{\nowires}{}{\IfInList{1}{\bundle}{\qwbundle[alternate]{}}{\qw}}}%do we need classical, no wire, or quantum wire? \edef\k{\the\numexpr\n+\quantwires-1\relax} \edef\mn{\the\numexpr\m-1\relax} \ifthenelse{\quantwires=1}{}{%more than 1 wire on gate. iterate through each wire \foreach \i in {\the\numexpr\n+1\relax,...,\k} { \edef\newcom{\noexpand\vcwhexplicit{\i-\m}{\i-\mn}} \edef\newcomb{\noexpand\vqwexplicit{\i-\m}{\i-\mn}} + \edef\newcomc{\noexpand\vqbundleexplicit{\i-\m}{\i-\mn}} \edef\val{\the\numexpr\i+1-\n\relax} - \IfInList{\val}{\mylist}{\newcom}{\IfInList{\val}{\nowires}{}{\newcomb}}%do we need classical, no wire, or quantum wire? + \IfInList{\val}{\mylist}{\newcom}{\IfInList{\val}{\nowires}{}{\IfInList{\val}{\bundle}{\newcomc}{\newcomb}}}%do we need classical, no wire, or quantum wire? %apply auto width to the cell, and make sure we unset the setting so that it doesn't apply to later circuits. + %I think use of globaldefs in this way is very slow, but I don't know of a better way. \globaldefs=1 - \edef\dotikzset{\noexpand\tikzset{row \i\space column \m/.append style={minimum width={max(\the\myl+8pt,#2)}}}} - \dotikzset - \edef\undotikzset{\noexpand\tikzset{row \i\space column \m/.style={}}} - \expandafter\pgfutil@g@addto@macro\expandafter\tikzcd@atendglobals\expandafter{\undotikzset} + \edef\dotikzset{\noexpand\tikzset{row \i\space column \m/.append style={minimum width={max(\the\myl+8pt,#2)}}}}% + \dotikzset% + \edef\undotikzset{\noexpand\tikzset{row \i\space column \m/.style={}}}% + \expandafter\pgfutil@g@addto@macro\expandafter\tikzcd@atendglobals\expandafter{\undotikzset}% } %apply auto height to last row only. unsetting already handled above. - \globaldefs=1 - \edef\dotikzset{\noexpand\tikzset{row \k\space column \m/.append style={minimum height={max(\the\myh+\the\myd+8pt,#3)}}}} - \dotikzset + \globaldefs=1% + \edef\dotikzset{\noexpand\tikzset{row \k\space column \m/.append style={minimum height={max(\the\myh+\the\myd+8pt,#3)}}}}% + \dotikzset% + \globaldefs=0% % } - %call deferred gate command. + %call deferred gate command. to be executed after the tikzcd matrix stuff is completed \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgfutil@g@addto@macro\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\tikzcd@atendsavedpaths\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gate@end\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\a\expandafter\expandafter\expandafter}\expandafter\expandafter\expandafter{\expandafter\b\expandafter}\expandafter{\options}{#4} } @@ -195,12 +214,13 @@ \pgfkeys{/quantikz,wires=1} \def\toswap{0} \def\DisableMinSize{0} - \pgfkeys{/quantikz,#3}% + \pgfkeys{/quantikz,#3}%import options \pgfkeysgetvalue{/quantikz/wires}{\quantwires} \pgfkeysgetvalue{/quantikz/row}{\row} \pgfkeysgetvalue{/quantikz/col}{\col} \ifthenelse{\toswap=1}{\def\quantwires{2}}{} \xdef\LoopGG{} + %create a list of cell names to be included in this grouped gate \foreach \n in {\row,...,\the\numexpr\row+\quantwires-1\relax} { \ifnodedefined{\tikzcdmatrixname-\n-\col}{ \xdef\LoopGG{\LoopGG(\tikzcdmatrixname-\n-\col)} @@ -212,6 +232,7 @@ \draw [line width=3pt,white,shorten >=0.9pt,shorten <=0.9pt] (group\tikzcdmatrixname-\row-\col.east|-\tikzcdmatrixname-\row-\col.center) to[out=180,in=0] (group\tikzcdmatrixname-\row-\col.west|-\tikzcdmatrixname-\the\numexpr\row+1\relax-\col.center); \draw [thickness] (group\tikzcdmatrixname-\row-\col.east|-\tikzcdmatrixname-\row-\col.center) to[out=180,in=0] (group\tikzcdmatrixname-\row-\col.west|-\tikzcdmatrixname-\the\numexpr\row+1\relax-\col.center); }{ + %the actual gate drawing command \node (group\tikzcdmatrixname-\row-\col) [fit=\LoopGG,operator,inner sep=0pt,label={[gg label,#2]$#4$},#1] {\hphantom{$#4$}}; } } @@ -290,6 +311,41 @@ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\groupoutput@end\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\newoptions\expandafter\expandafter\expandafter}\expandafter\expandafter\expandafter{\expandafter\options\expandafter}\expandafter{\opts}{#2}% } } + +\newcommand\midstick[2][]{% + \hphantom{\text{gg#2gg}}\ %leave enough space for whatever text we've inserted + \pgfkeys{/quantikz,wires=1,style=,label style=,braces=} + \pgfkeys{/quantikz,#1}% + \edef\newoptions{row=\the\pgfmatrixcurrentrow,col=\the\pgfmatrixcurrentcolumn,#1} + \pgfkeysgetvalue{/quantikz/wires}{\quantwires} + \pgfkeysgetvalue{/quantikz/label style}{\options} + \pgfkeysgetvalue{/quantikz/braces}{\opts} + \edef\n{\the\pgfmatrixcurrentrow} %the row + \edef\m{\the\pgfmatrixcurrentcolumn} %the column + \edef\mn{\the\numexpr\m-1\relax} + \edef\k{\the\numexpr\n+\quantwires-1\relax} + \settowidth{\myl}{gg#2gg} + %if more than 1 wire, need to reserve space for each wire + \ifthenelse{\quantwires=1}{}{ + \foreach \i in {\the\numexpr\n+1\relax,...,\k} { + \edef\val{\the\numexpr\i+1-\n\relax} + %apply auto width to the cell, and make sure we unset the setting so that it doesn't apply to later circuits. + %I think use of globaldefs in this way is very slow, but I don't know of a better way. + \globaldefs=1 + \edef\dotikzset{\noexpand\tikzset{row \i\space column \m/.append style={minimum width={\the\myl}}}} + \dotikzset + \edef\undotikzset{\noexpand\tikzset{row \i\space column \m/.style={}}} + \expandafter\pgfutil@g@addto@macro\expandafter\tikzcd@atendglobals\expandafter{\undotikzset} + \globaldefs=0 + } +% + } + %\edef\n{\the\pgfmatrixcurrentrow} + %\edef\m{\the\pgfmatrixcurrentcolumn} + \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgfutil@g@addto@macro\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\tikzcd@atendsavedpaths\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{% + \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\groupoutput@mid\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\newoptions\expandafter\expandafter\expandafter}\expandafter\expandafter\expandafter{\expandafter\options\expandafter}\expandafter{\opts}{#2}% + } +} %deferred labelling of inputs \newcommand{\groupinput@end}[4]{%basic data as keys, lable options, brace options, text \pgfkeys{/quantikz,wires=1} @@ -311,7 +367,7 @@ } } % %deferred labelling of outputs -\newcommand{\groupoutput@end}[4]{%basic data as keys, lable options, brace options, text +\newcommand{\groupoutput@end}[4]{%basic data as keys, label options, brace options, text \pgfkeys{/quantikz,wires=1} \pgfkeys{/quantikz,#1}% \pgfkeysgetvalue{/quantikz/wires}{\quantwires} @@ -329,6 +385,31 @@ \draw[dd,#3] ($(outgr-\row.north east)+(0.1cm,0.1cm)$) to node[midway,align=center,anchor=west,xshift=0.1cm,#2] {#4} ($(outgr-\row.south east)+(0.1cm,-0.1cm)$); } } % +%deferred labelling in the middle of circuits +\newcommand{\groupoutput@mid}[4]{%basic data as keys, label options, brace options, text + \pgfkeys{/quantikz,wires=1} + \def\leftbrace{1}\def\rightbrace{1} + \pgfkeys{/quantikz,#1}% + \pgfkeysgetvalue{/quantikz/wires}{\quantwires} + \pgfkeysgetvalue{/quantikz/row}{\row} + \pgfkeysgetvalue{/quantikz/col}{\col} + \xdef\LoopGO{} + \foreach \n in {\row,...,\the\numexpr\row+\quantwires-1\relax} { + \ifnodedefined{\tikzcdmatrixname-\n-\col}{ + \xdef\LoopGO{\LoopGO(\tikzcdmatrixname-\n-\col)} + }} + \ifthenelse{\quantwires=1} { + \node (midgr-\row-\col) [fit=\LoopGO, inner sep=0pt,label={[align=center,#2]#4}] {}; + }{ + \node (midgr-\row-\col) [fit=\LoopGO, inner sep=0pt,label={[anchor=mid,#2]center:#4}] {}; + \ifthenelse{\rightbrace=1}{ + \draw[dm,#3] ($(midgr-\row-\col.north east)+(-0.1cm,0.05cm)$) to ($(midgr-\row-\col.south east)+(-0.1cm,-0.05cm)$); + }{} + \ifthenelse{\leftbrace=1}{ + \draw[dd,#3] ($(midgr-\row-\col.north west)+(0.1cm,0.05cm)$) to ($(midgr-\row-\col.south west)+(0.1cm,-0.05cm)$); + }{} + } +} % %inputs and outputs within a multi-wire gate \newcommand\gateinput[2][]{% \pgfkeys{/quantikz,wires=1,style=,label style=,braces=}% @@ -409,6 +490,14 @@ \node (wave-#1) [fit=(\tikzcdmatrixname-row#1),wave,#2] {}; } +\DeclareDocumentCommand{\makeebit}{O{-45}O{}m}{ + \arrow[arrows,line cap=round,to path={(\tikztostart) -- ($(\tikztostart)!{0.5/cos(#1)}!#1:(\tikztotarget)$) node [anchor=east,style={#2}]{#3} -- (\tikztotarget) }]{d} +} + +% \newcommand{\makeebit}[2][-45]{ +% \arrow[arrows,line cap=round,to path={(\tikztostart) -- ($(\tikztostart)!0.707!#1:(\tikztotarget)$) node [anchor=east]{#2} -- (\tikztotarget) }]{d} +% } + %put a border around a group of gates \newcommand\gategroup[2][]{% \pgfkeys{/quantikz,wires=1,style=,label style=,braces=} @@ -484,7 +573,7 @@ \def\errmessage##1{\tikzcd@errmessage{##1^^J...^^Jl.\tikzcd@lineno\space% I think the culprit is a tikzcd arrow in cell \tikzcd@currentrow-\tikzcd@currentcolumn}}% \tikzcd@before@paths@hook% - \tikzcd@savedpaths\tikzcd@atendsavedpaths\tikzcd@atendlabels\tikzcd@atendslices{\globaldefs=1\tikzcd@atendglobals}%I just added stuff here instead + \tikzcd@savedpaths\tikzcd@atendsavedpaths\tikzcd@atendlabels\tikzcd@atendslices{\globaldefs=1\tikzcd@atendglobals\globaldefs=0}%I just added stuff here instead \endgroup% \end{tikzpicture}% \ifnum0=`{}\fi} @@ -521,15 +610,37 @@ } } -%initialise all the pgfkeys for key=value parametre passing in macro options +%take a parameter, row number, where we want to set the baseline. if not integer, use the two rows spanned +\providecommand{\setmiddle}[1]{% +\IfInteger{#1}{ +\pgfmathtruncatemacro\wholepart{floor(#1)} +\edef\temp{\noexpand\tikzset{% +/tikz/baseline={([yshift=-\MathAxis]\noexpand\tikzcdmatrixname-\wholepart-1.base)} +}} +%\show\temp +\temp +}{% +\pgfmathtruncatemacro\wholepart{floor(#1)} +\pgfmathtruncatemacro\neighbour{floor(#1)+1} +\pgfmathsetmacro\fractionalpart{#1-floor(#1)} +\edef\temp{\noexpand\tikzset{% +/tikz/baseline={([yshift=-\MathAxis]$(\noexpand\tikzcdmatrixname-\wholepart-1.base)!\fractionalpart!(\noexpand\tikzcdmatrixname-\neighbour-1.base)$)} +}} +%\show\temp +\temp +} +} -\pgfkeys{/tikz/slice all/.code={\def\toslice{1}},/tikz/remove end slices/.initial=0,/tikz/slice titles/.initial={\col},/tikz/slice style/.initial={},/tikz/slice label style/.initial={},/tikz/thin lines/.code={\resetstyles},/tikz/transparent/.code={\maketransparent},/tikz/vertical slice labels/.code={\def\vert{1}}} +%initialise all the pgfkeys for key=value parameter passing in macro options + +\pgfkeys{/tikz/slice all/.code={\def\toslice{1}},/tikz/remove end slices/.initial=0,/tikz/slice titles/.initial={\col},/tikz/slice style/.initial={},/tikz/slice label style/.initial={},/tikz/thin lines/.code={\resetstyles},/tikz/transparent/.code={\maketransparent},/tikz/vertical slice labels/.code={\def\vert{1}},/tikz/align equals at/.code={\setmiddle{#1}}} \pgfkeys{/quantikz/.is family,/quantikz,% .unknown/.style={% /quantikz/wires=\pgfkeyscurrentname },% wires/.initial=1,% -style/.initial={},label style/.initial={},braces/.initial={},background/.code={\def\background{1}},alternate/.code={\def\helper{1}},row/.initial=1,col/.initial=1,steps/.initial=1,Strike Width/.initial=0.08cm,Strike Height/.initial=0.12cm,swap/.code={\def\toswap{1}},disable auto height/.code={\def\DisableMinSize{1}},cwires/.initial={-1},nwires/.initial={-1}} +style/.initial={},label style/.initial={},braces/.initial={},background/.code={\def\background{1}},alternate/.default=1,alternate/.code={\def\helper{#1}},row/.initial=1,col/.initial=1,steps/.initial=1,Strike Width/.initial=0.08cm,Strike Height/.initial=0.12cm,swap/.code={\def\toswap{1}},disable auto height/.code={\def\DisableMinSize{1}},cwires/.initial={-1},nwires/.initial={-1},bundle/.initial={-1},brackets/.is choice,brackets/.initial=both} +\pgfkeys{/quantikz,brackets/.cd,none/.code={\def\leftbrace{0}\def\rightbrace{0}},left/.code={\def\leftbrace{1}\def\rightbrace{0}},right/.code={\def\leftbrace{0}\def\rightbrace{1}},both/.code={\def\leftbrace{1}\def\rightbrace{1}}} %my standard Dirac notation commands. can be overridden by user. \providecommand{\ket}[1]{\ensuremath{\left|#1\right\rangle}} @@ -554,9 +665,12 @@ style/.initial={},label style/.initial={},braces/.initial={},background/.code={\ \DeclareExpandableDocumentCommand{\measuretab}{O{}{m}}{|[measuretab,#1]| {#2} \qw} \DeclareExpandableDocumentCommand{\meterD}{O{}{m}}{|[meterD,#1]| {#2} \qw} \DeclareExpandableDocumentCommand{\measure}{O{}{m}}{|[measure,#1]| {#2} \qw} +\DeclareExpandableDocumentCommand{\trash}{O{}{m}}{|[trash,label={below:#2},#1]| {} \qw} + %controlled gates \def\ctrl#1{\control{} \vqw{#1}} +\DeclareExpandableDocumentCommand{\ctrlbundle}{O{1}O{}m}{|[phase bundle,#2]| {} \vqw{#3}\qwbundle[alternate=#1]{}} \def\octrl#1{\ocontrol{}\vqw{#1}} \def\swap#1{% \targX{} @@ -582,6 +696,9 @@ style/.initial={},label style/.initial={},braces/.initial={},background/.code={\ \newcommand{\vqwexplicit}[2]{ \arrow[from=#1,to=#2,arrows] {} } +\newcommand{\vqbundleexplicit}[2]{ + \arrow[from=#1,to=#2,arrows] {} \arrow[from=#1,to=#2,arrows,yshift=0.1cm] {}\arrow[from=#1,to=#2,arrows,yshift=-0.1cm] {} +} %classical vertical wire, absolute positioning \newcommand{\vcwexplicit}[2]{ \arrow[from=#1,to=#2,arrows,xshift=0.05cm] {}\arrow[from=#1,to=#2,arrows,xshift=-0.05cm] {} @@ -604,10 +721,12 @@ style/.initial={},label style/.initial={},braces/.initial={},background/.code={\ \newcommand{\qwbundle}[2][]{\ifthenelse{\the\pgfmatrixcurrentcolumn>1}{ \def\helper{0} \pgfset{/quantikz,#1} - \ifthenelse{\helper=1}{ - \arrow[arrows,yshift=0.1cm]{l}\arrow[arrows]{l}\arrow[arrows,yshift=-0.1cm]{l} + \ifthenelse{\helper>0}{ + \arrow[arrows,yshift=0.1cm]{l} + \ifthenelse{\helper=1}{\arrow[arrows]{l}}{} + \arrow[arrows,yshift=-0.1cm]{l} }{ - \arrow[phantom,strike arrow]{l}[xshift=\pgfkeysvalueof{/quantikz/Strike Width}, yshift=\pgfkeysvalueof{/quantikz/Strike Height},anchor=south west,inner sep=0pt]{\scriptstyle #2} + \arrow[phantom,strike arrow]{l}[xshift=\pgfkeysvalueof{/quantikz/Strike Width}, yshift=\pgfkeysvalueof{/quantikz/Strike Height},anchor=south west,inner sep=0pt]{\scriptstyle #2}\qw }}{}} @@ -629,6 +748,7 @@ style/.initial={},label style/.initial={},braces/.initial={},background/.code={\ rightinternal/.style={anchor=mid east,font=\scriptsize,inner sep=4pt,align=center}, wave/.style={inner sep=-3pt,tape,fill=white,apply={draw=black} except on segments {5,6,1,2,9}}, phase/.style={fill,shape=circle,minimum size=4pt}, + phase bundle/.style={fill,shape=rectangle,rounded corners=1.5pt,minimum width=4pt,minimum height=10pt}, phase label/.style={label distance=2mm,anchor=mid,label position=45}, ophase/.style={fill=white,draw=black,shape=circle,minimum size=4pt}, internal/.style={thickness,black}, @@ -645,11 +765,12 @@ style/.initial={},label style/.initial={},braces/.initial={},background/.code={\ (path picture bounding box.south east) -- (path picture bounding box.north west) (path picture bounding box.south west) -- (path picture bounding box.north east) (path picture bounding box.west) -- (path picture bounding box.east); }}, crossx2/.style={circle,crossx,minimum size=1em}, + trash/.style={path picture={\draw[internal,inner sep=0pt,-stealth] (path picture bounding box.west) -- (path picture bounding box.center) -- (path picture bounding box.south);},minimum height=2.5em,minimum width=2em}, dd/.style={decoration={brace},decorate,thickness}, dm/.style={decoration={brace,mirror},decorate,thickness}, slice/.style={thickness,red,dash pattern=on 5pt off 3pt,align=center}, meter/.style={draw,fill=white,minimum width=2em,minimum height=1.5em, rectangle, font=\vphantom{A}, thickness, - path picture={\draw[black] ([shift={(.1,.24)}]path picture bounding box.south west) to[bend left=50] ([shift={(-.1,.24)}]path picture bounding box.south east);\draw[black,-{Latex[scale=0.6]}] ([shift={(0,.1)}]path picture bounding box.south) -- ([shift={(.3,-.1)}]path picture bounding box.north);}}, + path picture={\draw ([shift={(.1,.24)}]path picture bounding box.south west) to[bend left=50] ([shift={(-.1,.24)}]path picture bounding box.south east);\draw[-{Latex[scale=0.6]}] ([shift={(0,.1)}]path picture bounding box.south) -- ([shift={(.3,-.1)}]path picture bounding box.north);}}, measuretab/.style={draw,signal,signal to=west,inner sep=4pt,fill=white}, meterD/.style={draw,rounded rectangle,rounded rectangle left arc=none,inner sep=4pt,fill=white}, measure/.style={draw,rounded rectangle,inner sep=4pt,fill=white}, |