3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【LaTeX】家系図を出す方法

Last updated at Posted at 2022-09-06

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}

とすれば

kakeizuimg-nt.png

が出力されます。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}}

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

kakeizuimg-nt-2.png

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{光圀}
	}
}

kakeizuimg-nt-3.png

数字は将軍になった順番です。\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パッケージ

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?