From 2ef43af0215fc52966c9bbd8d5df6db6d6af224b Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Tue, 28 Jun 2022 03:01:06 +0000
Subject: CTAN sync 202206280301

---
 macros/latex/contrib/familytree/ft-individual.dtx | 760 ++++++++++++++++++++++
 1 file changed, 760 insertions(+)
 create mode 100644 macros/latex/contrib/familytree/ft-individual.dtx

(limited to 'macros/latex/contrib/familytree/ft-individual.dtx')

diff --git a/macros/latex/contrib/familytree/ft-individual.dtx b/macros/latex/contrib/familytree/ft-individual.dtx
new file mode 100644
index 0000000000..a8b0e4eacf
--- /dev/null
+++ b/macros/latex/contrib/familytree/ft-individual.dtx
@@ -0,0 +1,760 @@
+% \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{Individual Box (\texttt{ft-individual.dtx})}
+%
+% \DescribeMacro{\indvdldef}
+% \indent
+% \cmd{\indvdldef
+%   \oarg{child mark}
+%   \marg{new box name}
+%   \oarg{title}
+%   \marg{individual name}
+%   \oarg{additional info}
+%   \oarg{maleline xlength}
+% }
+% \medskip
+%
+% Defines a new box named \meta{new box name}, and layouts the
+% given arguments in that box.
+%
+% \begin{enumerate}
+% \item \oarg{child mark}
+% \par
+% The type of a line which is located ahead of the individual name.
+% \par
+% Specify one of |\ftbiological|,
+% |\ftadopted|,
+% |\fttop|,
+% or |\ftblank|.
+% Details are discussed later.
+%
+% \item \marg{new box name}
+% \par
+% The name of a new box.
+% \par
+% This is not a \CS{} (no backslash).
+%
+% \item \oarg{title}
+% \par
+% One's title.
+% \par
+% Put at the shoulder of the individual name with a smaller font
+% (|\relsize{-2}|).
+%
+% \item \marg{individual name}
+% \par
+% One's name.
+%
+% \item \oarg{additional info}
+% \par
+% Additional information.
+% \par
+% Anything can be added such as birth\slash death year-month-date and alias.
+% Put with a little smaller font (|\relsize{-1}|) at next to the individual name.
+% Also the attributes (discussed later),
+% |\ftmaleline| (|\ftfemaleline|, |\ftpatrilineal|, |\ftmatrilineal|),
+% \allowbreak|\fthaschild|,
+% |\ftprivate| are specified here.
+%
+% \item \oarg{maleline xlength}
+% \par
+% When you draw a line from an individual (instead of a marriage box) to
+% a child, the length of the line can be adjusted by this argument.
+% But in the sibling box, the line length will be adjusted automatically
+% regardless this argument.
+% \end{enumerate}
+%
+% Also |\indvdldef| defines some connection points as \CS. The origin is
+% left-bottom of the box and the unit is |pt|.
+%
+% \begin{table}
+% \hfil\begin{tabular}{ll}
+% \meta{box name}|nameX| &
+% the tail of the individual name
+% \\
+%
+% \meta{box name}|nameCX| &
+% the center of the width of individual name
+% \\
+%
+% \meta{box name}|nameCY| &
+% the center of the height of individual name
+% \end{tabular}
+% \end{table}
+%
+% For \oarg{child mark}, you can specify one of these values.
+%
+% \begin{itemize}
+% \item |\biological| or |\ftbiological|
+% \par
+% a single line to represent a biological\slash real child.
+%
+% \item |\adopted| or |\ftadopted|
+% \par
+% a double line to represent an adopted child.
+%
+% \item |\fttop| (or |\top|)
+% \par
+% no line at all.
+%
+% \item |\blank| or |\ftblank|
+% \par
+% put a space whose size is equal to the |\biological| or |\adopted| mark,
+% assuming used for the spouse in a marriage box.
+% \end{itemize}
+% \bigskip
+%
+% For \oarg{additional info}, you can specify any of these attributes.
+%
+% \begin{itemize}
+% \item |\haschild| or |\fthaschild|
+% \par
+% represents a spouse who has a child.
+% draws a line in a marriage box to their child from the center of the
+% double line which represents a marriage.
+%
+% \item |\private| or |\ftprivate|
+% \par
+% represents the marriage is not official.
+% draws a dashed double line.
+%
+% \item |\maleline| or |\ftmaleline|
+% \par
+% draws a line to a child from the individual name instead of the double
+% line in the marriage box.
+% |\ftfemaleline|,
+% |\ftpatrilineal|,
+% |\ftmatrilineal| are all equivalent.
+% \end{itemize}
+% \bigskip
+%
+% The individual box consists of a few smaller boxes.
+%
+% \begin{itemize}
+% \item |\ft@titlebox|
+% \item |\ft@namebox|
+% \par
+% In |\ft@namebox|, there are |\ft@cmarkbox| which represents the
+% \meta{child mark}
+% and |\ft@malelinebox| which represents \meta{maleline}.
+%
+% \item |\ft@optbox|
+% \end{itemize}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsection{Customization}
+%
+% \DescribeMacro{\nameboxcfg}
+% \indent
+% \cmd{\nameboxcfg
+%   \marg{space from the child mark}
+%   \marg{font}
+%   \marg{space to the maleline}
+%   \marg{maleline length}
+% }
+% \medskip
+%
+% \DescribeMacro{\cmarkboxcfg}
+% \cmd{\cmarkboxcfg
+%   \marg{space between two lines, for adopted}
+%   \marg{line length}
+% }
+% \medskip
+%
+% \DescribeMacro{\titleboxcfg}
+% \cmd{\titleboxcfg
+%   \marg{indent}
+%   \marg{font}
+%   \marg{linestretch}
+%   \marg{vspace to the individual name}
+% }
+% \medskip
+%
+% \DescribeMacro{\optboxcfg}
+% \cmd{\optboxcfg
+%   \marg{vspace from the individual name}
+%   \marg{indent}
+%   \marg{font}
+%   \marg{linestretch}
+% }
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \needspace{12ex}
+% \subsection{Example}
+%
+% \begin{enumerate}
+% \item
+% \srcfig{fig1Robert1}
+%
+% \item
+% \srcfig{fig1Robert2}
+% \end{enumerate}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsectImpl
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsubsection{Child-mark box}
+%
+% \parag{Customization}
+%
+% \DescribeMacro{\ftcmarkboxcfg}
+% \DescribeMacro{\cmarkboxcfg}
+%
+%    \begin{macrocode}
+\newlength{\ft@cmarkbox@adopted@sep}
+\setlength{\ft@cmarkbox@adopted@sep}{4pt}
+\newlength{\ft@cmarkbox@length}
+\setlength{\ft@cmarkbox@length}{1\ft@unit}
+\newcommand{\ftcmarkboxcfg}[2]{% adopted-sep line-length
+  \ifx#1\empty\else%
+    \setlength{\ft@cmarkbox@adopted@sep}{#1}%
+  \fi%
+  \ifx#2\empty\else%
+    \setlength{\ft@cmarkbox@length}{#2}%
+  \fi%
+}
+\ft@alias{cmarkboxcfg}
+%    \end{macrocode}
+%
+% \parag{Define a box}
+%
+% \DescribeMacro{\fttop}
+% \DescribeMacro{\top}
+% \DescribeMacro{\ftbiological}
+% \DescribeMacro{\biological}
+% \DescribeMacro{\ftadopted}
+% \DescribeMacro{\adopted}
+% \DescribeMacro{\ftblank}
+% \DescribeMacro{\blank}
+%
+%    \begin{macrocode}
+\chardef\fttop=0
+\chardef\ftbiological=1
+\chardef\ftadopted=2
+\chardef\ftblank=3
+\ft@alias{top}
+\ft@alias{biological}
+\ft@alias{adopted}
+\ft@alias{blank}
+%    \end{macrocode}
+%
+% \DescribeMacro{\ft@indvdl@nameH}
+% \DescribeMacro{\ft@indvdl@nameD}
+% \DescribeMacro{\ft@indvdl@nameCY}
+% \DescribeMacro{\ft@do@cmarkdef}
+% \DescribeMacro{\ft@cmarkdef}
+%
+%    \begin{macrocode}
+\newsavebox{\ft@cmarkbox}
+\newlength{\ft@cmarkW}
+\newlength{\ft@indvdl@nameH}
+\newlength{\ft@indvdl@nameD}
+\newlength{\ft@indvdl@nameCY}
+\newcommand{\ft@do@cmarkdef}[4]{% cmarkbox-name cmark width line-length
+  \ft@savenamebox{#1}{%
+    \edef\@w{\strip@pt#3}%
+    \edef\@h{\strip@pt\ft@indvdl@nameH}%
+    \edef\@l{\strip@pt#4}%
+    \begin{picture}(\@w,\@h)%
+      \ft@dbgframe{\@w,\@h}%
+      \ifcase#2% fttop
+      \or% ftbiological
+        \put(0,\strip@pt\ft@indvdl@nameCY){\line(1,0){\@l}}%
+      \or% ftadopted
+        \ft@y=\dimexpr\ft@indvdl@nameCY%
+          + .5\ft@cmarkbox@adopted@sep\relax%
+        \put(0,\strip@pt\ft@y){\line(1,0){\@l}}%
+        \advance\ft@y -\ft@cmarkbox@adopted@sep%
+        \put(0,\strip@pt\ft@y){\line(1,0){\@l}}%
+      \or% \ftblank
+      \fi%
+    \end{picture}%
+  }%
+  \ft@nameboxsz{#1}{\ft@indvdl@nameH}{\ft@indvdl@nameD}%
+}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\newcommand{\ft@cmarkdef}[4]{%
+  % cmarkbox-name cmark cmark-xlength cmark-space
+  \ft@savenamebox{#1}{}% empty
+  \ifcase#2% fttop
+  \else%
+    \ft@len=\dimexpr\ft@cmarkbox@length + #3\relax\relax%
+    \ifdim\ft@len>0pt%
+      \ft@do@cmarkdef{#1}{#2}{\dimexpr\ft@len + #4\relax}{\ft@len}%
+    \fi%
+  \fi%
+  \ft@dbgbox{\@nameuse{#1}}%
+}
+%    \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \needspace{3\baselineskip}
+% \subsubsection{Additional info box}
+% \nopagebreak
+%
+% \parag{Customization}
+%
+% \DescribeMacro{\ftoptboxcfg}
+% \DescribeMacro{\optboxcfg}
+%
+%    \begin{macrocode}
+\newlength{\ft@optbox@vsp}
+\setlength{\ft@optbox@vsp}{.1\baselineskip}
+\newlength{\ft@optbox@indent}
+\setlength{\ft@optbox@indent}{1.1\ft@unit}
+\newcommand{\ft@optbox@font}{\relsize{-1}}%{\footnotesize}
+\newcommand{\ft@optbox@linestretch}{.75}
+\newcommand{\ftoptboxcfg}[4]{% vsp indent font linestretch
+  \ifx#1\empty\else%
+    \setlength{\ft@optbox@vsp}{#1}%
+  \fi%
+  \ifx#2\empty\else%
+    \setlength{\ft@optbox@indent}{#2}%
+  \fi%
+  \ifx#3\empty\else%
+    \renewcommand{\ft@optbox@font}{#3}%
+  \fi%
+  \ifx#4\empty\else%
+    \renewcommand{\ft@optbox@linestretch}{#4}%
+  \fi%
+}
+\ft@alias{optboxcfg}
+%    \end{macrocode}
+%
+% \parag{Parsing}
+%
+% \DescribeMacro{\ftmaleline}
+% \DescribeMacro{\maleline}
+% \DescribeMacro{\fthaschild}
+% \DescribeMacro{\haschild}
+% \DescribeMacro{\ftprivate}
+% \DescribeMacro{\private}
+%
+%    \begin{macrocode}
+\newcommand{\ftmaleline}{ft@attr0}
+\let\ftfemaleline=\ftmaleline
+\let\ftpatrilineal=\ftmaleline
+\let\ftmatrilineal=\ftmaleline
+\newcommand{\fthaschild}{ft@attr1}
+\newcommand{\ftprivate}{ft@attr2}
+\ft@alias{maleline}
+\ft@alias{femaleline}
+\ft@alias{patrilineal}
+\ft@alias{matrilineal}
+\ft@alias{haschild}
+\ft@alias{private}
+%    \end{macrocode}
+%
+% \DescribeMacro{\ft@optlist}
+%
+% Extracts the attributes from \meta{option-list} (which is
+% \meta{additional info} itself) and sets a global flag whose name is
+% generated using \meta{box-name}.
+% Other than the attributes are appended another list, \meta{list} which
+% will be printed later.
+%
+%    \begin{macrocode}
+\newcommand{\ft@optlist}[3]{% list box-name option-list
+  \edef\@male{\ftmaleline}%
+  \edef\@hasch{\fthaschild}%
+  \edef\@priv{\ftprivate}%
+  \@for\@temptokena:=#3\do{%
+    \edef\@opt{\@temptokena}%
+    \ft@dbgmsg{\@opt}%
+    \ifx\@opt\@male%
+      \global\ft@malelinetrue%
+      \ft@namexdef{#2hasmaleline}{\ftmaleline}%
+    \else%
+      \ifx\@opt\@hasch%
+        \ft@namexdef{#2haschild}{\fthaschild}%
+      \else%
+        \ifx\@opt\@priv%
+          \ft@namexdef{#2private}{\ftprivate}%
+        \else%
+          \ft@list@append{#1}{\@opt}%
+        \fi%
+      \fi%
+    \fi%
+  }%
+}
+%    \end{macrocode}
+%
+% \parag{Define a box}
+%
+% \DescribeMacro{\ft@opt}
+%
+%    \begin{macrocode}
+\newsavebox{\ft@optbox}
+\newcommand{\ft@opt}[1]{% option-list
+  \savebox{\ft@optbox}{%
+    \hspace{\ft@cmarkW}%
+    \hspace{\ft@optbox@indent}%
+    \vbox{%
+      \def\baselinestretch{\ft@optbox@linestretch}%
+      \ft@optbox@font%
+      \vspace{\ft@optbox@vsp}%
+      \@for\@temptokena:=#1\do{%
+        \vss%
+        \hbox{\@temptokena}%
+        \setbox\@tempboxa=\hbox{\@temptokena}%
+        \global\ft@depth=\dp\@tempboxa%
+      }%
+    }%
+  }%
+  \ft@len=\dimexpr\ht\ft@optbox + \dp\ft@optbox - \ft@depth\relax%
+  \ft@boxsz{\ft@optbox}{\ft@len}{\ft@depth}%
+  \ft@dbgbox{\ft@optbox}%
+}
+%    \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsubsection{Name box}
+%
+% \parag{Customization}
+%
+% \DescribeMacro{\ftnameboxcfg}
+% \DescribeMacro{\nameboxcfg}
+%
+%    \begin{macrocode}
+\newlength{\ft@namebox@sp}
+\setlength{\ft@namebox@sp}{.25\ft@unit}
+\newcommand{\ft@namebox@font}{}% empty
+\newlength{\ft@namebox@maleline@sp}
+\setlength{\ft@namebox@maleline@sp}{.25\ft@unit}
+\newlength{\ft@namebox@maleline@length}
+\setlength{\ft@namebox@maleline@length}{1.5\ft@unit}
+\newcommand{\ftnameboxcfg}[4]{% sp font maleline-sp maleline-length
+  \ifx#1\empty\else%
+    \setlength{\ft@namebox@sp}{#1}%
+  \fi%
+  \ifx#2\empty\else%
+    \renewcommand{\ft@namebox@font}{#2}%
+  \fi%
+  \ifx#3\empty\else%
+    \setlength{\ft@namebox@maleline@sp}{#3}%
+  \fi%
+  \ifx#4\empty\else%
+    \setlength{\ft@namebox@maleline@length}{#4}%
+  \fi%
+}
+\ft@alias{nameboxcfg}
+%    \end{macrocode}
+%
+% \parag{Define a box}
+%
+% \DescribeMacro{\ft@name}
+%
+% Internally layouts |\ft@cmarkbox|, \meta{individual-name}, and
+% |\ft@malelinebox|.
+% It was difficult to set the length of |maleline|, ie. where to begin the
+% line. Which is better for the head of |maleline|, at the box end of the
+% \meta{individual-name} or at the box end including all the
+% \meta{title}, \meta{individual-name} and \meta{additional info}?
+%
+% The latter looks good, especially when the defined individual box is
+% used alone. But it makes hard for other box definitions to calculate the
+% extra line length to align equal.
+% For such calculation, the former is better since it just has to calculate
+% the difference of the length of names.
+% Finally, I decided to start the line at the end of
+% \meta{individual-name}, and the default length is
+% |\ft@namebox@maleline@length|.
+%
+% In other words, it can happen when an individual box is used alone, the
+% \meta{title} or the \meta{additional info} may be longer than |maleline|.
+%
+%    \begin{macrocode}
+\newif\ifft@maleline
+\newsavebox{\ft@malelinebox}
+\newsavebox{\ft@namebox}
+\newcommand{\ft@name}[3]{% box-name individual-name maleline-xlength
+  \setbox\@tempboxa=\hbox{\ft@namebox@font#2}%
+  \ft@len=\dimexpr\wd\@tempboxa + \ft@cmarkW%
+    + \ft@namebox@maleline@sp\relax%
+  \ft@namexdefstrip{#1nameX}{\ft@len}%
+  %
+  \ft@len=\dimexpr\wd\@tempboxa/2 + \ft@cmarkW\relax%
+  \ft@namexdefstrip{#1nameCX}{\ft@len}%
+  %
+  \def\@nm{\ft@namebox@font#2}%
+  \ifft@maleline%
+    % why are two 'relax'es necessary?
+    \@tempskipb=\dimexpr\ft@namebox@maleline@length%
+      - \ft@cmarkbox@length + #3\relax\relax%
+    \ifdim\@tempskipb>0pt%
+      \ft@cmarkdef{ft@malelinebox}{\ftbiological}{\@tempskipb}{0pt}%
+      \def\@nm{%
+        {\ft@namebox@font#2}%
+        \hspace{\ft@namebox@maleline@sp}%
+        \usebox{\ft@malelinebox}%
+      }%
+    \fi%
+  \fi%
+  \ft@dbgmsg{H \the\ht\@tempboxa, D \the\dp\@tempboxa}%
+  \ft@dbgmsg{H \the\ht\ft@cmarkbox, D \the\dp\ft@cmarkbox}%
+  \savebox{\ft@namebox}{%
+    \usebox{\ft@cmarkbox}%
+    \@nm%
+  }%
+  \ft@boxsz{\ft@namebox}{\ht\@tempboxa}{\dp\@tempboxa}%
+  \ft@dbgbox{\ft@namebox}%
+}
+%    \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \needspace{2\baselineskip}
+% \subsubsection{Title box}
+%
+% \parag{Customization}
+%
+% \hyphenation{line-stretch}
+% \DescribeMacro{\fttitleboxcfg}
+% \DescribeMacro{\titleboxcfg}
+%
+%    \begin{macrocode}
+\newlength{\ft@titlebox@indent}
+\setlength{\ft@titlebox@indent}{-.25\ft@unit}
+\newcommand{\ft@titlebox@font}{\relsize{-2}}%{\scriptsize}
+\newcommand{\ft@titlebox@linestretch}{.25}
+\newlength{\ft@titlebox@vsp}
+\setlength{\ft@titlebox@vsp}{.1\baselineskip}
+\newcommand{\fttitleboxcfg}[4]{% indent font linestretch vsp
+  \ifx#1\empty\else%
+    \setlength{\ft@titlebox@indent}{#1}%
+  \fi%
+  \ifx#2\empty\else%
+    \renewcommand{\ft@titlebox@font}{#2}%
+  \fi%
+  \ifx#3\empty\else%
+    \renewcommand{\ft@titlebox@linestretch}{#3}%
+  \fi%
+  \ifx#4\empty\else%
+    \setlength{\ft@titlebox@vsp}{#4}%
+  \fi%
+}
+\ft@alias{titleboxcfg}
+%    \end{macrocode}
+%
+% \parag{Define a box}
+%
+% \DescribeMacro{\ft@title}
+%
+%    \begin{macrocode}
+\newsavebox{\ft@titlebox}
+\newcommand{\ft@title}[1]{% title
+  \ft@len=\dimexpr\ft@cmarkW + \ft@titlebox@indent\relax%
+  \savebox{\ft@titlebox}{%
+    \vbox{%
+      \def\baselinestretch{\ft@titlebox@linestretch}%
+      \ft@titlebox@font%
+      %
+      \setbox\@tempboxa=\hbox{#1}%
+      \ft@dbgmsg{H \the\ht\@tempboxa, D \the\dp\@tempboxa}%
+      \global\ft@depth=\dp\@tempboxa%
+      \hbox{\hspace{\ft@len}#1}%
+      \vspace{\ft@titlebox@vsp}%
+      \global\advance\ft@depth \ft@titlebox@vsp%
+    }%
+  }%
+  \ft@dbgmsg{H \the\ht\ft@titlebox, D \the\dp\ft@titlebox}%
+  \ft@len=\dimexpr\ht\ft@titlebox + \dp\ft@titlebox - \ft@depth\relax%
+  \ft@boxsz{\ft@titlebox}{\ft@len}{\ft@depth}%
+  \ft@dbgbox{\ft@titlebox}%
+}
+%    \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsubsection{Combine the boxes --- core}
+%
+% \parag{Generate the boxes}
+%
+% \DescribeMacro{\ft@indvdlbox@gen}
+% \NoDescription
+%    \begin{macrocode}
+\newcommand{\ft@indvdlbox@gen}[4]{%
+  % box-name title individual-name maleline-xlength
+  \ft@width=0pt%
+  \IfValueT{#2}{%
+      \ft@title{#2}%
+      \ft@width=\wd\ft@titlebox%
+  }%
+  \global\@tempswafalse%
+  \ifx\ft@indvdl@opts\empty\else%
+    \global\@tempswatrue%
+    \ft@opt{\ft@indvdl@opts}%
+    \ifdim\ft@width<\wd\ft@optbox%
+      \ft@width=\wd\ft@optbox%
+    \fi%
+  \fi%
+  \ft@name{#1}{#3}{#4}%
+}
+%    \end{macrocode}
+%
+% \parag{Calculate the size of a name box}
+%
+% \DescribeMacro{\ft@indvdlbox@calc}
+% \NoDescription
+%    \begin{macrocode}
+\newcommand{\ft@indvdlbox@calc}[2]{% box-name title
+  \global\ft@width=0pt%
+  \global\ft@height=0pt%
+  \global\ft@depth=0pt%
+  \def\ft@dpri##1{\ft@dbgmsg{##1 W \the\ft@width, H \the\ft@height,%
+      D \the\ft@depth}}%
+  \ft@dpri{h0}%
+  \IfValueT{#2}{%
+    \global\ft@width=\wd\ft@titlebox%
+    \global\ft@height=\dimexpr\ht\ft@titlebox + \dp\ft@titlebox\relax%
+    \ft@dpri{h1}%
+  }%
+  %
+  \global\advance\ft@height \ht\ft@namebox%
+  %
+  % mark this point of the height, to invert it later
+  \ft@y=\dimexpr\ft@height - \ft@indvdl@nameCY\relax%
+  %
+  \ifdim\ft@width<\wd\ft@namebox%
+    \global\ft@width=\wd\ft@namebox%
+  \fi%
+  \if@tempswa%
+    \global\advance\ft@height \dp\ft@namebox%
+  \else%
+    \global\ft@depth=\dp\ft@namebox%
+  \fi%
+  \ft@dpri{h2}%
+  %
+  \if@tempswa%
+    \ifdim\ft@width<\wd\ft@optbox%
+      \global\ft@width=\wd\ft@optbox%
+    \fi%
+    \global\advance\ft@height \ht\ft@optbox%
+    \global\ft@depth=\dp\ft@optbox%
+    \ft@dpri{h3}%
+  \fi%
+  \ft@dpri{h4}%
+  %
+  % invert the y
+  \ft@len=\dimexpr\ft@height - \ft@y\relax%
+  \ft@namexdefstrip{#1nameCY}{\ft@len}%
+}
+%    \end{macrocode}
+%
+% \parag{Layout them by \texttt{picture}}
+%
+% \DescribeMacro{\ft@indvdlbox@layout}
+% \NoDescription
+%    \begin{macrocode}
+\newcommand{\ft@indvdlbox@layout}[2]{% box-name title
+  \ft@newnamebox{#1}{%
+    \edef\@w{\strip@pt\ft@width}%
+    \edef\@h{\strip@pt\ft@height}%
+    \begin{picture}(\@w,\@h)%
+      \ft@dbgframe{\@w,\@h}%
+      \ft@dbgplot{0,\@nameuse{#1nameCY}}%
+      %
+      \IfValueT{#2}{%
+        \advance\ft@height -\dimexpr\ht\ft@titlebox%
+          + \dp\ft@titlebox\relax%
+        \put(0,\strip@pt\ft@height){\usebox{\ft@titlebox}}%
+      }%
+      \advance\ft@height -\ht\ft@namebox%
+      \put(0,\strip@pt\ft@height){\usebox{\ft@namebox}}%
+      \advance\ft@height -\dp\ft@namebox%
+      \if@tempswa%
+        \advance\ft@height -\ht\ft@optbox%
+        \put(0,\strip@pt\ft@height){\usebox{\ft@optbox}}%
+      \fi%
+    \end{picture}%
+  }%
+  % height should hold the original value
+  \ft@nameboxsz{#1}{\ft@height}{\ft@depth}%
+}
+%    \end{macrocode}
+%
+% \parag{Main function to combine the boxes}
+%
+% \DescribeMacro{\ft@indvdlbox}
+% \NoDescription
+%    \begin{macrocode}
+\newcommand{\ft@indvdlbox}[4]{%
+  % box-name title individual-name  maleline-xlength
+  \ft@indvdlbox@gen{#1}{#2}{#3}{#4}%
+  \ft@indvdlbox@calc{#1}{#2}%
+  \ft@indvdlbox@layout{#1}{#2}%
+  %
+  \ft@dbgbox[\ft@dbgplot{0,\@nameuse{#1nameCY}}%
+    \ft@dbgplot{\@nameuse{#1nameCX},\strip@pt\ft@height}%
+    \ft@dbgplot{\@nameuse{#1nameX},\strip@pt\ft@height}%
+  ]{\@nameuse{#1}}%
+}
+%    \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \subsubsection{Individual box --- interface}
+%
+% \DescribeMacro{\ftindvdldef}
+% \DescribeMacro{\indvdldef}
+%
+%    \begin{macrocode}
+% [child-mark] box-name [title] individual-name
+%       [option-list...] [maleline-xlength]
+\NewDocumentCommand{\ftindvdldef}{O{\ftbiological}momoO{0pt}}{%
+  \setbox\@tempboxa=\hbox{\ft@namebox@font#4}%
+  \global\ft@indvdl@nameH=\ht\@tempboxa%
+  \global\ft@indvdl@nameD=\dp\@tempboxa%
+  \if@tate%
+    \global\ft@indvdl@nameCY%
+      =\dimexpr(\ft@indvdl@nameH - \ft@indvdl@nameD)/2\relax%
+  \else%
+    \@ifundefined{jlreqsetup}{%
+      % not jlreq
+      \global\ft@indvdl@nameCY=\dimexpr(\ft@indvdl@nameH%
+        - \ft@indvdl@nameD) / 2\relax\relax%
+    }{%
+      % jlreq
+      % magic number! depends on font?
+      \global\ft@indvdl@nameCY=\dimexpr\ft@indvdl@nameH/2 - .66pt\relax%
+    }%
+  \fi%
+  \ft@dbgmsg{H \the\ft@indvdl@nameH, D \the\ft@indvdl@nameD,%
+    CY \the\ft@indvdl@nameCY}%
+  %
+  \ft@cmarkdef{ft@cmarkbox}{#1}{0pt}{\ft@namebox@sp}%
+  \ifcase#1% fttop
+    \ft@namexdef{#2hascmark}{#1}%
+  \or% ftbiological
+    \ft@namexdef{#2hascmark}{#1}%
+  \or% ftadopted
+    \ft@namexdef{#2hascmark}{#1}%
+  \fi%
+  \global\ft@cmarkW=\wd\ft@cmarkbox%
+  %
+  \global\ft@malelinefalse%
+  \xdef\ft@indvdl@opts{}%
+  \IfValueT{#5}{%
+    \ft@optlist{\ft@indvdl@opts}{#2}{#5}%
+    \ft@dbgmsg{opt \ft@indvdl@opts}%
+  }%
+  %
+  \ft@indvdlbox{#2}{#3}{#4}{#6}%
+}
+\ft@alias{indvdldef}
+%    \end{macrocode}
-- 
cgit v1.2.3

