TikZ超入門 もしもBloch球が描けたなら

### Introduction
昨今盛り上がりを見せる量子コンピューター。
最初に必ず出てくるのがブロッホ球(Bloch sphere)である。
解説は数あれど、描き方を解説した記事はないのではないか。

もしも、、、もしもBloch球が描けたなら、、、


### Requirement
LaTeXについて少し知っておく必要があります。
Donald E. Knuthによって開発された組版システムTeXを拡張したもので、
様々な分野の論文を書くのに使用されます。
インストールや使用方法などは、別サイトをご参考にしてください。

### TikZ
LaTeX用の描画パッケージで、高度な描画機能を有しています。

### Hands-on
それでは始めましょう。

##### draw

```latex:first.tex
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz{
  \draw(0,0)--(1,2);
}
\end{document}
```

プリアンブルに```\usepackage{tikz}```を書くことでTikZが使用できるようになります。
```\tikz{}```の中に具体的な描画命令を書いていきます。
ここでは```\draw```を使用しました。これを組版(typeset)すると、以下のような出力が得られます。

![a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322803/a2dde324-37e5-389f-a305-72328ba126b2.png)

左下が(0,0)で右上が(1,2)になります。
```(0,0)--(1,2);```はこれらの座標間に線を引けという命令になっているんですね。
文の最後に```;```をつけるのを忘れないでください。
例えば代わりに```(0,0)rectangle(1,2);```とすると、長方形の出力が得られます。
また円を描画する```circle```なんてのもあります。

##### option
LaTeXではお馴染みの書式を用いてオプションを設定することができます。
例えば```\draw[->]```とすると、矢印が描画されます。

##### coordinate
この命令を使用すると、座標を設定することができます。
```\coordinate(origin)at(0,0);```は点```(0,0)```にoriginという座標を設定します。
一度設定した座標は以降、```(label)```の形で使用することができます。
### A second shot
ここまでの知識を用いて、3次元の座標軸とBloch球を描いてみます。

```latex:second.tex
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz{
  \coordinate(o)at(0,0);
  \draw(o)circle(2cm);
  \draw[->](o)--(-0.81,-0.79);%x
  \draw[->](o)--(2,0);%y
  \draw[->](o)--(0,2);%z
}
\end{document}
```
出力は以下のようになります。

<img width="323" alt="Screen Shot 2018-12-07 at 08.19.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/322803/e3889e6b-1fc6-ac89-98d7-12f1f9547c7c.png">

だいぶそれらしくなりましたね。

##### node

```node{}``` を用いることで、描画を行いながら要素を追加していくことができます。
また```node(label)```の形でラベルを設定することもできます。

```latex:node.tex
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz{
  \coordinate(o)at(0,0);
  \draw[->](o)--(1,1)node(tikz)[right]{TikZ};
  \draw[->](tikz)--(2,0);
}
\end{document}
```

組版結果
<img width="199" alt="Screen Shot 2018-12-07 at 08.55.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/322803/85885305-fb92-300c-2eec-03422347138a.png">


この例では```TikZ```というノードを追加すると同時に、```tikz```というラベルを
設定しています。またオプションにrightを設定することで、矢印の右にノードを追加しています。
##### tikzstyle
同じオプションを何度も使用する場合に、エイリアスを設定することができます。
```\tikzstyle{style_name}=[option1,option2] ```
このように書くと、```style_name```を```->``` などと同様に使用することができます。

### The Final edition
さて、ここまでで最低限の知識は獲得できました。
もうあなたには次のコードを読み解くことができるはずです。

```latex:final.tex
\documentclass{standalone}
\usepackage{tikz,braket}
\begin{document}
\tikz{
  \tikzstyle{st}=[lightgray, fill, fill opacity=0.1]
  \coordinate(o)at(0,0);
  \draw(o)circle(2cm);
  \draw[fill](o)circle(1.5pt);%origin
  \draw[st](o)--(56.7:0.4)arc(56.7:90.:0.4)--cycle;%theta angle
  \draw(0.18,0.6)node{$\theta$};
  \draw[st](o)--(-135.7:0.4)arc(-135.7:-33.2:0.4)--cycle;%varphi angle
  \draw(0.14,-0.58)node{$\varphi$};
  \draw[->](o)--(-0.81,-0.79) node[above left]{$x$};%x
  \draw[->](o)--(2,0)node[right]{$y$};%y
  \draw[->](o)--(0,2)node[below right]{$z$}node[above]{$\ket{0}$};%z |0>
  \draw[rotate around={0.:(0.,0.)},dashed](0,0)ellipse(2cm and 0.9cm);%ellipse
  \draw[thick,->](o)--(0.70,1.07)node[above]{$\ket{\psi}$};%state vector
  \draw[densely dotted,->](o)--(0,-2)node[below]{$\ket{1}$};%-z |1>
  \draw[dotted](o)--(0.7,-0.46)--(0.7,1);%triangle
}
\end{document}

```
いざ、Typeset、、、
、
、
、
、
、
、

<img width="483" alt="Screen Shot 2018-12-07 at 09.05.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/322803/ffbc3f2e-a54c-855e-c85b-e4989adbc8cc.png">


# !!?
これでいつでも論文がかけますね&#x1f37a;

### Further reading
本記事では導入しませんでしたが、描画位置を変えない```edge```というものがあります。
また他にも紹介していない様々な技法があり、それらを駆使すると幾分かh記述量を減らすことができるでしょう。

```latex:final2.tex
\documentclass{standalone}
\usepackage{tikz,braket}
\begin{document}
\tikz{
\tikzset{p/.style={pos=1}}
  \draw[lightgray, fill, fill opacity=0.1]
    (0,0)--(-135.7:0.4)arc(-135.7:-33.2:0.4)--cycle--(56.7:0.4)arc(56.7:90.:0.4)--cycle;
  \draw[rotate around={0.:(0.,0.)},dashed](0,0)ellipse(2cm and 0.9cm);
  \draw[dotted](0,0)--(0.7,-0.46)--(0.7,1);
  \draw (0,0)
    circle(2cm)
    node[circle,fill,scale=.4]{}
    edge[->]node[p,above left]{$x$}(-0.81,-0.79)
    edge[->]node[p,right]{$y$}(right:2)
    edge[->]node[p,below right]{$z$}node[p,above]{$\ket{0}$}(up:2)
    edge[densely dotted,->]node[p,below]{$\ket{1}$}(down:2)
    edge[thick,->]node[p,above]{$\ket{\psi}$}(0.70,1.07)
    (0.14,-0.58)node{$\varphi$}(0.18,0.6)node{$\theta$};
}
\end{document}
```

### Appendix
TikZにはsyntactic sugarと言いますか、むしろ混乱の元な気がするのですが、省略形があることを付言しておきます。

* ```\draw```は```\path[draw]```の省略形
* ```\draw node```は単に```\node```とできる

### Bibliography
[how-to-draw-a-bloch-sphere](https://tex.stackexchange.com/questions/345420/how-to-draw-a-bloch-sphere)
[TikZの概念](http://mbps.hatenablog.com/entry/2015/02/24/143217)