数式の木構造(20160123jssac)

［[日本数式処理学会合同分科会発表準備](http://qiita.com/ryutaatkagawanct/private/7ea3b75e42e43a8e6a04)に戻る。］

数式の木構造をTi<i>k</i>Zで描いてみよう。

# 簡単な例
たとえば，$4+6$であれば次のようにすればよい。

```latex:treestructure.tex
\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}
\node {$+$}
  child { node {$4$} }
  child { node {$6$} };
\end{tikzpicture}

\end{document}
```
![output](https://qiita-image-store.s3.amazonaws.com/0/108155/8510610c-4fde-143c-ee69-0552f07399b0.png "output")

# ノード間の間隔を設定する
$1\times4+2\times3$であれば次のようにすればよい…

```latex:treestructure.tex
\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}
\node {$+$}
  child { node {$\times$}
    child { node {$1$} }
    child { node {$4$} }
  }
  child { node {$\times$}
    child { node {$2$} }
    child { node {$3$} }
  };
\end{tikzpicture}

\end{document}
```
…と思いきや，
![output](https://qiita-image-store.s3.amazonaws.com/0/108155/bdd3f848-485c-9739-814f-85b7b5596479.png "output")
4と2が見事に重なってしまった。
間隔を空けるには，オプション`sibling distance`を利用。
レベルごとに値を変えるのが吉。

```latex:treestructure.tex
\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}[
  level 1/.style={sibling distance=30mm},
  level 2/.style={sibling distance=10mm}
]
\node {$+$}
  child { node {$\times$}
    child { node {$1$} }
    child { node {$4$} }
  }
  child { node {$\times$}
    child { node {$2$} }
    child { node {$3$} }
  };
\end{tikzpicture}

\end{document}
```
![output](https://qiita-image-store.s3.amazonaws.com/0/108155/25b997e8-4958-db25-5cb5-9c70858d3fd6.png "output")

# 木の伸びる方向を変える
ちなみに，オプション`grow`により木構造の伸びる方向を変えられる。

```latex:treestructure.tex
\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}[
  level 1/.style={sibling distance=30mm},
  level 2/.style={sibling distance=10mm}
]
\node {$+$} [grow=right]
  child { node {$\times$}
    child { node {$1$} }
    child { node {$4$} }
  }
  child { node {$\times$}
    child { node {$2$} }
    child { node {$3$} }
  };
\end{tikzpicture}

\end{document}
```
![output](https://qiita-image-store.s3.amazonaws.com/0/108155/be906980-c717-713d-6586-5d12110793e8.png "output")

# ノードのスタイル
見やすくするために，ノードは丸囲みにしよう。
オプション `every node/.style` を指定。

```latex:treestructure.tex
\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}[
  level 1/.style={sibling distance=30mm},
  level 2/.style={sibling distance=10mm},
  every node/.style={circle,draw}
]
\node {$+$}
  child { node {$\times$}
    child { node {$1$} }
    child { node {$4$} }
  }
  child { node {$\times$}
    child { node {$2$} }
    child { node {$3$} }
  };
\end{tikzpicture}

\end{document}
```
![output](https://qiita-image-store.s3.amazonaws.com/0/108155/c06ced10-8d41-5e5d-c402-16d1072fa693.png "output")

# ノードの属性を指定するためのオプションを設定できる
数値と演算子とを区別したい，と思うなら，自分でオプションを設定することも可能。
数値のノード用に`nodeval`，演算子のノード用に`nodeop`を用意してしまえ。

```latex:treestructure.tex
\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}[
  level 1/.style={sibling distance=30mm},
  level 2/.style={sibling distance=10mm},
  nodeop/.style={circle,draw},
  nodeval/.style={rectangle,draw}
]
\node[nodeop] {$+$}
  child { node[nodeop] {$\times$}
    child { node[nodeval] {$1$} }
    child { node[nodeval] {$4$} }
  }
  child { node[nodeop] {$\times$}
    child { node[nodeval] {$2$} }
    child { node[nodeval] {$3$} }
  };
\end{tikzpicture}

\end{document}
```
![output](https://qiita-image-store.s3.amazonaws.com/0/108155/ddde5951-3daa-39fb-9e4b-990a86ac428d.png "output")

# 子ノードの数
ちなみに，子ノードは2つである必要はない。1つでも3つでもよい。

```latex:treestructure.tex
\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}[
  level 1/.style={sibling distance=30mm},
  level 2/.style={sibling distance=10mm},
  nodeop/.style={circle,draw},
  nodeval/.style={rectangle,draw}
]
\node[nodeop] {$+$}
  child { node[nodeop] {$\times$}
    child { node[nodeval] {$1$} }
    child { node[nodeval] {$4$} }
  }
  child { node[nodeop] {$\times$}
    child { node[nodeval] {$2$} }
    child { node[nodeval] {$3$} }
    child { node[nodeval] {$1$} }
  };
\end{tikzpicture}

\end{document}
```
![output](https://qiita-image-store.s3.amazonaws.com/0/108155/6c5bf7df-75c7-bced-e4bd-d115e92cfdb9.png "output")

# ノードの参照
親ノードに参照名，たとえば `myexpr`，をつけておけば，
子ノードは `myexpr-1`，`myexpr-2-3` などで参照できる。

```latex:treestructure.tex
\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}[
  level 1/.style={sibling distance=30mm},
  level 2/.style={sibling distance=10mm},
  nodeop/.style={circle,draw},
  nodeval/.style={rectangle,draw}
]
\node (myexpr) [nodeop] {$+$}
  child { node[nodeop] {$\times$}
    child { node[nodeval] {$1$} }
    child { node[nodeval] {$4$} }
  }
  child { node[nodeop] {$\times$}
    child { node[nodeval] {$2$} }
    child { node[nodeval] {$3$} }
    child { node[nodeval] {$1$} }
  };
\draw[red] (myexpr-1) -- (myexpr-2-3) node[midway] {?};
\end{tikzpicture}

\end{document}
```
![output](https://qiita-image-store.s3.amazonaws.com/0/108155/e1c9e466-ba7e-6279-40db-b18bfd03b057.png "output")

# おしまい
おしまい。

［[日本数式処理学会合同分科会発表準備](http://qiita.com/ryutaatkagawanct/private/7ea3b75e42e43a8e6a04)に戻る。］