% \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{Marriage Box (\texttt{ft-marriage.dtx})} % % \DescribeMacro{\mrrgdef} % \cmd{\mrrgdef % \marg{new box name} % \marg{spouse list A} % \marg{oneself} % \marg{spouse list B} % \oarg{childline xlength} % } % \medskip % % Defines a marriage box with a specified name \meta{new box name}. % To support remarrying and the concubines, the spouses are specified by % a list. The element of the list is a box name defined by |\indvdldef|. % \meta{spouse list A} is placed upper side of \meta{oneself}, and % \meta{spouse list B} is lower side. % All box names are NOT \CS{} (no backslash). % \smallskip % % Aligns them in the same column, and connects them by a double line if the % marriage is official. If the marriage is not official (|\private| % attribute), uses a dashed double line. % Those double line is placed at the center of the length of the name of % \meta{oneself}. % \smallskip % % If a spouse has a child (|\haschild| attribute), % then the line to their child is drawn from the center of the % double line. % \smallskip % % Like |\sblngdef|, the interval box can be inserted if you want more % spaces. % \bigskip % % Like |\indvdldef|, some connection points are defined. Their origin % is left-bottom of the box and the unit is |pt|. % % \begin{itemize} % \item \meta{box name}|nameCY| % % the center of the height of the name of \meta{oneself} % % \item \meta{box name}\meta{individual box name}|nameCY| % % the center of the height of the name of who has any child-mark % % \item \meta{box name}\meta{individual box name}|mrrgCY| % % the center of the double line when any spouse has |\haschild| attribute % \end{itemize} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Customization} % % \DescribeMacro{\mrrgboxcfg} % \cmd{\mrrgboxcfg % \marg{space between two lines} % \marg{space between name and the line} % \marg{line length} % } % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \clearpage % \subsection{Example} % % \begin{enumerate} % \item % \srcfig{fig4Robert} % % \clearpage % \item % \srcfig{fig4HenryVIII} % \end{enumerate} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Layout and connecting in a same generation} % % It is not a good idea to put everything in a single family tree. % % For example, see King Henry VIII and his wives. Catherine of Aragon, % his first wife was actually a wife of Henry's brother, Arthur. If we % put King's siblings to this tree, how would it be looked? It's just % ugly and hard to understand in a glance. Let's think more using an % example from \refnm{sec:Lily1} again. % % How can we represent the Petunia -- Lily sisters tree including their husbands. % As a first step, define two marriage boxes, and then define the % sibling box. % \medskip % % \srcfig{fig4Lily1} % \medskip % % Why is this tree so ugly? There are three points to consider. % \begin{enumerate} % \item The position of two double lines differ from each other. % \item The length of a line to their child differs too. If we connected % the child, the ugliness would be improved. % \item James interrupts into between Petunia and Lily. It makes the % understandability worse. % \end{enumerate} % % On fixing the first point, the position of the double line, the second % point will be fixed automatically. % The solution is the one already suggested in \refnm{sec:Lily1}, set % the width of Lily box to Petunia's. % For the third point, the position of James, how about expanding the % space as a first step? % \medskip % % \srcfig{fig4Lily2} % \medskip % % Even spreading the space wider, James is still interrupting those two % sisters. Does it look better? % If we want more, the last way is to switch the position of James and Lily. % \medskip % % \srcfig{fig4Lily3} % \medskip % % Moreover spreading the blank is a good option. % \medskip % % \srcfig{fig4Lily4} % \medskip % % Is this best looking? % The easiness of looking is subject to one's opinion or taste. % Personally I feel resistance in the order of husband and wife. But also I % admit that as long as the main purpose of this tree is to represent those % sisters, this position of James is not bad. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsectImpl % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \parag{Customization} % % \DescribeMacro{\ftmrrgboxcfg} % \DescribeMacro{\mrrgboxcfg} % % \begin{macrocode} \newlength{\ft@mrrgline@sep} \setlength{\ft@mrrgline@sep}{4pt} \newlength{\ft@mrrgline@sp} \setlength{\ft@mrrgline@sp}{.5\ft@unit} \newlength{\ft@mrrgline@length} \setlength{\ft@mrrgline@length}{1.5\ft@unit} \newcommand{\ftmrrgboxcfg}[3]{% sep space length \ifx#1\empty\else% \setlength{\ft@mrrgline@sep}{#1}% \fi% \ifx#2\empty\else% \setlength{\ft@mrrgline@sp}{#2}% \fi% \ifx#3\empty\else% \setlength{\ft@mrrgline@length}{#3}% \fi% } \ft@alias{mrrgboxcfg} % \end{macrocode} % % \parag{Parsing} % % \begin{macrocode} \newcommand{\ft@mrrg@parse}[1]{% spouse-list \global\ft@height=0pt% \global\ft@width=0pt% \global\ft@box@has@malelinefalse% \@for\@temptokena:=#1\do{% \ifx\@temptokena\empty\else% \xdef\ft@spouse{\@temptokena}% \@ifundefined{\@temptokena ival}{% \@ifundefined{\ft@spouse haschild}{}{% \global\ft@box@has@malelinetrue% }% \setlength{\ft@len}{\wd\@nameuse{\ft@spouse}}% \ifdim\ft@width<\ft@len% \global\ft@width=\ft@len% \fi% \ft@dbgmsg{\ft@spouse, W \the\wd\@nameuse{\ft@spouse},% H \the\ht\@nameuse{\ft@spouse},% D \the\dp\@nameuse{\ft@spouse}}% \global\advance\ft@height \dimexpr\ft@mrrgline@length% + 2\ft@mrrgline@sp\relax% \ft@dbgmsg{\ft@spouse, H \the\ft@height}% }{}% \global\advance\ft@height \dimexpr\ht\@nameuse{\ft@spouse}% + \dp\@nameuse{\ft@spouse}\relax% \ft@dbgmsg{\ft@spouse, h H \the\ft@height}% \fi% }% % \ifft@box@has@maleline% \global\advance\ft@width \ft@namebox@maleline@length% \fi% % \global\ft@depth=\dp\@nameuse{\ft@spouse}% \global\advance\ft@height \dimexpr -2\ft@mrrgline@sp% - \ft@mrrgline@length - \ft@depth\relax% \ft@dbgmsg{final H \the\ft@height, D \the\ft@depth}% } % \end{macrocode} % % \parag{The double line} % % \DescribeMacro{\ft@mrrg@line} % % \begin{macrocode} \newlength{\ft@mrrg@chlen} \newcommand{\ft@mrrg@line}[5]{% box-name spouse cx sp length \ft@x=#3% \global\advance\ft@height -#4% \@tempskipb=\dimexpr\ft@mrrgline@sep/2\relax% \edef\@y{\strip@pt\ft@height}% \@ifundefined{#2private}{% \ft@len=#5\relax% \edef\@l{\strip@pt\ft@len}% \put(\strip@pt\dimexpr\ft@x - \@tempskipb, \@y){\line(0,-1){\@l}}% \put(\strip@pt\dimexpr\ft@x + \@tempskipb, \@y){\line(0,-1){\@l}}% }{% % this divisor should match the delta_y for multiput \ft@len=#5\relax% \ft@len=\dimexpr\ft@len/2 + .5pt\relax% \@tempcnta=\dimexpr\ft@len/65536\relax% \multiput(\strip@pt\dimexpr\ft@x - \@tempskipb, \@y)% (0,-2){\@tempcnta}{\line(0,-1){.5}}% \multiput(\strip@pt\dimexpr\ft@x + \@tempskipb, \@y)% (0,-2){\@tempcnta}{\line(0,-1){.5}}% }% \@ifundefined{#2haschild}{}{% \ft@len=#5\relax% \ft@y=\dimexpr\ft@height - \ft@len/2\relax% \put(\strip@pt\dimexpr\ft@x + \@tempskipb,\strip@pt\ft@y)% {\line(1,0){\strip@pt\ft@mrrg@chlen}}% \ft@dbgplot{\strip@pt\ft@x,\strip@pt\ft@y}% \ft@namexdefstrip{#1#2mrrgCY}{\ft@y}% }% \ft@len=#5\relax% \@tempskipa=#4\relax% \global\advance\ft@height \dimexpr -\ft@len - \@tempskipa\relax% \ft@dbgmsg{line #2 H \the\ft@height}% } % \end{macrocode} % % \parag{Layout the names} % % \DescribeMacro{\ft@mrrg@name} % % \begin{macrocode} \newcommand{\ft@mrrg@name}[2]{% box-name individual-name \global\advance\ft@height -\ht\@nameuse{#2}% \put(0,\strip@pt\ft@height){\usebox{\@nameuse{#2}}}% \ft@dbgframe[0,\strip@pt\ft@height]% {\strip@pt\wd\@nameuse{#2},\strip@pt\ht\@nameuse{#2}}% % \@ifundefined{#2hasmaleline}{}{% \ft@x=\@nameuse{#2nameX}pt% \ft@y=\dimexpr\ft@height + \@nameuse{#2nameCY}pt\relax% \ft@len=\dimexpr\ft@width - \@nameuse{#2nameX}pt% %- \ft@namebox@maleline@sp% \relax% \put(\strip@pt\ft@x,\strip@pt\ft@y){\line(1,0){\strip@pt\ft@len}}% \ft@namexdefstrip{#1#2nameCY}{\ft@y}% }% % \@ifundefined{#2hascmark}{}{% \ft@len=\dimexpr\ft@height + \@nameuse{#2nameCY}pt\relax% \ft@namexdefstrip{#1#2nameCY}{\ft@len}% \ft@dbgplot{0,\strip@pt\ft@len}% }% \global\advance\ft@height -\dp\@nameuse{#2}% \ft@dbgmsg{name #2 H \the\ft@height}% } % \end{macrocode} % % \subsubsection{Layout and connect the individuals --- core} % % \DescribeMacro{\ft@mrrg@spouse} % % \begin{macrocode} \newlength{\ft@mrrg@ival} \newcommand{\ft@mrrg@spouse}[2]{% box-name list \global\ft@mrrg@ival=0pt% \@for\@temptokena:=#2\do{% \@ifundefined{\@temptokena ival}{% \@tempskipa=\dimexpr\ft@mrrgline@length + \ft@mrrg@ival\relax% \if@tempswa% \ft@mrrg@name{#1}{\@temptokena}% \ft@mrrg@line{#1}{\@temptokena}{\ft@xx}{\ft@mrrgline@sp}% {\@tempskipa}% \else% \ft@mrrg@line{#1}{\@temptokena}{\ft@xx}{\ft@mrrgline@sp}% {\@tempskipa}% \ft@mrrg@name{#1}{\@temptokena}% \fi% \global\ft@mrrg@ival=0pt% }{% \global\advance\ft@mrrg@ival% \dimexpr\ht\@nameuse{\@temptokena}% + \dp\@nameuse{\@temptokena}\relax% }% }% } % \end{macrocode} % % \subsubsection{Marriage box --- interface} % % \DescribeMacro{\ftmrrgdef} % \DescribeMacro{\mrrgdef} % % \begin{macrocode} \NewDocumentCommand{\ftmrrgdef}{mmmmO{0pt}}{% % box-name spouse-listA oneself spouse-listB [xline] \ft@xx=\@nameuse{#3nameCX}pt\relax% \ft@mrrg@parse{#2,#3,#4}% % \advance\ft@width #5% \global\ft@mrrg@chlen=\dimexpr\ft@width - \ft@xx% - \ft@mrrgline@sep/2\relax% % \ft@theight=\ft@height% \ft@newnamebox{#1}{% \edef\@w{\strip@pt\ft@width}% \edef\@h{\strip@pt\ft@height}% \begin{picture}(\@w,\@h)% \ft@dbgframe{\@w,\@h}% % \ifx#2\@nil\else% \@tempswatrue% \ft@mrrg@spouse{#1}{#2}% \fi% % \ft@mrrg@name{#1}{#3}% \@ifundefined{#1#3nameCY}{}{% \ft@len=\@nameuse{#1#3nameCY}pt\relax% \ft@dbgplot{1,\strip@pt\ft@len}% \ft@namexdefstrip{#1nameCY}{\ft@len}% }% \@ifundefined{#3hascmark}{}{% \ft@namexdef{#1hascmark}{\@nameuse{#3hascmark}}% }% % \ifx#4\empty\else% \@tempswafalse% \ft@mrrg@spouse{#1}{#4}% \fi% \end{picture}% }% \ft@nameboxsz{#1}{\ft@theight}{\ft@depth}% } \ft@alias{mrrgdef} % \end{macrocode}