【LaTeX】家系図を出す方法



# LaTeXで家系図

LaTeX で家系図を出したくなった経験、あると思います。あの、教科書に書いてあるようなノーマルな家系図です。自分も家系図を出したくなり、 ctan で探してみると genealogytree パッケージという tikz を使ったものがヒットしました。しかしいわゆる日本的な家系図とはちょっと違う…（当然）

そこで発想を変えて樹形図が出力できるパッケージから自分で作ってみることにしました。[ecltree パッケージ](https://www.ctan.org/pkg/ecltree)を使います。texlive2022 には

```
(ﾅﾝﾄｶ)/texlive/2022/texmf-dist/tex/latex/ecltree/ecltree.sty
```

に入っています。

# ecltree パッケージの使い方

基本的には[ecltree パッケージの説明書](https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/macros/latex/contrib/eclbip/ecltreesample.pdf)の通りです。

jsclasses で使うには`picture`環境を用いていることから

```latex
\usepackage{bxeepic}
\usepackage{ecltree}
```

のように bxeepic パッケージを先に読み込む必要があります。

例えば（パッケージの例の流用ですが）

```latex
\begin{bundle}{xxx}
\chunk{aaa}
\chunk{
	\begin{bundle}{yyy}
	\chunk{bbb} 
	\chunk{ddd} 
	\end{bundle}}
\chunk{ccc}
\end{bundle}
```

とすれば

![kakeizuimg-nt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/e9c25272-2491-d637-107d-76f471409524.png)


が出力されます。`xxx`を親とする樹形図を`\begin{bundle}{xxx}(中身)\end{bundle}`で表していて子を`\chunk`の中に入れて表しています。

# 線の種類について

先ほどの樹形図の線は斜めになっていますが今回出力したいのはかくかくとした線の家系図です。

```tex
\newdimen\@midY
\def\crank#1(#2,#3)(#4,#5){%
        \@midY=#3\p@\advance\@midY by #5\p@\divide\@midY by 2\relax
        \edef\@MidY{\expandafter\@RemoveDim\the\@midY}%
        #1(#2,#3)(#2,\@MidY)(#4,\@MidY)(#4,#5)}

\def\crankarrow#1(#2,#3)(#4,#5){%
	\crank#1(#2,#3)(#4,#5)%
	\put(#4,#5){\vector(0,-1){0}}}

\def\crankrevarrow#1(#2,#3)(#4,#5){%
	\crank#1(#2,#3)(#4,#5)%
	\put(#2,#3){\vector(0,1){0}}}
```

いろいろ ecltree パッケージを見ましたが、上のコードが含まれているものとそうでないものがありました。追加しておくとよいと思います。

その上で

```tex
\drawwith{\crank{\drawline}}
```

の下に最初の例を書くとかくかくとした家系図が出力されます。

![kakeizuimg-nt-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/0ba4fe71-1a37-7404-8b69-279b8b779d43.png)




# xparse パッケージでカスタマイズ

とはいえ、子供からさらにその子を増やしたくなったら`\chunk`に入れていたものを外に出して`\begin{bundle}`直後の`{}`に入れる操作をして縦書きのboxの中に入れる作業をするのはちょっと大変です。なのでいろいろなマクロを簡単に定義できる xparse パッケージでカスタマイズします。縦書きにしたいので plext パッケージで縦書きにします。

```latex
\usepackage{xparse}%複雑なコマンド作る
\usepackage{plext}%縦書き
\DeclareDocumentCommand{\generatechild}{m O{\phantom{0}} O{} g}{\IfNoValueTF{#4}{\chunk{\(^{\phantom{#2}}\phantom{#3}\pbox<t>{#1}^{#2} #3\)}}{\chunk{\begin{bundle}{\({\phantom{^{#2}#3}}\pbox<t>{#1 }^{#2} #3\)}#4\end{bundle}}}}
\DeclareDocumentCommand{\hajimenooya}{m O{\phantom{0}} O{} g}{\begin{bundle}{\({\phantom{^{#2}#3}}\pbox<t>{#1 }^{#2} #3\)}#4\end{bundle}}
\def\kekkon{　\pbox<y>{\!=\!=\!=\!=\!}}
```

例えば某徳川家の家系図の一部は下のようにかけます。

```latex
\def\g{\generatechild}
\def\h{\hajimenooya}
\def\d{\drawwith}
\def\c{\crank{\drawline}}
\def\b{\crank{\dashline{1}}}
\h{家康}[1]{
	\g{信康}
	\g{秀忠}[2]{\d{\d{\d{\b}\c}\c}%
		\g{家光}[3]
		\g{忠長}
		\g{正之}
	}
	\g{頼房}{
		\g{光圀}
	}
}
```

![kakeizuimg-nt-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/135f365c-1b8e-5511-f1a2-76efb4e1efaf.png)



数字は将軍になった順番です。`\d{\d{\d{\b}\c}\c}%`は右から`\crank{\dashline{1}}`、`\crank{\drawline}`、`\crank{\drawline}`で書くということです。（この辺りは`ecltree`のドキュメントを参照してください。

# 使い方
始めの親だけ`\h{}`に入れてその下の子は全て`\g{}`に入れます。`\g`はこんな構文をとります。`\h`も同じです。

```latex
\g{(人物名)}[(添え字)][(添え字以外の横に出したいもの)]{(その下の人物、\gに入れる)}
```

2つ目から4つ目の`[][]{}`は省略可能です。子供からさらにその子を増やしたくなったらその子の`\g{}`直後に`{}`を付け足して次の子を`\g`の中に書けばいいようにしました。

あと地味ですが、見本のコードのようにタブを入れて子供ごとに改行するとタブの個数で何代目かが分かるので便利です。

# eskakeizu パッケージ

これまでの内容を [eskakeizu パッケージ](https://github.com/migawariw/eskakeizu/blob/main/eskakeizu.sty)にまとめてみました。

使い方は platex か uplatex のプレアンブルで

```latex
\usepackage{eskakeizu}
\def\g{\generatechild}
\def\h{\hajimenooya}
```

とするだけです。`\h`とか`\g`の省略形を使うかどうかまでは入れませんでした（他の用途で使いたい人も多いと思うので）。

# 追記（2022/09/08）familytreeパッケージ

ctanにある[familytreeパッケージ](https://ctan.org/pkg/familytree)というものを使うともっと複雑な家系図、例えば婚姻関係を含むもの等が記述できたり家系図の自由度が広がったりするようです。すごい......！



# 参考文献

ecltreeパッケージドキュメント

https://ftp.jaist.ac.jp/pub/CTAN/macros/latex/contrib/eclbip/ecltreesample.pdf

ecltreeパッケージ

https://www.ctan.org/pkg/ecltree

familytreeパッケージ

https://ctan.org/pkg/familytree