\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 <http://www.gnu.org/licenses/>.
\fi

\section{人物 (\texttt{ft-individual.dtx})}

\DescribeMacro{\indvdldef}
\cmd{\indvdldef
  \oarg{child mark}
  \marg{new box name}
  \oarg{title}
  \marg{individual name}
  \oarg{additonal info}
  \oarg{maleline xlength}
}
\medskip

与えられた情報を整形\jslash 配置したboxを、指定された\meta{new box name}で定義する。

\begin{enumerate}
\item \oarg{child mark}
\par
人物名の前に描く線の種別を指定する。
後述する|\ftbiological|、
|\ftadopted|、
|\fttop|、
|\ftblank|
のいづれかを指定する

\item \marg{new box name}
\par
定義するbox名。
\CS ではない
（baskslashを付けない）

\item \oarg{title}
\par
肩書き
\par
人物名の肩に二回り小さなサイズ（|\relsize{-2}|）で配置される

\item \marg{individual name}
\par
人物名

\item \oarg{additonal info}
\par
付加情報
\par
生没年、別名等、任意の情報を追加できる。
人物名の次段に一回り小さなサイズ（|\relsize{-1}|）で配置される。
更に後述する
|\ftmaleline| (|\ftfemaleline|, |\ftpatrilineal|, |\ftmatrilineal|)、
|\fthaschild|、
|\ftprivate|
の属性も指定できる

\item \oarg{maleline xlength}
\par
人物名から子への線を描く場合
（図に婚姻関係を含めない場合）、
線の長さを増減する。
但し、後述する兄弟姉妹box内では自動的に調節されるため、
意味を失う。
\end{enumerate}

更に後で使用する座標（単位は|pt|）を表す\CS も定義する。
要素（人物名）に関する座標の原点はそれぞれ、
横書きの場合はbox左下、
縦書きの場合はbox左上である。

\begin{itemize}
\item \meta{box name}|nameX|
\par
配置した人物名の末尾

\item \meta{box name}|nameCX|
\par
配置した人物名の幅の中央
（縦書きならば高さの中央）

\item \meta{box name}|nameCY|
\par
配置した人物名の高さの中央
（縦書きならば幅の中央）
\end{itemize}
\bigskip

\needspace{4\baselineskip}
\oarg{child mark}には次の値のいづれかを指定する。

\begin{itemize}
\item |\biological|, |\ftbiological|
\par
人物名の前に実子を意味する実線を描く。

\item |\adopted|, |\ftadopted|
\par
人物名の前に養子を意味する二重線を描く。

\item |\fttop| (|\top|)
\par
線を描かない。系図の最上位に用いる。

\item |\blank|, |\ftblank|
\par
線を描かない代わりに、同じサイズの空白を挿入する。後述する
|\mrrgdef|に指定する配偶者などの定義時に使用する。
\end{itemize}
\bigskip

\oarg{additonal info}には次の属性を含められる。

\begin{itemize}
\item |\haschild|, |\fthaschild|
\par
子をもうけた配偶者を表す。
\par
後述する婚姻関係定義に使用すると、婚姻
関係を意味する二重線から直角に実線を描く。

\item |\private|, |\ftprivate|
\par
法的な婚姻関係ではないことを表す。
\par
後述する婚姻関係定義に使用する
と、婚姻関係を意味する二重線を点線にする。

\item |\maleline|, |\ftmaleline|
\par
婚姻線を描かず人物名から子への線を描く。
\par
線の長さはオプション引数\meta{maleline xlength}で加減できる。
|\ftfemaleline|、
|\ftpatrilineal|、
|\ftmatrilineal|と同義。
\end{itemize}
\bigskip

作成するboxの中身は細分化されたboxである。
\smallskip

\begin{itemize}
\item 肩書きを表す|\ft@titlebox|
\item 人物名を表す|\ft@namebox|
\par
内部には更に\meta{child mark}を表す|\ft@cmarkbox|、
\meta{maleline}を表す\allowbreak|\ft@malelinebox|がある。
\item 付加情報を表す|\ft@optbox|
\end{itemize}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{カスタマイズ}

配置を調整する機能もある。
変更しないものには空を指定すれば良い。
大したことはしていないので必要に応じ参照\jslash 使用する程度で良い。
引数等詳細は実装を参照のこと。
\medskip

\needspace{1.5\baselineskip}
\DescribeMacro{\nameboxcfg}
\cmd{\nameboxcfg
  \marg{space from the child mark}
  \marg{font}
  \marg{space to the maleline}
  \marg{maleline length}
}
\smallskip

\DescribeMacro{\cmarkboxcfg}
\cmd{\cmarkboxcfg
  \marg{space between two lines, for adopted}
  \marg{line length}
}
\smallskip

\DescribeMacro{\titleboxcfg}
\cmd{\titleboxcfg
  \marg{indent}
  \marg{font}
  \marg{linestretch}
  \marg{vspace to the individual name}
}
\smallskip

\DescribeMacro{\optboxcfg}
\cmd{\optboxcfg
  \marg{vspace from the individual name}
  \marg{indent}
  \marg{font}
  \marg{linestretch}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{例}

\begin{enumerate}
\itemsep=\bigskipamount
\item
\srcfig{fig1base}

\item
\srcfig{fig1Ieyasu}

\item
\srcfig{fig1Hidetada}
\end{enumerate}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\iffalse
\subsectImpl

\subsubsection{child-mark box}

\parag{カスタマイズ}

\DescribeMacro{\ftcmarkboxcfg}
\DescribeMacro{\cmarkboxcfg}
child markを配置したboxを生成する際に使用する
|\adopted|の二重線の間隔、
線の長さ
をカスタマイズできる。

変更しないものには空を指定すれば良い。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parag{box生成}

\DescribeMacro{\fttop}
\DescribeMacro{\top}
\DescribeMacro{\ftbiological}
\DescribeMacro{\biological}
\DescribeMacro{\ftadopted}
\DescribeMacro{\adopted}
\DescribeMacro{\ftblank}
\DescribeMacro{\blank}
child mark種類。
それぞれの意味は\refnm{table:cmark}を参照。

\DescribeMacro{\ft@indvdl@nameH}
\DescribeMacro{\ft@indvdl@nameD}
\DescribeMacro{\ft@indvdl@nameCY}
\DescribeMacro{\ft@do@cmarkdef}
\DescribeMacro{\ft@cmarkdef}
指定された\meta{cmark}を持つboxを、\meta{cmarkbox-name}に指定された名前で生
成する。

罫線文字を使うことも検討したが、fontが異なるとつながらなくなる恐れがあ
るため|picutre|の|line|にした。

|\ft@indvdl@nameH|、|\ft@indvdl@nameD|、|\ft@indvdl@nameCY|はinterface
である|\indvdldef|が初期化する。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{付加情報box}

\parag{カスタマイズ}

\DescribeMacro{\ftoptboxcfg}
\DescribeMacro{\optboxcfg}
付加情報\meta{additional info}を整形\jslash 配置した|\ft@optbox|を生
成する際に使用する、
人物名との距離、
字下げ量、
font、
linestretch
をカスタマイズできる。

変更しないものには空を指定すれば良い。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parag{属性と付加情報の解析}

\DescribeMacro{\ftmaleline}
\DescribeMacro{\maleline}
\DescribeMacro{\fthaschild}
\DescribeMacro{\haschild}
\DescribeMacro{\ftprivate}
\DescribeMacro{\private}
属性。
それぞれの意味は\refnm{table:attrib}を参照。

\DescribeMacro{\ft@optlist}
\meta{option-list}に指定された付加情報\meta{additional info}から属性を取り出し、
\meta{box-name}を基にした名前のglobal flagを定義する。
属性以外のものは後で印字するため、
別リスト\meta{list}を生成する。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parag{box生成}

\DescribeMacro{\ft@opt}
付加情報\meta{additional info}を整形\jslash 配置した|\ft@optbox|を生
成する。

先頭には\meta{child-mark}分に加え、
人物名からindentするための余白を挿入する。

最終行のdepthをboxのdepthとする。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{人物名box}

\parag{カスタマイズ}

\DescribeMacro{\ftnameboxcfg}
\DescribeMacro{\nameboxcfg}
人物名に使用する、
字下げ量、
font、
人物名の後にmalelineを描く場合の人物名との距離、
および線の長さ
をカスタマイズできる。

変更しないものには空を指定すれば良い。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parag{box生成}

\DescribeMacro{\ft@name}
人物名を整形\jslash 配置した|\@ft@namebox|を生成する。

中身は|\ft@cmarkbox|、\meta{individual-name}、
|\ft@malelinebox|を並べたもの。

malelineを描く場合、defaultのlength、というか線の始点をどう決定するか
を仲々決められなかった。
始点を単に人物名の後ろとするか、それとも肩書きと付加情報も含め、一
番大きなboxの後ろを始点とするか。後者にすると人物box単独での見た目は良
くなる。すなわち常にmalelineを一番長くさせられる。しかし、後述する他の
兄弟姉妹boxなどと並べる時に、線をどれだけ延ばせば他のboxと揃えられるか
を算出するのに手間がかかるようになる。
この点は前者の方に分があり、単に人物名のsizeの差だけを増
加させれば揃えられる。
試行錯誤の後、始点は前者とし、default lengthは
|\ft@namebox@maleline@length|とする。
すなわち、人物boxを単独で用いる場合、肩書きや追加情報の方がmalelineよ
りも長くなることがあり得る。

後で兄弟姉妹\jslash 親子\jslash 婚姻関係作成時に座標として利用できるよう、
\meta{box name}|nameX|、\meta{box name}|nameCX|を定義する。

人物boxのdepthは人物名のそれに一致させる。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{肩書きbox}

\parag{カスタマイズ}

\hyphenation{line-stretch}
\DescribeMacro{\fttitleboxcfg}
\DescribeMacro{\titleboxcfg}
肩書きを配置した|\ft@titlebox|を生成する際に使用する
字下げ量、
font、
linestretch、
人物名との距離をカスタマイズできる。

変更しないものには空を指定すれば良い。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parag{box生成}

\DescribeMacro{\ft@title}
肩書きを整形\jslash 配置した|\ft@titlebox|を生成する。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{boxの連結 --- core}

指定された情報を基に、
肩書き（|\ft@titlebox|）、人物名（|\ft@namebox|）、付加情報
（|\ft@optbox|）それぞれを作成する。
それらを並べ人物boxを生成する。
boxのdepthは最終行のそれに一致させる。

後で兄弟姉妹\jslash 婚姻\jslash 親子関係作成時に座標として利用できるよう、
\meta{box name}|nameCY|を定義する。

各boxの生成、人物boxのsize算出、|picture|によるlayoutの三段階を踏む。
それぞれを独立させ定義するが、\IhadtoSplit

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parag{各boxの生成}

\DescribeMacro{\ft@indvdlbox@gen}
\NoDescription
   \begin{macrocode}
   \end{macrocode}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parag{人物boxのsize算出}

\DescribeMacro{\ft@indvdlbox@calc}
\NoDescription
   \begin{macrocode}
   \end{macrocode}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parag{\texttt{picture}によるlayout}

\DescribeMacro{\ft@indvdlbox@layout}
\NoDescription
   \begin{macrocode}
   \end{macrocode}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parag{box連結のmain}

\DescribeMacro{\ft@indvdlbox}
\NoDescription
   \begin{macrocode}
   \end{macrocode}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{人物box --- interface}

\DescribeMacro{\ftindvdldef}
\DescribeMacro{\indvdldef}
指定された情報に従い、
\meta{box name}という名前のboxを生成する。

\meta{individula name}だけの高さ|\ft@indvdl@nameH|を求め、
更にdepthも考慮した中点を|\ft@indvdl@nameCY|に定義し、
以降の接続点の座標算出に用いる。

\meta{child mark}は人物boxの先頭に置き、
全ての行はlayout的にその存在を意識する必要があるため、
他の項目よりも先に決定し、
|\ft@cmarkbox|、
およびその幅を表す|\ft@cmarkW|を定義する。

\meta{cmark}が|\ftblank|以外の場合は、
child-markが存在することを表すglobal flagを
\meta{containerbox-name}に指定された名前を基に定義する。

|\ft@optlst|により\meta{additional info}を解析し、
属性を除いたものを|\ft@indvdl@opts|にまとめる。
同時に|\ifft@maleline|を設定し、
属性に|\maleline|が指定されているか否かを以降判断できるようにする。

ここまでの前処理を済ませた後|\ft@indvdlbox|により人物名boxを生成する。
\fi
