LaTeXで家系図
LaTeX で家系図を出したくなった経験、あると思います。あの、教科書に書いてあるようなノーマルな家系図です。自分も家系図を出したくなり、 ctan で探してみると genealogytree パッケージという tikz を使ったものがヒットしました。しかしいわゆる日本的な家系図とはちょっと違う…(当然)
そこで発想を変えて樹形図が出力できるパッケージから自分で作ってみることにしました。ecltree パッケージを使います。texlive2022 には
(ナントカ)/texlive/2022/texmf-dist/tex/latex/ecltree/ecltree.sty
に入っています。
ecltree パッケージの使い方
基本的にはecltree パッケージの説明書の通りです。
jsclasses で使うにはpicture
環境を用いていることから
\usepackage{bxeepic}
\usepackage{ecltree}
のように bxeepic パッケージを先に読み込む必要があります。
例えば(パッケージの例の流用ですが)
\begin{bundle}{xxx}
\chunk{aaa}
\chunk{
\begin{bundle}{yyy}
\chunk{bbb}
\chunk{ddd}
\end{bundle}}
\chunk{ccc}
\end{bundle}
とすれば
が出力されます。xxx
を親とする樹形図を\begin{bundle}{xxx}(中身)\end{bundle}
で表していて子を\chunk
の中に入れて表しています。
線の種類について
先ほどの樹形図の線は斜めになっていますが今回出力したいのはかくかくとした線の家系図です。
\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 パッケージを見ましたが、上のコードが含まれているものとそうでないものがありました。追加しておくとよいと思います。
その上で
\drawwith{\crank{\drawline}}
の下に最初の例を書くとかくかくとした家系図が出力されます。
xparse パッケージでカスタマイズ
とはいえ、子供からさらにその子を増やしたくなったら\chunk
に入れていたものを外に出して\begin{bundle}
直後の{}
に入れる操作をして縦書きのboxの中に入れる作業をするのはちょっと大変です。なのでいろいろなマクロを簡単に定義できる xparse パッケージでカスタマイズします。縦書きにしたいので plext パッケージで縦書きにします。
\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>{\!=\!=\!=\!=\!}}
例えば某徳川家の家系図の一部は下のようにかけます。
\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{光圀}
}
}
数字は将軍になった順番です。\d{\d{\d{\b}\c}\c}%
は右から\crank{\dashline{1}}
、\crank{\drawline}
、\crank{\drawline}
で書くということです。(この辺りはecltree
のドキュメントを参照してください。
使い方
始めの親だけ\h{}
に入れてその下の子は全て\g{}
に入れます。\g
はこんな構文をとります。\h
も同じです。
\g{(人物名)}[(添え字)][(添え字以外の横に出したいもの)]{(その下の人物、\gに入れる)}
2つ目から4つ目の[][]{}
は省略可能です。子供からさらにその子を増やしたくなったらその子の\g{}
直後に{}
を付け足して次の子を\g
の中に書けばいいようにしました。
あと地味ですが、見本のコードのようにタブを入れて子供ごとに改行するとタブの個数で何代目かが分かるので便利です。
eskakeizu パッケージ
これまでの内容を eskakeizu パッケージにまとめてみました。
使い方は platex か uplatex のプレアンブルで
\usepackage{eskakeizu}
\def\g{\generatechild}
\def\h{\hajimenooya}
とするだけです。\h
とか\g
の省略形を使うかどうかまでは入れませんでした(他の用途で使いたい人も多いと思うので)。
追記(2022/09/08)familytreeパッケージ
ctanにあるfamilytreeパッケージというものを使うともっと複雑な家系図、例えば婚姻関係を含むもの等が記述できたり家系図の自由度が広がったりするようです。すごい......!
参考文献
ecltreeパッケージドキュメント
ecltreeパッケージ
familytreeパッケージ