diff options
author | Karl Berry <karl@freefriends.org> | 2015-08-17 22:16:32 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2015-08-17 22:16:32 +0000 |
commit | b1d20363871115b9069612379a4904914558483f (patch) | |
tree | 62cbd89556a7d67cc5d32ac072b3379f475693e6 | |
parent | c970c7a71b932db2126f7e23ee447c74de7d6d81 (diff) |
blochsphere (17aug15)
git-svn-id: svn://tug.org/texlive/trunk@38137 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r-- | Master/texmf-dist/doc/latex/blochsphere/LICENSE | 417 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/blochsphere/README.md | 6 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/blochsphere/blochsphere.pdf | bin | 0 -> 95413 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/blochsphere/example.pdf | bin | 0 -> 29938 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/blochsphere/example.tex | 30 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/blochsphere/blochsphere.dtx | 853 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/blochsphere/blochsphere.ins | 57 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/blochsphere/blochsphere.sty | 407 | ||||
-rwxr-xr-x | Master/tlpkg/bin/tlpkg-ctan-check | 3 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/blochsphere.tlpsrc | 0 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/collection-pictures.tlpsrc | 1 |
11 files changed, 1773 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/blochsphere/LICENSE b/Master/texmf-dist/doc/latex/blochsphere/LICENSE new file mode 100644 index 00000000000..9566bc7ca8d --- /dev/null +++ b/Master/texmf-dist/doc/latex/blochsphere/LICENSE @@ -0,0 +1,417 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.3c 2008-05-04 + +Copyright 1999 2002-2008 LaTeX3 Project + Everyone is allowed to distribute verbatim copies of this + license document, but modification of it is not allowed. + + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the primary license under +which the LaTeX kernel and the base LaTeX packages are distributed. + +You may use this license for any work of which you hold the copyright +and which you wish to distribute. This license may be particularly +suitable if your work is TeX-related (such as a LaTeX package), but +it is written in such a way that you can use it even if your work is +unrelated to TeX. + +The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE', +below, gives instructions, examples, and recommendations for authors +who are considering distributing their works under this license. + +This license gives conditions under which a work may be distributed +and modified, as well as conditions under which modified versions of +that work may be distributed. + +We, the LaTeX3 Project, believe that the conditions below give you +the freedom to make and distribute modified versions of your work +that conform with whatever technical specifications you wish while +maintaining the availability, integrity, and reliability of +that work. If you do not see how to achieve your goal while +meeting these conditions, then read the document `cfgguide.tex' +and `modguide.tex' in the base LaTeX distribution for suggestions. + + +DEFINITIONS +=========== + +In this license document the following terms are used: + + `Work' + Any work being distributed under this License. + + `Derived Work' + Any work that under any applicable law is derived from the Work. + + `Modification' + Any procedure that produces a Derived Work under any applicable + law -- for example, the production of a file containing an + original file associated with the Work or a significant portion of + such a file, either verbatim or with modifications and/or + translated into another language. + + `Modify' + To apply any procedure that produces a Derived Work under any + applicable law. + + `Distribution' + Making copies of the Work available from one person to another, in + whole or in part. Distribution includes (but is not limited to) + making any electronic components of the Work accessible by + file transfer protocols such as FTP or HTTP or by shared file + systems such as Sun's Network File System (NFS). + + `Compiled Work' + A version of the Work that has been processed into a form where it + is directly usable on a computer system. This processing may + include using installation facilities provided by the Work, + transformations of the Work, copying of components of the Work, or + other activities. Note that modification of any installation + facilities provided by the Work constitutes modification of the Work. + + `Current Maintainer' + A person or persons nominated as such within the Work. If there is + no such explicit nomination then it is the `Copyright Holder' under + any applicable law. + + `Base Interpreter' + A program or process that is normally needed for running or + interpreting a part or the whole of the Work. + + A Base Interpreter may depend on external components but these + are not considered part of the Base Interpreter provided that each + external component clearly identifies itself whenever it is used + interactively. Unless explicitly specified when applying the + license to the Work, the only applicable Base Interpreter is a + `LaTeX-Format' or in the case of files belonging to the + `LaTeX-format' a program implementing the `TeX language'. + + + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +1. Activities other than distribution and/or modification of the Work +are not covered by this license; they are outside its scope. In +particular, the act of running the Work is not restricted and no +requirements are made concerning any offers of support for the Work. + +2. You may distribute a complete, unmodified copy of the Work as you +received it. Distribution of only part of the Work is considered +modification of the Work, and no right to distribute such a Derived +Work may be assumed under the terms of this clause. + +3. You may distribute a Compiled Work that has been generated from a +complete, unmodified copy of the Work as distributed under Clause 2 +above, as long as that Compiled Work is distributed in such a way that +the recipients may install the Compiled Work on their system exactly +as it would have been installed if they generated a Compiled Work +directly from the Work. + +4. If you are the Current Maintainer of the Work, you may, without +restriction, modify the Work, thus creating a Derived Work. You may +also distribute the Derived Work without restriction, including +Compiled Works generated from the Derived Work. Derived Works +distributed in this manner by the Current Maintainer are considered to +be updated versions of the Work. + +5. If you are not the Current Maintainer of the Work, you may modify +your copy of the Work, thus creating a Derived Work based on the Work, +and compile this Derived Work, thus creating a Compiled Work based on +the Derived Work. + +6. If you are not the Current Maintainer of the Work, you may +distribute a Derived Work provided the following conditions are met +for every component of the Work unless that component clearly states +in the copyright notice that it is exempt from that condition. Only +the Current Maintainer is allowed to add such statements of exemption +to a component of the Work. + + a. If a component of this Derived Work can be a direct replacement + for a component of the Work when that component is used with the + Base Interpreter, then, wherever this component of the Work + identifies itself to the user when used interactively with that + Base Interpreter, the replacement component of this Derived Work + clearly and unambiguously identifies itself as a modified version + of this component to the user when used interactively with that + Base Interpreter. + + b. Every component of the Derived Work contains prominent notices + detailing the nature of the changes to that component, or a + prominent reference to another file that is distributed as part + of the Derived Work and that contains a complete and accurate log + of the changes. + + c. No information in the Derived Work implies that any persons, + including (but not limited to) the authors of the original version + of the Work, provide any support, including (but not limited to) + the reporting and handling of errors, to recipients of the + Derived Work unless those persons have stated explicitly that + they do provide such support for the Derived Work. + + d. You distribute at least one of the following with the Derived Work: + + 1. A complete, unmodified copy of the Work; + if your distribution of a modified component is made by + offering access to copy the modified component from a + designated place, then offering equivalent access to copy + the Work from the same or some similar place meets this + condition, even though third parties are not compelled to + copy the Work along with the modified component; + + 2. Information that is sufficient to obtain a complete, + unmodified copy of the Work. + +7. If you are not the Current Maintainer of the Work, you may +distribute a Compiled Work generated from a Derived Work, as long as +the Derived Work is distributed to all recipients of the Compiled +Work, and as long as the conditions of Clause 6, above, are met with +regard to the Derived Work. + +8. The conditions above are not intended to prohibit, and hence do not +apply to, the modification, by any method, of any component so that it +becomes identical to an updated version of that component of the Work as +it is distributed by the Current Maintainer under Clause 4, above. + +9. Distribution of the Work or any Derived Work in an alternative +format, where the Work or that Derived Work (in whole or in part) is +then produced by applying some process to that format, does not relax or +nullify any sections of this license as they pertain to the results of +applying that process. + +10. a. A Derived Work may be distributed under a different license + provided that license itself honors the conditions listed in + Clause 6 above, in regard to the Work, though it does not have + to honor the rest of the conditions in this license. + + b. If a Derived Work is distributed under a different license, that + Derived Work must provide sufficient documentation as part of + itself to allow each recipient of that Derived Work to honor the + restrictions in Clause 6 above, concerning changes from the Work. + +11. This license places no restrictions on works that are unrelated to +the Work, nor does this license place any restrictions on aggregating +such works with the Work by any means. + +12. Nothing in this license is intended to, or may be used to, prevent +complete compliance by all parties with all applicable laws. + + +NO WARRANTY +=========== + +There is no warranty for the Work. Except when otherwise stated in +writing, the Copyright Holder provides the Work `as is', without +warranty of any kind, either expressed or implied, including, but not +limited to, the implied warranties of merchantability and fitness for a +particular purpose. The entire risk as to the quality and performance +of the Work is with you. Should the Work prove defective, you assume +the cost of all necessary servicing, repair, or correction. + +In no event unless required by applicable law or agreed to in writing +will The Copyright Holder, or any author named in the components of the +Work, or any other party who may distribute and/or modify the Work as +permitted above, be liable to you for damages, including any general, +special, incidental or consequential damages arising out of any use of +the Work or out of inability to use the Work (including, but not limited +to, loss of data, data being rendered inaccurate, or losses sustained by +anyone as a result of any failure of the Work to operate with any other +programs), even if the Copyright Holder or said author or said other +party has been advised of the possibility of such damages. + + +MAINTENANCE OF THE WORK +======================= + +The Work has the status `author-maintained' if the Copyright Holder +explicitly and prominently states near the primary copyright notice in +the Work that the Work can only be maintained by the Copyright Holder +or simply that it is `author-maintained'. + +The Work has the status `maintained' if there is a Current Maintainer +who has indicated in the Work that they are willing to receive error +reports for the Work (for example, by supplying a valid e-mail +address). It is not required for the Current Maintainer to acknowledge +or act upon these error reports. + +The Work changes from status `maintained' to `unmaintained' if there +is no Current Maintainer, or the person stated to be Current +Maintainer of the work cannot be reached through the indicated means +of communication for a period of six months, and there are no other +significant signs of active maintenance. + +You can become the Current Maintainer of the Work by agreement with +any existing Current Maintainer to take over this role. + +If the Work is unmaintained, you can become the Current Maintainer of +the Work through the following steps: + + 1. Make a reasonable attempt to trace the Current Maintainer (and + the Copyright Holder, if the two differ) through the means of + an Internet or similar search. + + 2. If this search is successful, then enquire whether the Work + is still maintained. + + a. If it is being maintained, then ask the Current Maintainer + to update their communication data within one month. + + b. If the search is unsuccessful or no action to resume active + maintenance is taken by the Current Maintainer, then announce + within the pertinent community your intention to take over + maintenance. (If the Work is a LaTeX work, this could be + done, for example, by posting to comp.text.tex.) + + 3a. If the Current Maintainer is reachable and agrees to pass + maintenance of the Work to you, then this takes effect + immediately upon announcement. + + b. If the Current Maintainer is not reachable and the Copyright + Holder agrees that maintenance of the Work be passed to you, + then this takes effect immediately upon announcement. + + 4. If you make an `intention announcement' as described in 2b. above + and after three months your intention is challenged neither by + the Current Maintainer nor by the Copyright Holder nor by other + people, then you may arrange for the Work to be changed so as + to name you as the (new) Current Maintainer. + + 5. If the previously unreachable Current Maintainer becomes + reachable once more within three months of a change completed + under the terms of 3b) or 4), then that Current Maintainer must + become or remain the Current Maintainer upon request provided + they then update their communication data within one month. + +A change in the Current Maintainer does not, of itself, alter the fact +that the Work is distributed under the LPPL license. + +If you become the Current Maintainer of the Work, you should +immediately provide, within the Work, a prominent and unambiguous +statement of your status as Current Maintainer. You should also +announce your new status to the same pertinent community as +in 2b) above. + + +WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE +====================================================== + +This section contains important instructions, examples, and +recommendations for authors who are considering distributing their +works under this license. These authors are addressed as `you' in +this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your work you want or need to use *distribution* +conditions that differ significantly from those in this license, then +do not refer to this license anywhere in your work but, instead, +distribute your work under a different license. You may use the text +of this license as a model for your own license, but your license +should not refer to the LPPL or otherwise give the impression that +your work is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains +the motivation behind the conditions of this license. It explains, +for example, why distributing LaTeX under the GNU General Public +License (GPL) was considered inappropriate. Even if your work is +unrelated to LaTeX, the discussion in `modguide.tex' may still be +relevant, and authors intending to distribute their works under any +license are encouraged to read it. + +A Recommendation on Modification Without Distribution +----------------------------------------------------- + +It is wise never to modify a component of the Work, even for your own +personal use, without also meeting the above conditions for +distributing the modified component. While you might intend that such +modifications will never be distributed, often this will happen by +accident -- you may forget that you have modified that component; or +it may not occur to you when allowing others to access the modified +version that you are thus distributing it and violating the conditions +of this license in ways that could have legal implications and, worse, +cause problems for the community. It is therefore usually in your +best interest to keep your copy of the Work identical with the public +one. Many works provide ways to control the behavior of that work +without altering any of its licensed components. + +How to Use This License +----------------------- + +To use this license, place in each of the components of your work both +an explicit copyright notice including your name and the year the work +was authored and/or last substantially modified. Include also a +statement that the distribution and/or modification of that +component is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2005 M. Y. Name + % + % This work may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.3 + % of this license or (at your option) any later version. + % The latest version of this license is in + % http://www.latex-project.org/lppl.txt + % and version 1.3 or later is part of all distributions of LaTeX + % version 2005/12/01 or later. + % + % This work has the LPPL maintenance status `maintained'. + % + % The Current Maintainer of this work is M. Y. Name. + % + % This work consists of the files pig.dtx and pig.ins + % and the derived file pig.sty. + +Given such a notice and statement in a file, the conditions +given in this license document would apply, with the `Work' referring +to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being +generated from `pig.dtx' using `pig.ins'), the `Base Interpreter' +referring to any `LaTeX-Format', and both `Copyright Holder' and +`Current Maintainer' referring to the person `M. Y. Name'. + +If you do not want the Maintenance section of LPPL to apply to your +Work, change `maintained' above into `author-maintained'. +However, we recommend that you use `maintained', as the Maintenance +section was added in order to ensure that your Work remains useful to +the community even when you can no longer maintain and support it +yourself. + +Derived Works That Are Not Replacements +--------------------------------------- + +Several clauses of the LPPL specify means to provide reliability and +stability for the user community. They therefore concern themselves +with the case that a Derived Work is intended to be used as a +(compatible or incompatible) replacement of the original Work. If +this is not the case (e.g., if a few lines of code are reused for a +completely different task), then clauses 6b and 6d shall not apply. + + +Important Recommendations +------------------------- + + Defining What Constitutes the Work + + The LPPL requires that distributions of the Work contain all the + files of the Work. It is therefore important that you provide a + way for the licensee to determine which files constitute the Work. + This could, for example, be achieved by explicitly listing all the + files of the Work near the copyright notice of each file or by + using a line such as: + + % This work consists of all files listed in manifest.txt. + + in that place. In the absence of an unequivocal list it might be + impossible for the licensee to determine what is considered by you + to comprise the Work and, in such a case, the licensee would be + entitled to make reasonable conjectures as to which files comprise + the Work. + + diff --git a/Master/texmf-dist/doc/latex/blochsphere/README.md b/Master/texmf-dist/doc/latex/blochsphere/README.md new file mode 100644 index 00000000000..7fea48e3529 --- /dev/null +++ b/Master/texmf-dist/doc/latex/blochsphere/README.md @@ -0,0 +1,6 @@ +latex-blochsphere +================= + +A LaTeX package which allows for simple drawing of 3D projections of Bloch spheres. + +Documentation and stable API coming shortly. diff --git a/Master/texmf-dist/doc/latex/blochsphere/blochsphere.pdf b/Master/texmf-dist/doc/latex/blochsphere/blochsphere.pdf Binary files differnew file mode 100644 index 00000000000..951b5ed42a3 --- /dev/null +++ b/Master/texmf-dist/doc/latex/blochsphere/blochsphere.pdf diff --git a/Master/texmf-dist/doc/latex/blochsphere/example.pdf b/Master/texmf-dist/doc/latex/blochsphere/example.pdf Binary files differnew file mode 100644 index 00000000000..a66d3424f15 --- /dev/null +++ b/Master/texmf-dist/doc/latex/blochsphere/example.pdf diff --git a/Master/texmf-dist/doc/latex/blochsphere/example.tex b/Master/texmf-dist/doc/latex/blochsphere/example.tex new file mode 100644 index 00000000000..42cae462698 --- /dev/null +++ b/Master/texmf-dist/doc/latex/blochsphere/example.tex @@ -0,0 +1,30 @@ +\documentclass{standalone} + +\usepackage{blochsphere} + +\begin{document} + +\begin{blochsphere}[radius=1.5 cm,tilt=15,rotation=-20] + \drawBallGrid[style={opacity=0.1}]{30}{30} + + \drawGreatCircle[style={dashed}]{-60}{0}{0} + \drawGreatCircle[style={dashed}]{60}{0}{0} + + \drawRotationLeft[scale=1.3,style={red}]{-60}{0}{0}{15} + \drawRotationRight[scale=1.3,style={red}]{60}{0}{0}{15} + + \node at (-0.8,1.9) {\textcolor{red}{\tiny $J_{12}(t)$}}; + \node at (1.1,1.8) {\textcolor{red}{\tiny $J_{23}(t)$}}; + + \labelLatLon{up}{90}{0}; + \labelLatLon{down}{-90}{90}; + \node[above] at (up) {{\tiny $\left|1\right>$ }}; + \node[below] at (down) {{\tiny $\left|0\right>$}}; + + \labelLatLon[labelmark=false]{d}{15}{90}; + \node at (d) {\color{gray}\fontsize{0.15cm}{1em}\selectfont $60^\circ$}; + + \labelLatLon[labelmark=false]{d2}{5}{78}; + \node at (d2) {\color{gray}\fontsize{0.15cm}{1em}\selectfont $60^\circ$}; +\end{blochsphere} +\end{document} diff --git a/Master/texmf-dist/source/latex/blochsphere/blochsphere.dtx b/Master/texmf-dist/source/latex/blochsphere/blochsphere.dtx new file mode 100644 index 00000000000..10cae76ad58 --- /dev/null +++ b/Master/texmf-dist/source/latex/blochsphere/blochsphere.dtx @@ -0,0 +1,853 @@ +% \iffalse meta-comment +% +% Copyright (C) 2015 by Matthew Wardrop <mister.wardrop@gmail.com> +% --------------------------------------------------------------------------- +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Matthew Wardrop +% +% This work consists of the files blochsphere.dtx and blochsphere.ins +% and the derived filebase blochsphere.sty. +% +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{blochsphere.dtx} +%</driver> +%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%<package>\ProvidesPackage{blochsphere} +%<*package> + [2015/08/17 v1.0 blochsphere drawing package] +%</package> +% +%<*driver> +\documentclass{ltxdoc} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\usepackage{blochsphere} +\usepackage{minted} +\usepackage{hyperref} + +\setlength{\parskip}{0.7em} + +\newenvironment{key}[2]{ + \noindent{\llap{Option: \bf\tt #2\hskip 9pt}} +}{} +\newcommand{\DescribeKey}[3][]{ + \noindent{\llap{\bf\tt #2\hskip 9pt}[default = #1] #3} +} + +\usepackage{listings} +\lstset{breaklines=true} + +\begin{document} + \DocInput{blochsphere.dtx} + \PrintChanges + \PrintIndex +\end{document} +%</driver> +% \fi +% +% \CheckSum{841} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v1.0}{2015/08/17}{Initial version} +% +% \DoNotIndex{\newcommand,\newenvironment} +% +% \providecommand*{\url}{\texttt} +% \GetFileInfo{blochsphere.dtx} +% \title{The \textsf{blochsphere} package} +% \author{Matthew Wardrop \\ \url{mister.wardrop@gmail.com}} +% \date{\fileversion~from \filedate} +% +% \maketitle +% +% \tableofcontents +% +% \section{Introduction} +% +% The |blochsphere| package is used to draw pseudo-3D Blochsphere diagrams, such as that +% shown in figure \ref{fig:blochsphere}. It supports various annotations, such as +% great and small circles, axes, rotation markings and state vectors. It can be used +% in a standalone fashion, or nested within a |tikzpicture| environment by setting +% the environment option |nested| to |true|. +% +% \section{Usage} +% +% Using |blochsphere| is as simple as creating a `blochsphere' environment. +% \begin{minted}{LaTeX} +% \begin{blochsphere}[<options>] +% ... +% \end{blochsphere} +% \end{minted} +% By default, this will create a blank Bloch sphere ready for annotation. The options can be +% any of those described in the next section. +% +% \noindent\DescribeMacro{\drawBall} \oarg{options}\\ +% This macro draws the basic Bloch sphere, according to the options defined in the next section. +% +% \noindent\DescribeMacro{\drawBallGrid} \oarg{options} \marg{latdegsep} \marg{longdegsep}\\ +% This macro draws latitude and longitude circles at an interval defined by |latdegsep| and |longdegsep| respectively. +% +% \noindent\DescribeMacro{\setDrawingPlane} \oarg{options} \marg{tiltangle} \marg{rotationangle}\\ +% This macro defines a transformation matrix within TikZ to create the effect of 2D projections of 3D planes, +% named according to the |plane| option. This is used internally in all of the drawing commands. +% +% \noindent\DescribeMacro{\setLatitudinalDrawingPlane} \oarg{options} \marg{latitude}\\ +% This is a special case of |\setDrawingPlane| that constructs the transform required to draw a 2D image in +% a latitudinal plane. +% +% \noindent\DescribeMacro{\setLongitudinalDrawingPlane} \oarg{options} \marg{longitude}\\ +% This is a special case of |\setDrawingPlane| that constructs the transform required to draw a 2D image in +% a longitudinal plane. +% +% \noindent\DescribeMacro{\drawCircle} \oarg{options} \marg{tiltangle} \marg{rotationangle}\\ +% Draws a circle on the surface of a Bloch sphere around the axis which is tilted by |tiltangle| +% from the z-axis and with a rotation of |rotationangle| about the z-axis. +% +% \noindent\DescribeMacro{\drawGreatCircle} \oarg{options} \marg{tiltangle} \marg{rotationangle}\\ +% An alias of |\drawCircle|. +% +% \noindent\DescribeMacro{\drawSmallCircle} \oarg{options} \marg{tiltangle} \marg{rotationangle} \marg{offsetLatitude}\\ +% Draws a circle on the surface of a Bloch sphere around the axis which is tilted by |tiltangle| +% from the z-axis and with a rotation of |rotationangle| about the z-axis, with an offset along the axis +% such that it reaches an effective latitude of |offsetLatitude|. +% +% \noindent\DescribeMacro{\drawLatitudeCircle} \oarg{options} \marg{latitude}\\ +% Draws a circle on the Bloch sphere corresponding to the given latitude. +% +% \noindent\DescribeMacro{\drawLongitudeCircle} \oarg{options} \marg{longitude}\\ +% Draws a great circle on the Bloch sphere corresponding to the given longitude. +% +% \noindent\DescribeMacro{\drawRotationLeft} \oarg{options} \marg{tiltangle} \marg{rotationangle} \marg{axisoffset} \marg{clearangle}\\ +% Draw a left-handed rotation about the Bloch sphere, titled and rotated as for a circle +% with the same parameters, with a gap in the line where the arrow should go of +% |clearangle| degrees. +% +% \noindent\DescribeMacro{\drawRotationRight} \oarg{options} \marg{tiltangle} \marg{rotationangle} \marg{axisoffset} \marg{clearangle}\\ +% As above, but a right-handed rotation annotation. +% +% \noindent\DescribeMacro{\drawAxis} \oarg{options} \marg{tiltangle} \marg{rotationangle}\\ +% Draw a line along the axis tilted |tiltangle| degrees from the z-axis, rotated about +% the z-axis by |rotationangle| degrees. +% +% \noindent\DescribeMacro{\labelPolar} \oarg{options} \marg{tikzlabel} \marg{tiltangle} \marg{rotationangle}\\ +% Assign a tikz label to the point identified by an angle |tiltangle| from the z-axis +% and a rotation |rotationangle| about the z-axis. +% +% \noindent\DescribeMacro{\labelLatLon} \oarg{options} \marg{tikzlabel} \marg{latitude} \marg{longitude}\\ +% Assign a tikz label to the point identified the specified latitude and longitude. +% +% \noindent\DescribeMacro{\drawStatePolar} \oarg{options} \marg{tikzlabel} \marg{tiltangle} \marg{rotationangle}\\ +% Draw a vector from the origin to the point identified by an angle |tiltangle| +% from the z-axis and a rotation |rotationangle| about the z-axis, which will +% be labelled |tikzlabel|. +% +% \noindent\DescribeMacro{\drawStateLatLon} \oarg{options} \marg{tikzlabel} \marg{latitude} \marg{longitude}\\ +% Draw a vector from the origin to the point identified by the provided +% latitude and longitude, which will be labelled |tikzlabel|. +% +% +% \section{Package, Environment and Macro options} +% For convenience, all options at all levels share the same namespace. Therefore, all +% options passed to the package will be the defaults for all environment, which will +% in turn be the defaults for all subsequent macro calls. +% +% +% \DescribeKey[1.5cm]{radius} +% {This option controls the radius of the qubit, and can be specified in any valid \LaTeX units.} +% +% +% \DescribeKey[15]{tilt}{This option controls the tilt (into the page) of the top of the bloch sphere (in degrees).} +% +% +% \DescribeKey[-20]{rotation}{This option controls the (right-handed) rotation of the Blochsphere around the (potentially tilted) z-axis, also specified in degrees.} +% +% +% \DescribeKey[white]{color}{This specifies the colour of the drawn ball.} +% +% +% \DescribeKey[0.7]{opacity}{This option controls the opacity of the ball, allowing lines drawn behind the ball to be visible.} +% +% +% \DescribeKey[]{style}{This option controls the current drawing style, and supports any valid tikz styling.} +% +% +% \DescribeKey[1]{scale}{This option allows one to temporarily change the scale of drawn circles/etc, allowing annotations to ``hover'' over the Bloch sphere.} +% +% +% \DescribeKey[current plane]{plane}{The name which should label the current plane being defined, or the plane to be used.} +% +% +% \DescribeKey[(0,0,0)]{shift}{The three dimensional offset by which the currently being drawn objects should be shifted.} +% +% +% \DescribeKey[3d]{ball}{Specifies how the ball should be drawn. Options are: {\tt 3d}, {\tt circle}, {\tt none}} +% +% +% \DescribeKey[black]{statecolor}{The color with which the state vectors should be drawn.} +% +% +% \DescribeKey[0.4pt]{statewidth}{The width with which state vectors should be drawn.} +% +% +% \DescribeKey[]{axisarrow}{The arrow to use at the end of a drawn axis.} +% +% +% \DescribeKey[false]{labelmark}{Whether a black dot should be drawn at the point being labelled.} +% +% +% \DescribeKey[false]{nested}{Whether the {\tt blochsphere} environment is being nested in a |tikzpicture| environment. If it is nested, then this should be set to true.} +% +% +% \section{Example} +% In this section we provide example code to generate the following diagram: +% +% \begin{figure}[h!] +% \begin{center} +% \includegraphics{example.pdf} +% \end{center} +% \caption{Example Bloch Sphere \label{fig:blochsphere}} +% \end{figure} +% +% \newminted{latex}{gobble=2,linenos} +% \begin{latexcode} +% \begin{blochsphere}[radius=1.5 cm,tilt=15,rotation=-20] +% \drawBallGrid[style={opacity=0.3}]{30}{30} +% +% \drawGreatCircle[style={dashed}]{-60}{0}{0} +% \drawGreatCircle[style={dashed}]{60}{0}{0} +% +% \drawRotationLeft[scale=1.3,style={red}]{-60}{0}{0}{15} +% \drawRotationRight[scale=1.3,style={red}]{60}{0}{0}{15} +% +% \node at (-0.8,1.9) {\textcolor{red}{\tiny $J_{12}(t)$}}; +% \node at (1.1,1.8) {\textcolor{red}{\tiny $J_{23}(t)$}}; +% +% \labelLatLon{up}{90}{0}; +% \labelLatLon{down}{-90}{90}; +% \node[above] at (up) {{\tiny $\left|1\right>$ }}; +% \node[below] at (down) {{\tiny $\left|0\right>$}}; +% +% \labelLatLon[labelmark=false]{d}{15}{90}; +% \node at (d) {\color{gray}\fontsize{0.15cm}{1em}\selectfont $60^\circ$}; +% +% \labelLatLon[labelmark=falsa]{d2}{5}{78}; +% \node at (d2) {\color{gray}\fontsize{0.15cm}{1em}\selectfont $60^\circ$}; +% \end{blochsphere} +% \end{latexcode} +% +% \StopEventually{} +% +% \section{Implementation} +% +% \iffalse +%<*package> +% \fi +% \subsection{Preamble} +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1994/06/01] +\ProvidesPackage{blochsphere}[2015/08/17] +% \end{macrocode} +% \iffalse +%% \usepackage{trace} +%%\tracingall +% \fi +% +% \begin{macrocode} +\usepackage{tikz,etoolbox,environ,ifthen,kvsetkeys,kvoptions} +\usetikzlibrary{decorations.pathreplacing, decorations.markings, calc, fadings} +% \end{macrocode} +% +% \subsection{Package/Environment/Macro options} +% +% \begin{key}{blochsphere}{radius} +% \begin{macrocode} +\define@key{blochsphere}{radius}{% + \def\blochsphere@radius{#1}% +} +\providecommand{\blochsphere@radius}{1cm} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{tilt} +% \begin{macrocode} +\define@key{blochsphere}{tilt}{% + \def\blochsphere@tilt{#1}% +} +\providecommand{\blochsphere@tilt}{15} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{rotation} +% \begin{macrocode} +\define@key{blochsphere}{rotation}{% + \def\blochsphere@rotation{#1}% +} +\providecommand{\blochsphere@rotation}{-20} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{color} +% \begin{macrocode} +\define@key{blochsphere}{color}{% + \def\blochsphere@color{#1}% +} +\providecommand{\blochsphere@color}{white} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{opacity} +% \begin{macrocode} +\define@key{blochsphere}{opacity}{% + \def\blochsphere@opacity{#1}% +} +\providecommand{\blochsphere@opacity}{0.7} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{style} +% \begin{macrocode} +\define@key{blochsphere}{style}{% + \def\blochsphere@style{#1}% +} +\providecommand{\blochsphere@style}{} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{scale} +% \begin{macrocode} +\define@key{blochsphere}{scale}{% + \def\blochsphere@scale{#1}% +} +\providecommand{\blochsphere@scale}{1} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{plane} +% \begin{macrocode} +\define@key{blochsphere}{plane}{% + \def\blochsphere@plane{#1}% +} +\providecommand{\blochsphere@plane}{current plane} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{shift} +% \begin{macrocode} +\define@key{blochsphere}{shift}{% + \def\blochsphere@shift{{#1}}% +} +\providecommand{\blochsphere@shift}{{0,0,0}} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{ball} +% \begin{macrocode} +\define@key{blochsphere}{ball}{% + \def\blochsphere@ball{#1}% +} +\providecommand{\blochsphere@ball}{3d} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{statecolor} +% \begin{macrocode} +\define@key{blochsphere}{statecolor}{% + \def\blochsphere@statecolor{#1}% +} +\providecommand{\blochsphere@statecolor}{black} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{statewidth} +% \begin{macrocode} +\define@key{blochsphere}{statewidth}{% + \def\blochsphere@statewidth{#1}% +} +\providecommand{\blochsphere@statewidth}{0.4pt} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{axisarrow} +% \begin{macrocode} +\define@key{blochsphere}{axisarrow}{% + \def\blochsphere@axisarrow{#1}% +} +\providecommand{\blochsphere@axisarrow}{} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{labelmark} +% \begin{macrocode} +\define@key{blochsphere}{labelmark}{% + \setboolean{blochsphere@labelmark}{#1}% +} +\newboolean{blochsphere@labelmark} +\setboolean{blochsphere@labelmark}{false} +% \end{macrocode} +% \end{key} +% +% +% \begin{key}{blochsphere}{nested} +% \begin{macrocode} +\define@key{blochsphere}{nested}{% + \setboolean{blochsphere@nested}{#1}% +} +\newboolean{blochsphere@nested} +\setboolean{blochsphere@nested}{false} +% \end{macrocode} +% \end{key} +% \begin{macrocode} +\ProcessKeyvalOptions{blochsphere}\relax +% \end{macrocode} +% +% \subsection{{\bfseries\tt blochsphere} Environment} +% This is the central environment definition. Note that all macros defined +% below will only be defined within this environment. +% +% \begin{environment}{blochsphere} +% \begin{macrocode} +\newenvironment{blochsphere}[1][]{ + \begingroup + \makeatletter + \ignorespaces\setkeys{blochsphere}{#1}\unskip% + \pgfdeclarelayer{back}% + \pgfdeclarelayer{front}% + \pgfsetlayers{back,main,front}% + \pgfkeys{% + /tikz/on layer/.code={% + \pgfonlayer{##1}\begingroup% + \aftergroup\endpgfonlayer% + \aftergroup\endgroup% + },% + /tikz/node on layer/.code={% + \gdef\node@@on@layer{% + \setbox\tikz@tempbox=\hbox\bgroup\pgfonlayer{##1}\unhbox\tikz@tempbox\endpgfonlayer\egroup}% + \aftergroup\node@on@layer% + },% + /tikz/end node on layer/.code={% + \endpgfonlayer\endgroup\endgroup% + }% + }% + \def\node@on@layer{\aftergroup\node@@on@layer}% +% \end{macrocode} +% \begin{macro}{\drawBall} +% \begin{macrocode} + \newcommand\drawBall[1][]{ + \begingroup + \setkeys{blochsphere}{##1} + \expandafter\ifstrequal\expandafter{\blochsphere@ball}{3d}{ + \fill[on layer=main,ball color=\blochsphere@color,opacity=\blochsphere@opacity] (0,0) circle (\blochsphere@radius); % 3D lighting effect + }{} + \expandafter\ifstrequal\expandafter{\blochsphere@ball}{circle}{ + \draw[on layer=main,color=\blochsphere@color] (0,0) circle (\blochsphere@radius); % 3D lighting effect + }{} + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawBallGrid} +% \begin{macrocode} + \newcommand\drawBallGrid[3][]{ + \begingroup + \setkeys{blochsphere}{##1} + \foreach \phi in {0,##2,...,89} { + \drawLatitudeCircle{\phi} + \drawLatitudeCircle{-\phi} + } + \foreach \theta in {0,##3,...,179} { + \drawLongitudeCircle{\theta} + } + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\setDrawingPlane} +% \begin{macrocode} + \newcommand\setDrawingPlane[3][]{% + \setkeys{blochsphere}{##1} + \pgfmathsetmacro\aphi{##2} + \pgfmathsetmacro\atheta{##3} + \pgfmathsetmacro\dot{cos(\aphi)} + \ifdim\dot pt<0.7 pt\relax% + \pgfmathsetmacro\norm{cos(asin(\dot))} + \pgfmathsetmacro\xx{-sin(\aphi)*sin(\blochsphere@rotation - \atheta)} + \pgfmathsetmacro\xy{sin(\aphi)*sin(\blochsphere@tilt)*cos(\blochsphere@rotation - \atheta)} + \pgfmathsetmacro\yx{-sin(2*\aphi - \blochsphere@rotation + \atheta)/4 - sin(2*\aphi + \blochsphere@rotation - \atheta)/4} + \pgfmathsetmacro\yy{(sin(\aphi)*cos(\blochsphere@tilt) - sin(\blochsphere@tilt)*sin(\blochsphere@rotation - \atheta)*cos(\aphi))*sin(\aphi)} + \else + \pgfmathsetmacro\norm{sqrt(abs(sin(\blochsphere@rotation - \atheta)*cos(\aphi))^2 + abs(sin(\blochsphere@tilt)*cos(\aphi)*cos(\blochsphere@rotation - \atheta))^2 + abs(cos(\aphi)*cos(\blochsphere@tilt)*cos(\blochsphere@rotation - \atheta))^2)} + \pgfmathsetmacro\xx{-sin(\blochsphere@rotation - \atheta)*cos(\aphi)} + \pgfmathsetmacro\xy{sin(\blochsphere@tilt)*cos(\aphi)*cos(\blochsphere@rotation - \atheta)} + \pgfmathsetmacro\yx{-cos(\aphi)^2*cos(\blochsphere@rotation - \atheta)} + \pgfmathsetmacro\yy{(sin(\aphi)*cos(\blochsphere@tilt) - sin(\blochsphere@tilt)*sin(\blochsphere@rotation - \atheta)*cos(\aphi))*cos(\aphi)} + \fi + \computeOffset{shift} + \begingroup\newcommand\tmp[1]{\endgroup\noexpand\relax% + \tikzset{\blochsphere@plane/.style={cm={\xx/\norm, \xy/\norm, \yx/\norm, \yy/\norm, \unexpanded\expandafter{####1} }}}% + } \tmp{\shift} + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\setLatitudinalDrawingPlane} +% \begin{macrocode} + \newcommand\setLatitudinalDrawingPlane[2][]{% + \pgfmathsetmacro\yshift{sin(##2)*\the\blochsphere@radius} + \setDrawingPlane[##1,shift={{0,0,\yshift}}]{0}{0} + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\setLatitudinalDrawingPlane} +% \begin{macrocode} + \newcommand\setLongitudinalDrawingPlane[2][]{% + \setDrawingPlane[##1]{90}{##2} + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawCircle} +% \begin{macrocode} + \newcommand\drawCircle[3][]{ + \begingroup + \setkeys{blochsphere}{##1} + \setDrawingPlane{##2}{##3} + \computeVisibility{##2}{##3}{agamma}{abeta} + \begingroup\edef\tmp{\endgroup% + \noexpand\draw[current plane,on layer=back,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma-\abeta-0.2:\blochsphere@radius+\the\pgflinewidth*0.5) arc (\agamma-\abeta-0.2:\agamma+\abeta+0.2:\blochsphere@radius+\the\pgflinewidth*0.5)}; + \noexpand\draw[current plane,on layer=front,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma+\abeta:\blochsphere@radius+\the\pgflinewidth*0.5) arc (\agamma+\abeta:\agamma-\abeta+360:\blochsphere@radius+\the\pgflinewidth*0.5)}; + } \tmp + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawGreatCircle} +% \begin{macrocode} + \newcommand\drawGreatCircle[3][]{ + \drawCircle[##1]{##2}{##3} + } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawSmallCircle} +% \begin{macrocode} + \newcommand\drawSmallCircle[4][]{ + \begingroup + \pgfmathsetmacro\xshift{sin(##2)*cos(##3)*\blochsphere@radius*sin(##4)} + \pgfmathsetmacro\yshift{sin(##2)*sin(##3)*\blochsphere@radius*sin(##4)} + \pgfmathsetmacro\zshift{cos(##2)*\blochsphere@radius*sin(##4)} + \pgfmathsetmacro\radius{\blochsphere@radius*cos(##4)} + \drawCircle[##1,shift={{\xshift,\yshift,\zshift}},radius=\radius]{##2}{##3} + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawLatitudeCircle} +% \begin{macrocode} + \newcommand\drawLatitudeCircle[2][]{ + \begingroup + \pgfmathsetmacro\yshift{sin(##2)*\blochsphere@radius} + \pgfmathsetmacro\radius{\blochsphere@radius*cos(##2)} + \drawCircle[##1,shift={{0,0,\yshift}},radius=\radius]{0}{0} + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawLongitudeCircle} +% \begin{macrocode} + \newcommand\drawLongitudeCircle[2][]{ + \begingroup + \drawCircle[##1]{90}{##2+90} + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawRotationLeft} +% \begin{macrocode} + \newcommand\drawRotationLeft[5][]{ + \begingroup + \setkeys{blochsphere}{##1} + \pgfmathsetmacro\xshift{sin(##2)*cos(##3)*##4} + \pgfmathsetmacro\yshift{sin(##2)*sin(##3)*##4} + \pgfmathsetmacro\zshift{cos(##2)*##4} + \setDrawingPlane[shift={\xshift,\yshift,\zshift}]{##2}{##3} + \computeVisibility{##2}{##3}{agamma}{abeta} + \begingroup\edef\tmp{\endgroup% + \noexpand\draw[current plane,on layer=back,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma-\abeta-0.2:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5) arc (\agamma-\abeta-0.2:\agamma+\abeta+0.2:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5)}; + \noexpand\draw[<-,current plane,on layer=front,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma+\abeta+##5:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5) arc (\agamma+\abeta+##5:\agamma-\abeta+360:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5)}; + } \tmp + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawRotationRight} +% \begin{macrocode} + \newcommand\drawRotationRight[5][]{ + \begingroup + \setkeys{blochsphere}{##1} + \pgfmathsetmacro\xshift{sin(##2)*cos(##3)*##4} + \pgfmathsetmacro\yshift{sin(##2)*sin(##3)*##4} + \pgfmathsetmacro\zshift{cos(##2)*##4} + \setDrawingPlane[shift={\xshift,\yshift,\zshift}]{##2}{##3} + \computeVisibility{##2}{##3}{agamma}{abeta} + \begingroup\edef\tmp{\endgroup% + \noexpand\draw[current plane,on layer=back,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma-\abeta-0.2:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5) arc (\agamma-\abeta-0.2:\agamma+\abeta+0.2:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5)}; + \noexpand\draw[->,current plane,on layer=front,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma+\abeta:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5) arc (\agamma+\abeta:\agamma-\abeta+360-##5:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5)}; + } \tmp + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawAxis} +% \begin{macrocode} + \newcommand\drawAxis[3][] { + \begingroup + \setkeys{blochsphere}{##1} + \pgfmathsetmacro\behind{ifthenelse(-sin(##2)*sin(\blochsphere@rotation - ##3)*cos(\blochsphere@tilt) + sin(\blochsphere@tilt)*cos(##2)<0, 1, 0)} + \pgfmathsetmacro\newphi{180-##2} + \pgfmathsetmacro\newtheta{##3+180} + \ifnum\behind=0\relax + \labelPolar[scale=1,mark=0]{blochspheretmpp}{##2}{##3} + \labelPolar[mark=0]{blochspheretmps}{##2}{##3} + \labelPolar[mark=0]{blochspheretmpe}{\newphi}{\newtheta} + \else + \labelPolar[scale=1,mark=0]{blochspheretmpp}{\newphi}{\newtheta} + \labelPolar[mark=0]{blochspheretmpe}{##2}{##3} + \labelPolar[mark=0]{blochspheretmps}{\newphi}{\newtheta} + \fi + \begingroup\edef\tmp{\endgroup% + \ifnum\behind=0\relax + \noexpand\draw[on layer=front,\unexpanded\expandafter{\blochsphere@style},\blochsphere@axisarrow] (blochspheretmpp) -- (blochspheretmps); + \noexpand\draw[on layer=back,\unexpanded\expandafter{\blochsphere@style}] (blochspheretmpe) -- (blochspheretmpp); + \else + \noexpand\draw[on layer=front,\unexpanded\expandafter{\blochsphere@style},\blochsphere@axisarrow] (blochspheretmpp) -- (blochspheretmpe); + \noexpand\draw[on layer=back,\unexpanded\expandafter{\blochsphere@style}] (blochspheretmps) -- (blochspheretmpp); + \fi + } \tmp + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\labelPolar} +% \begin{macrocode} + \newcommand\labelPolar[4][]{% + \begingroup + \setkeys{blochsphere}{##1} + \setLongitudinalDrawingPlane{##4+90} + \pgfmathsetmacro\behind{ifthenelse(-sin(##3)*sin(\blochsphere@rotation - ##4)*cos(\blochsphere@tilt) + sin(\blochsphere@tilt)*cos(##3)<0, 1, 0)} + \ifthenelse{\boolean{blochsphere@labelmark}} + { + \ifnum\behind=1\relax + \path[current plane,on layer=back] (90-##3:\blochsphere@radius*\blochsphere@scale) coordinate[mark coordinate] (##2); % + \else + \path[current plane,on layer=front] (90-##3:\blochsphere@radius*\blochsphere@scale) coordinate[mark coordinate] (##2); % + \fi + } + { + \ifnum\behind=1\relax + \path[current plane,on layer=back] (90-##3:\blochsphere@radius*\blochsphere@scale) coordinate (##2); % + \else + \path[current plane,on layer=front] (90-##3:\blochsphere@radius*\blochsphere@scale) coordinate (##2); % + \fi + } + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\labelLatLon} +% \begin{macrocode} + \newcommand\labelLatLon[4][]{% + \begingroup + \pgfmathsetmacro\newphi{90-##3} + \labelPolar[##1]{##2}{\newphi}{##4} + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawStateLatLon} +% \begin{macrocode} + \newcommand\drawStateLatLon[4][]{ + \begingroup + \pgfmathsetmacro\newphi{90-##3} + \drawStatePolar[##1]{##2}{\newphi}{##4} + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawStatePolar} +% \begin{macrocode} + \newcommand\drawStatePolar[4][]{ + \begingroup + \setkeys{blochsphere}{##1} + \labelPolar{##2}{##3}{##4} + \pgfmathsetmacro\behind{ifthenelse(-sin(##3)*sin(\blochsphere@rotation - ##4)*cos(\blochsphere@tilt) + sin(\blochsphere@tilt)*cos(##3)<0, 1, 0)} + \ifnum\behind=1\relax + \tikzset{test/.style={ + postaction={ + decorate, + decoration={ + markings, + mark=at position \pgfdecoratedpathlength-0.5pt with {\arrow[\blochsphere@statecolor,line width=\blochsphere@statewidth,opacity=0.2] {>}; }, + mark=between positions 0 and \pgfdecoratedpathlength-5pt step 0.5pt with { + \pgfmathsetmacro\myval{multiply(divide( + \pgfkeysvalueof{/pgf/decoration/mark info/distance from start}, \pgfdecoratedpathlength),100)}; + \pgfsetfillcolor{\blochsphere@statecolor}; + \pgfsetfillopacity{0.4-\myval/100*0.2} + \pgfpathcircle{\pgfpointorigin}{\blochsphere@statewidth}; + \pgfusepath{fill};} + }}}} + \else + \tikzset{test/.style={ + postaction={ + decorate, + decoration={ + markings, + mark=at position \pgfdecoratedpathlength-0.5pt with {\arrow[\blochsphere@statecolor,line width=\blochsphere@statewidth] {>}; }, + mark=between positions 0 and \pgfdecoratedpathlength-5pt step 0.5pt with { + \pgfmathsetmacro\myval{multiply(divide( + \pgfkeysvalueof{/pgf/decoration/mark info/distance from start}, \pgfdecoratedpathlength),100)}; + \pgfsetfillcolor{\blochsphere@statecolor}; + \pgfsetfillopacity{0.4+\myval/100*0.6} + \pgfpathcircle{\pgfpointorigin}{\blochsphere@statewidth}; + \pgfusepath{fill};} + }}}} + \fi + \path [test,on layer=main] (0,0) -- (##2); + \endgroup + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\computeOffset} +% \begin{macrocode} + \newcommand\computeOffset[2][]{% + \setkeys{blochsphere}{##1}% + \pgfmathsetmacro{\x}{\blochsphere@shift[0]*cos(\blochsphere@rotation) + \blochsphere@shift[1]*sin(\blochsphere@rotation)}% + \pgfmathsetmacro\y{\blochsphere@shift[0]*sin(\blochsphere@rotation)*sin(\blochsphere@tilt) - \blochsphere@shift[1]*sin(\blochsphere@tilt)*cos(\blochsphere@rotation) + \blochsphere@shift[2]*cos(\blochsphere@tilt)} + \expandafter\def\csname ##2\endcsname{(\x pt,\y pt)}% + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\computeVisibility} +% \begin{macrocode} + \newcommand\computeVisibility[5][]{ + \setkeys{blochsphere}{##1} + \pgfmathsetmacro\aphi{##2} + \pgfmathsetmacro\atheta{##3} + \pgfmathsetmacro\d{sqrt(\blochsphere@shift[0]^2+\blochsphere@shift[1]^2+\blochsphere@shift[2]^2)}%% distance from origin of shift + \pgfmathsetmacro\tatheta{\atheta+\blochsphere@rotation} + \pgfmathsetmacro\dot{cos(\aphi)} + \ifdim\dot pt<0.7 pt\relax% + \pgfmathsetmacro\domaintest{ifthenelse(and(\blochsphere@rotation - \atheta==0,or(\aphi==0,sin(\blochsphere@tilt==0))),0,1)} + \ifdim\domaintest pt=0 pt\relax + \pgfmathsetmacro\agamma{0} + \else + \pgfmathsetmacro\agamma{-90+atan(cos(\blochsphere@tilt)*cos(\blochsphere@rotation - \atheta)/(sin(\aphi)*sin(\blochsphere@tilt) + sin(\blochsphere@rotation - \atheta)*cos(\aphi)*cos(\blochsphere@tilt)))} + \fi + \else + \pgfmathsetmacro\domaintest{ifthenelse(and(Mod(\blochsphere@rotation-\atheta,180)==90,Mod(\blochsphere@tilt,180)==90),0,1)} + \pgfmathsetmacro\domaintesttwo{ifthenelse(Mod(\blochsphere@rotation-\atheta,180)==90,0,1)} + \pgfmathsetmacro\domaintestthree{ifthenelse(Mod(\blochsphere@tilt,180)==90,0,1)} + \ifdim\domaintest pt=0 pt\relax + \pgfmathsetmacro\agamma{360-90*\blochsphere@tilt/abs(\blochsphere@tilt)} + \else + \ifdim\domaintesttwo pt=0 pt\relax + \pgfmathsetmacro\agamma{360-90*(sin(\aphi)*tan(\blochsphere@tilt)+cos(\aphi)*sin(\blochsphere@rotation-\atheta))/abs(sin(\aphi)*tan(\blochsphere@tilt)+cos(\aphi)*sin(\blochsphere@rotation-\atheta))} + \else + \ifdim\domaintestthree pt=0 pt\relax + \pgfmathsetmacro\agamma{360-90*\blochsphere@tilt/abs(\blochsphere@tilt)*cos(\blochsphere@rotation-\atheta)/abs(cos(\blochsphere@rotation-\atheta))} + \else + \pgfmathsetmacro\agamma{360-atan( (sin(\aphi)*tan(\blochsphere@tilt)+cos(\aphi)*sin(\blochsphere@rotation-\atheta))/cos(\blochsphere@rotation-\atheta) )} + \fi + \fi + \fi + \fi + \pgfmathsetmacro\aalpha{acos(-sin(\aphi)*sin(\blochsphere@rotation)*cos(\atheta)*cos(\blochsphere@tilt) + sin(\aphi)*sin(\atheta)*cos(\blochsphere@rotation)*cos(\blochsphere@tilt) + sin(\blochsphere@tilt)*cos(\aphi))} + \pgfmathsetmacro\aalphatest{atan(\d/\blochsphere@radius)} + \ifdim\aalpha pt<\aalphatest pt\relax + \pgfmathsetmacro\abeta{0} + \else + \pgfmathsetmacro\abeta{acos(\d*cot(\aalpha)/\blochsphere@radius)} + \fi + \pgfmathsetmacro\abeta{ifthenelse(\blochsphere@shift[2]<0,\abeta+2*(90-\abeta),\abeta)} + \expandafter\pgfmathsetmacro\csname ##4\endcsname{\agamma} + \expandafter\pgfmathsetmacro\csname ##5\endcsname{\abeta} + }% +% \end{macrocode} +% \end{macro} +% \begin{macrocode} + \tikzset{% + >=latex, % option for nice arrows + inner sep=0pt,% + outer sep=2pt,% + mark coordinate/.style={inner sep=0pt,outer sep=0pt,minimum size=3pt, + fill=black,circle}% + }% + \pgfdeclareradialshading[tikz@ball]{ball}{\pgfqpoint{-10bp}{10bp}}{% + color(0bp)=(tikz@ball!30!white); + color(9bp)=(tikz@ball!75!white); + color(18bp)=(tikz@ball!90!black); + color(25bp)=(tikz@ball!70!black); + color(50bp)=(black) + }% + \ifthenelse{\boolean{blochsphere@nested}}{}{% + \begin{tikzpicture} + \drawBall + }% +} +% \end{macrocode} +% \end{environment} +% \begin{macrocode} +{ + \ifthenelse{\boolean{blochsphere@nested}}{}{ + \end{tikzpicture}% + }% + \endgroup% +} +\endinput +% \end{macrocode} + +% +% \iffalse +%</package> +% \fi +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex/blochsphere/blochsphere.ins b/Master/texmf-dist/source/latex/blochsphere/blochsphere.ins new file mode 100644 index 00000000000..0fa2764a365 --- /dev/null +++ b/Master/texmf-dist/source/latex/blochsphere/blochsphere.ins @@ -0,0 +1,57 @@ +%% blochsphere.dtx +%% Copyright 2015 Matthew Wardrop <mister.wardrop@gmail.com> +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Matthew Wardrop. +% +% This work consists of the files blochsphere.dtx and blochsphere.ins, +% the derived file pig.sty and any accompanying documentation and examples. + +\input docstrip.tex +\keepsilent + +\usedir{tex/latex/blochsphere} + +\preamble + +This generated file is part of the blochsphere package. + +Copyright (C) 2015 by Matthew Wardrop <mister.wardrop@gmail.com> + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +\endpreamble + +\generate{\file{blochsphere.sty}{\from{blochsphere.dtx}{package}}} + +\obeyspaces +\Msg{*************************************************************} +\Msg{* *} +\Msg{* To finish the installation you have to move the following *} +\Msg{* file into a directory searched by TeX: *} +\Msg{* *} +\Msg{* blochsphere.sty *} +\Msg{* *} +\Msg{* To produce the documentation run the file blochsphere.dtx *} +\Msg{* through LaTeX. *} +\Msg{* *} +\Msg{* Happy TeXing! *} +\Msg{* *} +\Msg{*************************************************************} + +\endbatchfile diff --git a/Master/texmf-dist/tex/latex/blochsphere/blochsphere.sty b/Master/texmf-dist/tex/latex/blochsphere/blochsphere.sty new file mode 100644 index 00000000000..720b05b5bc2 --- /dev/null +++ b/Master/texmf-dist/tex/latex/blochsphere/blochsphere.sty @@ -0,0 +1,407 @@ +%% +%% This is file `blochsphere.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% blochsphere.dtx (with options: `package') +%% +%% This generated file is part of the blochsphere package. +%% +%% Copyright (C) 2015 by Matthew Wardrop <mister.wardrop@gmail.com> +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{blochsphere} + [2015/08/17 v1.0 blochsphere drawing package] +\NeedsTeXFormat{LaTeX2e}[1994/06/01] +\ProvidesPackage{blochsphere}[2015/08/17] +%% \usepackage{trace} +%%\tracingall +\usepackage{tikz,etoolbox,environ,ifthen,kvsetkeys,kvoptions} +\usetikzlibrary{decorations.pathreplacing, decorations.markings, calc, fadings} +\define@key{blochsphere}{radius}{% +\def\blochsphere@radius{#1}% +} +\providecommand{\blochsphere@radius}{1cm} +\define@key{blochsphere}{tilt}{% +\def\blochsphere@tilt{#1}% +} +\providecommand{\blochsphere@tilt}{15} +\define@key{blochsphere}{rotation}{% +\def\blochsphere@rotation{#1}% +} +\providecommand{\blochsphere@rotation}{-20} +\define@key{blochsphere}{color}{% +\def\blochsphere@color{#1}% +} +\providecommand{\blochsphere@color}{white} +\define@key{blochsphere}{opacity}{% +\def\blochsphere@opacity{#1}% +} +\providecommand{\blochsphere@opacity}{0.7} +\define@key{blochsphere}{style}{% +\def\blochsphere@style{#1}% +} +\providecommand{\blochsphere@style}{} +\define@key{blochsphere}{scale}{% +\def\blochsphere@scale{#1}% +} +\providecommand{\blochsphere@scale}{1} +\define@key{blochsphere}{plane}{% +\def\blochsphere@plane{#1}% +} +\providecommand{\blochsphere@plane}{current plane} +\define@key{blochsphere}{shift}{% +\def\blochsphere@shift{{#1}}% +} +\providecommand{\blochsphere@shift}{{0,0,0}} +\define@key{blochsphere}{ball}{% +\def\blochsphere@ball{#1}% +} +\providecommand{\blochsphere@ball}{3d} +\define@key{blochsphere}{statecolor}{% +\def\blochsphere@statecolor{#1}% +} +\providecommand{\blochsphere@statecolor}{black} +\define@key{blochsphere}{statewidth}{% +\def\blochsphere@statewidth{#1}% +} +\providecommand{\blochsphere@statewidth}{0.4pt} +\define@key{blochsphere}{axisarrow}{% +\def\blochsphere@axisarrow{#1}% +} +\providecommand{\blochsphere@axisarrow}{} +\define@key{blochsphere}{labelmark}{% + \setboolean{blochsphere@labelmark}{#1}% +} +\newboolean{blochsphere@labelmark} +\setboolean{blochsphere@labelmark}{false} +\define@key{blochsphere}{nested}{% +\setboolean{blochsphere@nested}{#1}% +} +\newboolean{blochsphere@nested} +\setboolean{blochsphere@nested}{false} +\ProcessKeyvalOptions{blochsphere}\relax +\newenvironment{blochsphere}[1][]{ +\begingroup +\makeatletter +\ignorespaces\setkeys{blochsphere}{#1}\unskip% +\pgfdeclarelayer{back}% +\pgfdeclarelayer{front}% +\pgfsetlayers{back,main,front}% +\pgfkeys{% +/tikz/on layer/.code={% +\pgfonlayer{##1}\begingroup% +\aftergroup\endpgfonlayer% +\aftergroup\endgroup% +},% +/tikz/node on layer/.code={% +\gdef\node@@on@layer{% +\setbox\tikz@tempbox=\hbox\bgroup\pgfonlayer{##1}\unhbox\tikz@tempbox\endpgfonlayer\egroup}% +\aftergroup\node@on@layer% +},% +/tikz/end node on layer/.code={% +\endpgfonlayer\endgroup\endgroup% +}% +}% +\def\node@on@layer{\aftergroup\node@@on@layer}% +\newcommand\drawBall[1][]{ +\begingroup +\setkeys{blochsphere}{##1} +\expandafter\ifstrequal\expandafter{\blochsphere@ball}{3d}{ +\fill[on layer=main,ball color=\blochsphere@color,opacity=\blochsphere@opacity] (0,0) circle (\blochsphere@radius); % 3D lighting effect +}{} +\expandafter\ifstrequal\expandafter{\blochsphere@ball}{circle}{ +\draw[on layer=main,color=\blochsphere@color] (0,0) circle (\blochsphere@radius); % 3D lighting effect +}{} +\endgroup +}% +\newcommand\drawBallGrid[3][]{ +\begingroup +\setkeys{blochsphere}{##1} +\foreach \phi in {0,##2,...,89} { +\drawLatitudeCircle{\phi} +\drawLatitudeCircle{-\phi} +} +\foreach \theta in {0,##3,...,179} { +\drawLongitudeCircle{\theta} +} +\endgroup +}% +\newcommand\setDrawingPlane[3][]{% +\setkeys{blochsphere}{##1} +\pgfmathsetmacro\aphi{##2} +\pgfmathsetmacro\atheta{##3} +\pgfmathsetmacro\dot{cos(\aphi)} +\ifdim\dot pt<0.7 pt\relax% +\pgfmathsetmacro\norm{cos(asin(\dot))} +\pgfmathsetmacro\xx{-sin(\aphi)*sin(\blochsphere@rotation - \atheta)} +\pgfmathsetmacro\xy{sin(\aphi)*sin(\blochsphere@tilt)*cos(\blochsphere@rotation - \atheta)} +\pgfmathsetmacro\yx{-sin(2*\aphi - \blochsphere@rotation + \atheta)/4 - sin(2*\aphi + \blochsphere@rotation - \atheta)/4} +\pgfmathsetmacro\yy{(sin(\aphi)*cos(\blochsphere@tilt) - sin(\blochsphere@tilt)*sin(\blochsphere@rotation - \atheta)*cos(\aphi))*sin(\aphi)} +\else +\pgfmathsetmacro\norm{sqrt(abs(sin(\blochsphere@rotation - \atheta)*cos(\aphi))^2 + abs(sin(\blochsphere@tilt)*cos(\aphi)*cos(\blochsphere@rotation - \atheta))^2 + abs(cos(\aphi)*cos(\blochsphere@tilt)*cos(\blochsphere@rotation - \atheta))^2)} +\pgfmathsetmacro\xx{-sin(\blochsphere@rotation - \atheta)*cos(\aphi)} +\pgfmathsetmacro\xy{sin(\blochsphere@tilt)*cos(\aphi)*cos(\blochsphere@rotation - \atheta)} +\pgfmathsetmacro\yx{-cos(\aphi)^2*cos(\blochsphere@rotation - \atheta)} +\pgfmathsetmacro\yy{(sin(\aphi)*cos(\blochsphere@tilt) - sin(\blochsphere@tilt)*sin(\blochsphere@rotation - \atheta)*cos(\aphi))*cos(\aphi)} +\fi +\computeOffset{shift} + \begingroup\newcommand\tmp[1]{\endgroup\noexpand\relax% +\tikzset{\blochsphere@plane/.style={cm={\xx/\norm, \xy/\norm, \yx/\norm, \yy/\norm, \unexpanded\expandafter{####1} }}}% +} \tmp{\shift} +}% +\newcommand\setLatitudinalDrawingPlane[2][]{% +\pgfmathsetmacro\yshift{sin(##2)*\the\blochsphere@radius} +\setDrawingPlane[##1,shift={{0,0,\yshift}}]{0}{0} +}% +\newcommand\setLongitudinalDrawingPlane[2][]{% +\setDrawingPlane[##1]{90}{##2} +}% +\newcommand\drawCircle[3][]{ +\begingroup +\setkeys{blochsphere}{##1} +\setDrawingPlane{##2}{##3} +\computeVisibility{##2}{##3}{agamma}{abeta} +\begingroup\edef\tmp{\endgroup% +\noexpand\draw[current plane,on layer=back,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma-\abeta-0.2:\blochsphere@radius+\the\pgflinewidth*0.5) arc (\agamma-\abeta-0.2:\agamma+\abeta+0.2:\blochsphere@radius+\the\pgflinewidth*0.5)}; +\noexpand\draw[current plane,on layer=front,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma+\abeta:\blochsphere@radius+\the\pgflinewidth*0.5) arc (\agamma+\abeta:\agamma-\abeta+360:\blochsphere@radius+\the\pgflinewidth*0.5)}; +} \tmp +\endgroup +}% +\newcommand\drawGreatCircle[3][]{ +\drawCircle[##1]{##2}{##3} +} +\newcommand\drawSmallCircle[4][]{ +\begingroup +\pgfmathsetmacro\xshift{sin(##2)*cos(##3)*\blochsphere@radius*sin(##4)} +\pgfmathsetmacro\yshift{sin(##2)*sin(##3)*\blochsphere@radius*sin(##4)} +\pgfmathsetmacro\zshift{cos(##2)*\blochsphere@radius*sin(##4)} +\pgfmathsetmacro\radius{\blochsphere@radius*cos(##4)} +\drawCircle[##1,shift={{\xshift,\yshift,\zshift}},radius=\radius]{##2}{##3} +\endgroup +}% +\newcommand\drawLatitudeCircle[2][]{ +\begingroup +\pgfmathsetmacro\yshift{sin(##2)*\blochsphere@radius} +\pgfmathsetmacro\radius{\blochsphere@radius*cos(##2)} +\drawCircle[##1,shift={{0,0,\yshift}},radius=\radius]{0}{0} +\endgroup +}% +\newcommand\drawLongitudeCircle[2][]{ +\begingroup +\drawCircle[##1]{90}{##2+90} +\endgroup +}% +\newcommand\drawRotationLeft[5][]{ +\begingroup +\setkeys{blochsphere}{##1} +\pgfmathsetmacro\xshift{sin(##2)*cos(##3)*##4} +\pgfmathsetmacro\yshift{sin(##2)*sin(##3)*##4} +\pgfmathsetmacro\zshift{cos(##2)*##4} +\setDrawingPlane[shift={\xshift,\yshift,\zshift}]{##2}{##3} +\computeVisibility{##2}{##3}{agamma}{abeta} +\begingroup\edef\tmp{\endgroup% +\noexpand\draw[current plane,on layer=back,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma-\abeta-0.2:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5) arc (\agamma-\abeta-0.2:\agamma+\abeta+0.2:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5)}; +\noexpand\draw[<-,current plane,on layer=front,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma+\abeta+##5:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5) arc (\agamma+\abeta+##5:\agamma-\abeta+360:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5)}; +} \tmp +\endgroup +}% +\newcommand\drawRotationRight[5][]{ +\begingroup +\setkeys{blochsphere}{##1} +\pgfmathsetmacro\xshift{sin(##2)*cos(##3)*##4} +\pgfmathsetmacro\yshift{sin(##2)*sin(##3)*##4} +\pgfmathsetmacro\zshift{cos(##2)*##4} +\setDrawingPlane[shift={\xshift,\yshift,\zshift}]{##2}{##3} +\computeVisibility{##2}{##3}{agamma}{abeta} +\begingroup\edef\tmp{\endgroup% +\noexpand\draw[current plane,on layer=back,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma-\abeta-0.2:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5) arc (\agamma-\abeta-0.2:\agamma+\abeta+0.2:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5)}; +\noexpand\draw[->,current plane,on layer=front,\unexpanded\expandafter{\blochsphere@style}] \unexpanded\expandafter{(\agamma+\abeta:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5) arc (\agamma+\abeta:\agamma-\abeta+360-##5:\blochsphere@radius*\blochsphere@scale+\the\pgflinewidth*0.5)}; +} \tmp +\endgroup +}% +\newcommand\drawAxis[3][] { +\begingroup +\setkeys{blochsphere}{##1} +\pgfmathsetmacro\behind{ifthenelse(-sin(##2)*sin(\blochsphere@rotation - ##3)*cos(\blochsphere@tilt) + sin(\blochsphere@tilt)*cos(##2)<0, 1, 0)} +\pgfmathsetmacro\newphi{180-##2} +\pgfmathsetmacro\newtheta{##3+180} +\ifnum\behind=0\relax +\labelPolar[scale=1,mark=0]{blochspheretmpp}{##2}{##3} +\labelPolar[mark=0]{blochspheretmps}{##2}{##3} +\labelPolar[mark=0]{blochspheretmpe}{\newphi}{\newtheta} +\else +\labelPolar[scale=1,mark=0]{blochspheretmpp}{\newphi}{\newtheta} +\labelPolar[mark=0]{blochspheretmpe}{##2}{##3} +\labelPolar[mark=0]{blochspheretmps}{\newphi}{\newtheta} +\fi +\begingroup\edef\tmp{\endgroup% +\ifnum\behind=0\relax +\noexpand\draw[on layer=front,\unexpanded\expandafter{\blochsphere@style},\blochsphere@axisarrow] (blochspheretmpp) -- (blochspheretmps); +\noexpand\draw[on layer=back,\unexpanded\expandafter{\blochsphere@style}] (blochspheretmpe) -- (blochspheretmpp); +\else +\noexpand\draw[on layer=front,\unexpanded\expandafter{\blochsphere@style},\blochsphere@axisarrow] (blochspheretmpp) -- (blochspheretmpe); +\noexpand\draw[on layer=back,\unexpanded\expandafter{\blochsphere@style}] (blochspheretmps) -- (blochspheretmpp); +\fi +} \tmp +\endgroup +}% +\newcommand\labelPolar[4][]{% +\begingroup +\setkeys{blochsphere}{##1} +\setLongitudinalDrawingPlane{##4+90} +\pgfmathsetmacro\behind{ifthenelse(-sin(##3)*sin(\blochsphere@rotation - ##4)*cos(\blochsphere@tilt) + sin(\blochsphere@tilt)*cos(##3)<0, 1, 0)} +\ifthenelse{\boolean{blochsphere@labelmark}} + { + \ifnum\behind=1\relax + \path[current plane,on layer=back] (90-##3:\blochsphere@radius*\blochsphere@scale) coordinate[mark coordinate] (##2); % + \else + \path[current plane,on layer=front] (90-##3:\blochsphere@radius*\blochsphere@scale) coordinate[mark coordinate] (##2); % + \fi + } + { + \ifnum\behind=1\relax + \path[current plane,on layer=back] (90-##3:\blochsphere@radius*\blochsphere@scale) coordinate (##2); % + \else + \path[current plane,on layer=front] (90-##3:\blochsphere@radius*\blochsphere@scale) coordinate (##2); % + \fi + } +\endgroup +}% +\newcommand\labelLatLon[4][]{% +\begingroup +\pgfmathsetmacro\newphi{90-##3} +\labelPolar[##1]{##2}{\newphi}{##4} +\endgroup +}% +\newcommand\drawStateLatLon[4][]{ +\begingroup +\pgfmathsetmacro\newphi{90-##3} +\drawStatePolar[##1]{##2}{\newphi}{##4} +\endgroup +}% +\newcommand\drawStatePolar[4][]{ +\begingroup +\setkeys{blochsphere}{##1} +\labelPolar{##2}{##3}{##4} +\pgfmathsetmacro\behind{ifthenelse(-sin(##3)*sin(\blochsphere@rotation - ##4)*cos(\blochsphere@tilt) + sin(\blochsphere@tilt)*cos(##3)<0, 1, 0)} +\ifnum\behind=1\relax +\tikzset{test/.style={ +postaction={ +decorate, +decoration={ +markings, +mark=at position \pgfdecoratedpathlength-0.5pt with {\arrow[\blochsphere@statecolor,line width=\blochsphere@statewidth,opacity=0.2] {>}; }, +mark=between positions 0 and \pgfdecoratedpathlength-5pt step 0.5pt with { +\pgfmathsetmacro\myval{multiply(divide( +\pgfkeysvalueof{/pgf/decoration/mark info/distance from start}, \pgfdecoratedpathlength),100)}; +\pgfsetfillcolor{\blochsphere@statecolor}; +\pgfsetfillopacity{0.4-\myval/100*0.2} +\pgfpathcircle{\pgfpointorigin}{\blochsphere@statewidth}; +\pgfusepath{fill};} +}}}} +\else +\tikzset{test/.style={ +postaction={ +decorate, +decoration={ +markings, +mark=at position \pgfdecoratedpathlength-0.5pt with {\arrow[\blochsphere@statecolor,line width=\blochsphere@statewidth] {>}; }, +mark=between positions 0 and \pgfdecoratedpathlength-5pt step 0.5pt with { +\pgfmathsetmacro\myval{multiply(divide( +\pgfkeysvalueof{/pgf/decoration/mark info/distance from start}, \pgfdecoratedpathlength),100)}; +\pgfsetfillcolor{\blochsphere@statecolor}; +\pgfsetfillopacity{0.4+\myval/100*0.6} +\pgfpathcircle{\pgfpointorigin}{\blochsphere@statewidth}; +\pgfusepath{fill};} +}}}} +\fi +\path [test,on layer=main] (0,0) -- (##2); +\endgroup +}% +\newcommand\computeOffset[2][]{% +\setkeys{blochsphere}{##1}% +\pgfmathsetmacro{\x}{\blochsphere@shift[0]*cos(\blochsphere@rotation) + \blochsphere@shift[1]*sin(\blochsphere@rotation)}% +\pgfmathsetmacro\y{\blochsphere@shift[0]*sin(\blochsphere@rotation)*sin(\blochsphere@tilt) - \blochsphere@shift[1]*sin(\blochsphere@tilt)*cos(\blochsphere@rotation) + \blochsphere@shift[2]*cos(\blochsphere@tilt)} +\expandafter\def\csname ##2\endcsname{(\x pt,\y pt)}% +}% +\newcommand\computeVisibility[5][]{ +\setkeys{blochsphere}{##1} +\pgfmathsetmacro\aphi{##2} +\pgfmathsetmacro\atheta{##3} +\pgfmathsetmacro\d{sqrt(\blochsphere@shift[0]^2+\blochsphere@shift[1]^2+\blochsphere@shift[2]^2)}%% distance from origin of shift +\pgfmathsetmacro\tatheta{\atheta+\blochsphere@rotation} +\pgfmathsetmacro\dot{cos(\aphi)} +\ifdim\dot pt<0.7 pt\relax% +\pgfmathsetmacro\domaintest{ifthenelse(and(\blochsphere@rotation - \atheta==0,or(\aphi==0,sin(\blochsphere@tilt==0))),0,1)} +\ifdim\domaintest pt=0 pt\relax +\pgfmathsetmacro\agamma{0} +\else +\pgfmathsetmacro\agamma{-90+atan(cos(\blochsphere@tilt)*cos(\blochsphere@rotation - \atheta)/(sin(\aphi)*sin(\blochsphere@tilt) + sin(\blochsphere@rotation - \atheta)*cos(\aphi)*cos(\blochsphere@tilt)))} +\fi +\else +\pgfmathsetmacro\domaintest{ifthenelse(and(Mod(\blochsphere@rotation-\atheta,180)==90,Mod(\blochsphere@tilt,180)==90),0,1)} +\pgfmathsetmacro\domaintesttwo{ifthenelse(Mod(\blochsphere@rotation-\atheta,180)==90,0,1)} +\pgfmathsetmacro\domaintestthree{ifthenelse(Mod(\blochsphere@tilt,180)==90,0,1)} +\ifdim\domaintest pt=0 pt\relax +\pgfmathsetmacro\agamma{360-90*\blochsphere@tilt/abs(\blochsphere@tilt)} +\else +\ifdim\domaintesttwo pt=0 pt\relax +\pgfmathsetmacro\agamma{360-90*(sin(\aphi)*tan(\blochsphere@tilt)+cos(\aphi)*sin(\blochsphere@rotation-\atheta))/abs(sin(\aphi)*tan(\blochsphere@tilt)+cos(\aphi)*sin(\blochsphere@rotation-\atheta))} +\else +\ifdim\domaintestthree pt=0 pt\relax +\pgfmathsetmacro\agamma{360-90*\blochsphere@tilt/abs(\blochsphere@tilt)*cos(\blochsphere@rotation-\atheta)/abs(cos(\blochsphere@rotation-\atheta))} +\else +\pgfmathsetmacro\agamma{360-atan( (sin(\aphi)*tan(\blochsphere@tilt)+cos(\aphi)*sin(\blochsphere@rotation-\atheta))/cos(\blochsphere@rotation-\atheta) )} +\fi +\fi +\fi +\fi +\pgfmathsetmacro\aalpha{acos(-sin(\aphi)*sin(\blochsphere@rotation)*cos(\atheta)*cos(\blochsphere@tilt) + sin(\aphi)*sin(\atheta)*cos(\blochsphere@rotation)*cos(\blochsphere@tilt) + sin(\blochsphere@tilt)*cos(\aphi))} +\pgfmathsetmacro\aalphatest{atan(\d/\blochsphere@radius)} +\ifdim\aalpha pt<\aalphatest pt\relax +\pgfmathsetmacro\abeta{0} +\else +\pgfmathsetmacro\abeta{acos(\d*cot(\aalpha)/\blochsphere@radius)} +\fi +\pgfmathsetmacro\abeta{ifthenelse(\blochsphere@shift[2]<0,\abeta+2*(90-\abeta),\abeta)} +\expandafter\pgfmathsetmacro\csname ##4\endcsname{\agamma} +\expandafter\pgfmathsetmacro\csname ##5\endcsname{\abeta} +}% +\tikzset{% +>=latex, % option for nice arrows +inner sep=0pt,% +outer sep=2pt,% +mark coordinate/.style={inner sep=0pt,outer sep=0pt,minimum size=3pt, +fill=black,circle}% +}% +\pgfdeclareradialshading[tikz@ball]{ball}{\pgfqpoint{-10bp}{10bp}}{% +color(0bp)=(tikz@ball!30!white); +color(9bp)=(tikz@ball!75!white); +color(18bp)=(tikz@ball!90!black); +color(25bp)=(tikz@ball!70!black); +color(50bp)=(black) +}% +\ifthenelse{\boolean{blochsphere@nested}}{}{% +\begin{tikzpicture} +\drawBall +}% +} +{ +\ifthenelse{\boolean{blochsphere@nested}}{}{ +\end{tikzpicture}% +}% +\endgroup% +} +\endinput +%% +%% End of file `blochsphere.sty'. diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 7537e4c256f..3e45a2ae563 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -97,7 +97,8 @@ my @TLP_working = qw( bidi bidi-atbegshi bidicontour bidihl bidipagegrid bidipresentation bidishadowtext bigfoot bigints binomexp biocon bitelist bizcard - blacklettert1 blindtext blkarray block blockdraw_mp bloques blowup blox + blacklettert1 blindtext blkarray + blochsphere block blockdraw_mp bloques blowup blox bnumexpr bodegraph bohr boisik bold-extra boites boldtensors bondgraph bondgraphs bookcover bookdb bookest bookhands booklet diff --git a/Master/tlpkg/tlpsrc/blochsphere.tlpsrc b/Master/tlpkg/tlpsrc/blochsphere.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlpsrc/blochsphere.tlpsrc diff --git a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc index bcd274c6732..54c35618f6f 100644 --- a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc @@ -10,6 +10,7 @@ depend asyfig depend asypictureb depend autoarea depend bardiag +depend blochsphere depend bloques depend blox depend bodegraph |