\iffalse Copyright 2022 Jiro Senju This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this package. If not, see . \fi \section{親子関係、二世代 (\texttt{ft-gens.dtx})} \DescribeMacro{\pcdef} \cmd{\pcdef \marg{new box name} \marg{parent box name} \marg{child box name} } \medskip 親子関係(parent-child relationship)を定義する。 指定された\meta{parent box}と\meta{child box}を結線した新たなboxを \meta{new box name}で定義する。 \meta{parent box}に指定できるのは、子へつながる線が一本だけのboxに限ら れる。例えば、|\maleline|(相当)の属性を与え |\indvdldef|で作成したboxである。 また\meta{child box}に指定できるのは親へつながる線を持つboxに限られる。 例えば、child markに|\biological|を指定した|\indvdldef|で作成したboxである。 |\pcdef|は次に挙げる|\gensdef|の簡易版である。 \bigskip \DescribeMacro{\gensdef} \cmd{\gensdef \marg{new box name} \marg{parent box name} \marg{list of connection-pair} } \smallskip \cmd{connection-pair :=\\ \hspace{4em}\marg{individual box name in the parent box}\\ \hspace{4em}\marg{child box name} } \medskip 二世代の関係(generations)を定義する。 \meta{connection-pair}とは、以下のものを組にしたものである。 \begin{enumerate} \item \marg{parant box}内の人物box名 \item \marg{child box}名 \end{enumerate} この二つのboxの\meta{box name}|nameCY|同士を結線する。 \smallskip \meta{child box}には、前述の|\pcdef|同様に、親へつながる線を(一本)持 つboxしか指定できないが、\meta{parent box}には子へつながる線を複数 持つものでも指定できる。どの線とどの\meta{child box}をつなぐかを指定す るのが\meta{connection-pair}である。 作成したboxのchild markは親boxのそれに一致する。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \clearpage \subsection{例} \begin{enumerate} \itemsep=\bigskipamount \item \srcfig{fig3Hidetada} \clearpage \item \srcfig{fig3Ietsuna} \clearpage \item 上例二つをつなぐ手順を紹介しておく。 \begin{enumerate} \item 子から順に先祖を辿りながら定義する。すなわち、上例2の後に1を定義する。 \item 上例2に変更は不要である。 \item 上例1の \begin{lstlisting}[xleftmargin=1em] \pcdef{秀忠親子}{秀忠}{秀忠の子} \end{lstlisting} を \begin{lstlisting}[xleftmargin=1em] \gensdef{家光家綱}{秀忠の子}{% {家光}{家綱綱吉}% } \pcdef{秀忠家光}{秀忠}{家光家綱} \end{lstlisting} へ変更する。 \medskip すなわち \textgt{\texttt{\textbackslash\kern0pt 秀忠の子}}box 内の人物box \textgt{\texttt{\textbackslash\kern0pt 家光}} と、上例2で定義済みの \textgt{\texttt{\textbackslash\kern0pt 家綱綱吉}}box をつなぎ、これを \textgt{\texttt{\textbackslash\kern0pt 家光家綱}}box とする。 \textgt{\texttt{\textbackslash\kern0pt 秀忠}}box と親子関係を結ぶのはこの \textgt{\texttt{\textbackslash\kern0pt 家光家綱}}box である。 \item 新たに定義した \textgt{\texttt{\textbackslash\kern0pt 秀忠家光}} を描画する。 \end{enumerate} 紙面の都合上、横書きの結果のみ提示する。 \end{enumerate} \smallskip \noindent\includegraphics[scale=.95]{fig3IemitsuY.pdf} \medskip %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{複数boxの定義、結線順序} \label{sec:Lily1} 兄弟姉妹boxとは複数の人物boxを同列に並べるものととらえるならば、 それと直交する方向に並べるのが親子boxだ。 同列に並んだ兄弟姉妹それぞれが子を持つならば、親子関係が複数になるので 単純に親子関係ボックスとは呼びづらく、二世代boxと呼ぶ方がふさわしい。 このような図の作成方法は二通り考えられる。親子関係を複数定義し、親同士を 兄弟姉妹boxでつなぐ方法と、逆に親世代の兄弟姉妹boxを先に定義してから、それぞ れに子をつなぐ方法だ。 この二つの方法を比較しながら、図の見やすさを考える。まず例を図示する。 \begin{enumerate} \needspace{2\baselineskip} \item 二組の親子関係を定義後、親世代の姉妹関係を定義する。 \srcfig{fig3Lily1} \needspace{3\baselineskip} \item 姉妹関係を定義後、それぞれの親子関係を定義する。 \srcfig{fig3Lily2} \end{enumerate} 見て分かる通り、1の方法では子をつなぐ線の長さが異なり、更に子世代の位 置も揃わなくなるため、見にくい図となる。 これは子へつながる線はもっとも長いものに揃えるという|\sblngdef|の 機能が働かなかったためだ。|\sblngdef|の引数に渡された時点で既に 親子関係が定義されている状態であり、線の先には人物boxがつながれている。 この状態で|\sblngdef|が強引に線を延ばすのはよろしくない。 一方、2の方法では|\sblngdef|の引数は|\indvdldef|されただけで他にはつながれていない boxである。このため、上から長い線を描き足しても害は無い。既定義boxを改変 しないまま、兄弟姉妹boxに閉じた範囲で同じ高さに線を上書きしている。 1の方法を採った場合でも線の長さを揃える方法はある。 |\indvdldef|が持つ線長の増減機能を利用し、 上図のLilyが持つ|\femaleline|(|\matrilineal|)の長さをPetuniaのそれと同 じにすれば良い。 PetuniaとLilyの名前の長さの差を求め、それを|\indvdldef|にオプションとし て追加する。 描画結果は上例2と同じである。 \smallskip \srcfig{fig3Lily3} \medskip |\nameboxcfg|には子をつなぐ線の長さを変更する機能があるので、これを使っ ても同様の結果を得ることができる。しかし、|\indvdldef|する度に |\nameboxcfg|するのは得策ではないだろう。|\nameboxcfg|はもっと広範囲に 適用する値を変更し、個別設定の回数を削減することを目的としており、 |\indvdldef|の度に変更することは想定していない(できなくはないが)。 個別に使用する値は|\indvdldef|のオプション引数を使用した方が簡便だろう。 \bigskip もう一つの方法としてLilyの名前の長さをPetuniaのそれに揃える方法もある。 この方法ではLilyの名前と線の間が空き、線の長さが揃う。 \smallskip \srcfig{fig3Lily4} \medskip Lilyの親子boxをPetunia親子boxとは違う場面で使用すると、名前の後ろが不 自然に空き、おかしく見えることもあるかもしれない。その場合は、空き具合 を変化させたLily boxを複数定義し使い分けることになるだろう。 \bigskip boxの定義順序、言い換えれば配置\jslash 結線順序には注意が必要だ。 本パッケージでのbox定義とは与えられた複数のboxを並べ線でつなぐものだが、 その際に与えられたboxの大きさを考慮する。例えば兄弟姉妹boxを定義する際、 既に子孫とつないだboxを与え、そのboxの幅(または高さ)が増加していれば、 兄弟姉妹の間隔を拡げる。すなわちinterval boxによる間隔挿入が必要になる のは末端の関係定義だ けになる。しかし、兄弟姉妹boxを定義した後で子とつなげる場合は、この 間隔調整機能が発揮されない。隣り合う子boxの幅(または高さ)が広ければ、 重なってしまうだろう。この場合は手動でinterval boxを挿入せざるを得ない。 接続ポイントは\meta{box name}\meta{brabra}|nameCY|などの名前で定義され た座標で ある。前章までで説明したように|\sblngdef|は兄弟姉妹それぞれの名前の中 心を表すY座標を定義するが、nestした場合にnest内部までは定義しない。す なわち親子boxに配置された人物boxへ線をつなげるのは(ほぼ)自動的にでき るが、親子box内の兄弟姉妹boxに配置された人物boxへ線をつなげるには、ユー ザが自分で座標を算出しなければならない。不可能ではないが、手間はかかる。 この手間を回避するため、世代は下から順に定義\jslash 結線していくのが良いと考える。 \iffalse \bigskip 最終的に、 ユーザがどのような図を欲するにより、どの順序でboxを定義し、つなげるか、 また調整をどう加えるかを決定するのが良い。 \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \iffalse % \subsubsection{二世代box --- core} % % \iffalse % \parag{カスタマイズ} % % \DescribeMacro{\ftgescfg} % \NoDescription % \begin{macrocode} % \newcommand{\ftgenscfg}[1]{% % } % \end{macrocode} % \fi % % \parag{connection pair} % % \DescribeMacro{\ft@getpair} % 引数からconnection-pairを取り出し、 % 親box内の接続点を|\ft@cpoint|として、また子box名を|\ft@kids|として定義する。 % 接続点に与えられたものが親box内でnestして配置された場合にも対応する。 % しかしnestは一段までしか対応しない。 % % \parag{上余白} % % \DescribeMacro{\def@calc@xtop} % 親boxに必要な上余白を算出し、指定されたglobalな名前で定義する。 % % \parag{下余白} % % \DescribeMacro{\ft@calc@xbottom} % 親boxに必要な下余白を算出し、指定されたglobalな名前で定義する。 % 同時に|\ft@depth|も定義する。 % % \parag{box size算出} % % \DescribeMacro{\ft@gens@size} % box sizeを算出する。 % % \parag{配置} % % \DescribeMacro{\ft@gens@layout} % 親boxと子boxを配置する。 % 配置した親boxの|nameCY|座標を\meta{box name}|nameCY|とする。 % 配置した子boxの原点(左下、縦書きならば中央上)を\meta{box % name}\meta{\kern0pt 子box name}|Y|として定義する。 % 本package自身では不要の座標だが、ユーザが必要とするかもしれないので。 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{二世代box --- interface} % % \DescribeMacro{\ftgensdef} % boxのchild markは親boxのそれに一致する。 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{親子box --- interface} % % \DescribeMacro{\ftpcdef} % 親子関係boxを定義する。 % |\gensdef|の簡易版。 % 親box、子boxそれぞれの\meta{box name}|nameCY|同士を結線する。 \fi