随着我的第一个孙子即将出生,我正试图用乳胶写一本书来记录两代人的家族史研究(我的和我父亲的)。书中有数百个名字,可以追溯到大约 9 代。使用家庭组表是一种简洁的方式来呈现整个家庭——父母和孩子。互联网上有很多例子,如 pdf、MS Word 和 Excel 文档,但没有一个是乳胶的。
在有人询问之前,我已经找到了 genealogytree 包(https://ctan.org/pkg/genealogytree) 并打算使用它,但它不生成家庭组表。
我以前没用过 latex,所以还有很多东西要学。看来 tabularray 包是可行的。非常感谢 Jianrui Lyu 创建了它,也感谢那些提问的人,这使他能够为其他人提供有用的答案。
这是我的第一篇文章,所以我可能在某处犯了一些错误。我把它放在正确的地方了吗?它应该放在其他地方吗?
我注意到有人问了有关 Latex 中的家庭组表的问题,但没有得到满意的答案。因此,我开始创建自己的。这是我目前所拥有的:
\documentclass{article}
\usepackage[left=1.5cm,right=1.5cm]{geometry}
\usepackage{tabularray}
\UseTblrLibrary{booktabs}
\begin{document}
\begin{table}
\footnotesize
\caption{Family Group Sheet}
\begin{tblr}{width=1\linewidth,hspan=minimal,
colspec={
|X[c,m,0.3cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,0.9cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,3cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,1.2cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,3cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,1.2cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,3cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,1.2cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,3cm,leftsep=1.5pt,rightsep=1.5pt]
|}}
\hline
\SetCell[c=2]{c}\normalsize \textbf{Husband} & 1-2 & \SetCell[c=3]{l} name & 1-4 & 1-5 & \normalsize \textbf{Wife} & \SetCell[c=3]{l} name &x&x \\ \hline
\SetCell[c=2]{l} \textbf{Birth} &x& date & \textbf{Place} & where & \textbf{Birth} & date & \textbf{Place} & where \\ \hline
\SetCell[c=2]{l} \textbf{Military} &x& \SetCell[c=3]{} what &x&& \textbf{Marr.} & date & \textbf{Place} & where \\ \hline
\SetCell[c=2]{l} \textbf{Death} & x & date & \textbf{Place} & where & \textbf{Death} & date & \textbf{Place} & where \\ \hline
\SetCell[c=2]{l} \textbf{Burial} & x & date & \textbf{Place} & where & \textbf{Burial} & date & \textbf{Place} & where \\ \hline
\SetCell[c=2]{l} \textbf{Father} & x & date & \textbf{Mother} & where & \textbf{Father} & date & \textbf{Mother} & where \\ \hline
\hline
\SetCell[c=5]{h,l}\SetRow{12ex}\normalsize \textbf{Notes} \footnotesize {\\Write here, } & 7-2 & 7-3 & 7-4 & 7-5 & \SetCell[c=4]{h,l} \normalsize \textbf{Notes} \footnotesize {\\Here} & 7-7 & 7-8 & 7-9 \\ \hline
%DO NOT EDIT NEXT LINE
\SetCell[c=3]{c}\textbf{Children} & 8-2 & 8-3 & \SetCell[c=2]{c}\textbf{Birth} & 8-5 & \SetCell[c=2]{c}\textbf{Marriage} & 8-7 & \SetCell[c=2]{c} \textbf{Death and Burial} & 8-9 \\ \hline% DO NOT EDIT THIS LINE
1 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
2 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
3 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
4 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
5 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
6 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
7 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
8 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
9 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
10 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
\SetCell[c=9]{l}\textbf{Additional Notes}\footnotesize {\\Write here} & ~ & ~ & ~ & ~ & ~ & ~ & ~ & ~ \\ \hline
\end{tblr}
\end{table}
\end{document}
此代码没有版权,因此如果有人发现它有用,欢迎使用。如果有人改进它,请告诉我。
我无法让表格定义的新界面工作 - 很可能是因为我不理解语法,或者括号不够。也可能是我使用的 openSUSE Tumbleweed 软件包不是最新的。hspan=minimal 是必需的,以便让 Notes 跨越单元格以允许文本换行,并扩展行高。如果没有它,列就会被拉伸,表格的右侧就会超出纸张范围。
还请注意,注释单元格中的文本使用括号括起来。换行符 \ 会断行之内单元格,而不是换到新的一行。
我希望了解如何使用 booktabs,更好地格式化 hlines 和 vlines,这就是为什么它在此代码中加载但尚未使用(尚未!)
我认为还需要做更多工作。如果有人想接手,请随意。我建议如下:
很容易在错误的地方进行编辑,从而搞乱整个事情。改进数据输入以尽量减少这种可能性是可取的,但我不会费心去做。
整理代码,使其更适合新接口方法。同样,这对我来说很有效,所以我将保持原样。
让它看起来更好——也许是不同的字体,或者不同的水平和垂直线。
将其转换为文档类?也许对使用它感兴趣的人太少了,不值得付出努力。我没有所需的技能。
启用不同 FGS 之间的交叉引用 - 一个家族的孩子是另一个家族的父母。包含类似“参见表 XX”的内容会很有用。但是,我认为从表内部进行交叉引用是有问题的。
我会关注这个帖子,以防有人决定发表评论,但是现在我有了一个工作模板,我会专注于写书,而不是页面布局!
编辑 2022 年 6 月 14 日
我已将此家庭组表添加为 github 上的项目:
https://github.com/wortle/fhs_standalone
再次感谢 MS-SPO 和 LJR 的贡献。
编辑 2022 年 6 月 19 日
进一步讨论数据输入和数据库。家谱数据数据库的设计是一个棘手的问题,经过多年与经验比我丰富的人之间的争论,这个问题仍然没有得到令人满意的答案。尽管对 GEDCOM 的批评有很多有据可查的,但它仍然没有被取代,并且是事实上的标准。每个家谱软件包似乎都使用自己的数据库模式。但是,它们都能够以 GEDCOM 格式导出数据。
我确信有人可以编写脚本来解析 GEDCOM 文件并批量生成家庭历史表。Sed、awk、perl?也可以在 LuaTeX 中执行此操作(请参阅问题 97822)。这超出了我的能力范围。我没有要求任何人这样做:只是指出一些可能性。
答案1
还没有解决方案,但要说的已经太多了,无法作为评论发表。一些观察、回答和建议。
战略
我建议的策略是:先写,然后再考虑布局(Q3)。看起来你的图书项目已经相当大了。所以,如果你使用图书类,你的许多布局问题可能已经得到解决。谁知道呢,也许你以后会喜欢预定义的结果?
但是,你应该尽早决定要使用的表格工具,例如在决定之前尝试不同的场景。ctan 上有许多可用的表格包(https://www.ctan.org/topic/table),有些过时,有些不错。无论您的选择是什么,您可能都不会再将其重写到不同的包中。因此,花一些时间考虑各种场景并测试不同的表,包括tikz
可能的情况。
数据处理
与您的问题 1 相关的是:从数据的角度来看,您有一个典型的关系数据库应用程序。即,您会想出一组多功能的表格及其之间的关系,这将处理 99% 的家庭数据情况。
接下来,您可以查询任何您想要查找的内容。通过一些额外的工作,您可以使用这些查询结果并将其输出为 Latex 源代码以供进一步处理,见下文。
例如,某些查询可以为您提供有关丈夫、妻子(包括注释)和孩子的数据。根据这些数据,您可以使用数据库功能构建乳胶代码(即让它逐对生成您发布的代码)。
没有更好的方法来避免海量数据集中的错误(Q1)。
包genealogy
中提到并使用了“数据库”,但快速查看并不能确保它是关系型数据库。这意味着:您可能无法生成查询,这将对您的项目造成严重限制。
反过来,单独的数据库也可以查询并生成可以与家谱包一起重复使用的格式。想想用不同的方式来呈现查询结果,用一些额外的代码“装饰”。
Q4,文档类
我建议初学者不要这么做。只要用编辑器检查一些文档类,或者阅读许多软件包手册中的长篇实现文档,你就会很容易明白为什么。
交叉引用 Q5
varioref 包可以帮你完成这个任务(https://mirror.marwan.ma/ctan/macros/latex/required/tools/varioref.pdf)下面我将向您展示一个例子。
书籍示例“我们的大家庭”
请参阅下面的一些屏幕截图和代码。
实际考虑
一种广泛使用的方法是拥有一种框架 .tex 文件,从文档类开始,包括所需的所有包等等,详细的章节等。
在相对较短的文档中,您也可以在此处编写所有内容。但是,一段时间后,导航可能会变得困难。因此,一种常见的方法是将 latex 代码(例如章节内容)移到单独的文件中,并将\include
其放入框架中。这种方法效果很好。
但是 Latex 擅长排版,这是从想法到纸质文件(或 pdf)的最后步骤,在这之前是写作的过程,包括研究、草拟、试验、更改顺序、审查、部分从头开始等等。
目前支持这种写作过程(将想法转换成文本,不受任何布局限制)的工具并不多。文字处理器不提供这些无布局方法。您可以拥有的用于此目的的最佳工具是(没有任何广告)Scrivener(本文是使用它进行草拟和完善的)。
尽管 Scrivener 可以导出到 Latex,但这种导出会产生复杂的代码。反过来,在写作时随时包含一些所需的 Latex 代码就相当容易了。(编译、复制到 Latex 工具,再编译,你就有了一个书本版本)。
顺便说一句,这本书也是用 Scrivener 设计的,并用 TexMaker 处理。这就是为什么我能承受一个很长的 .tex 文件,因为我在 Scrivener 中进行导航、重组、更改等。
Scrivener 中的写作过程是什么样的?请认清其varioref
用途,它被封装在一个可以减轻写作痛苦的\newcommand
调用中:\tbl
基本书籍的截图拼贴,包括genealogytree
和您的表格。链接仍然由红色框呈现,但可以设为不可见。
\documentclass[12pt]{book}
%\usepackage[T1]{fontenc}
%\usepackage[latin1]{inputenc}
\usepackage{babel}
\usepackage[all]{genealogytree}
\usepackage{tabularray}
\usepackage[english]{varioref}
% ~~~ referencing tables ~~~~~~~~~~~~
\newcommand\tbl[1]{
table \vref{tbl:#1}
}
% ~~~ data to be included in the document properties ~~~
\usepackage[pdftitle={Our huge Family},
pdfauthor={Bill Berry},
pdfkeywords={key1, key2 key 3}]{hyperref}
\usepackage{makeidx}
\makeindex
% ~~~ cmd: makeindex Iridium.idx ~~~
\begin{document}
\title{Our huge Family}
\author{Bill Berry}
\maketitle
\tableofcontents
\chapter{Introduction}\label{intro}
Have a look at the Family Group Tree in \tbl{FGT}.% <<<<< here's a ref
Lorem ipsum dolor sit amet consectetuer eget nulla mollis aliquam urna. Enim egestas augue Phasellus In parturient porttitor nibh Aliquam ut nibh. Vitae ante vel Morbi leo platea Pellentesque sit Sed interdum Quisque.
Et Curabitur habitant Vivamus a nibh pulvinar et id tempor condimentum. Et metus semper id urna purus est ut eget penatibus risus. Turpis eleifend elit ligula Phasellus.
Dolor lorem semper felis tincidunt et massa eget nulla Morbi ridiculus. At lorem sit ipsum turpis platea pede justo Vestibulum ante lobortis. Dolor Vivamus senectus dui.
Sit justo sem faucibus wisi ligula vel est neque tincidunt elit. Praesent libero augue felis nibh Aenean Curabitur lacus vitae semper Curabitur. Cursus at ac Pellentesque elit id tristique enim.
At ligula vitae Suspendisse vel tempus et Morbi tincidunt Aenean ipsum. Porttitor neque dictumst habitasse In ligula mauris quis wisi quis et. Tempor at gravida sed laoreet interdum velit tempus elit.
\chapter{}
\section{What readers should know}
Dolor lorem semper felis tincidunt et massa eget nulla Morbi ridiculus. At lorem sit ipsum turpis platea pede justo Vestibulum ante lobortis. Dolor Vivamus senectus dui.
Sit justo sem faucibus wisi ligula vel est neque tincidunt elit. Praesent libero augue felis nibh Aenean Curabitur lacus vitae semper Curabitur. Cursus at ac Pellentesque elit id tristique enim.
\section{Other things to say}
Dolor lorem semper felis tincidunt et massa eget nulla Morbi ridiculus. At lorem sit ipsum turpis platea pede justo Vestibulum ante lobortis. Dolor Vivamus senectus dui.
Sit justo sem faucibus wisi ligula vel est neque tincidunt elit. Praesent libero augue felis nibh Aenean Curabitur lacus vitae semper Curabitur. Cursus at ac Pellentesque elit id tristique enim.
\section{Genealogy}
Example from the genealogy package:
\begin{tikzpicture}
\genealogytree{
parent{
g{first child}
c{second child}
c{third child}
p{father}
p{mother}
}
}
\end{tikzpicture}
\section{Family Group Sheet}\label{tbl:FGT}
\begin{table}
\footnotesize
\caption{Family Group Sheet}
\begin{tblr}{width=1\linewidth,hspan=minimal,
colspec={
|X[c,m,0.3cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,0.9cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,3cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,1.2cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,3cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,1.2cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,3cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,1.2cm,leftsep=1.5pt,rightsep=1.5pt]
|X[l,m,3cm,leftsep=1.5pt,rightsep=1.5pt]
|}}
\hline
\SetCell[c=2]{c}\normalsize \textbf{Husband} & 1-2 & \SetCell[c=3]{l} Bill Berry & 1-4 & 1-5 & \normalsize \textbf{Wife} & \SetCell[c=3]{l} see \vref{intro} &x&x \\ \hline
\SetCell[c=2]{l} \textbf{Birth} &x& date & \textbf{Place} & where & \textbf{Birth} & date & \textbf{Place} & where \\ \hline% <<< column wife has a ref
\SetCell[c=2]{l} \textbf{Military} &x& \SetCell[c=3]{} what &x&& \textbf{Marr.} & date & \textbf{Place} & where \\ \hline
\SetCell[c=2]{l} \textbf{Death} & x & date & \textbf{Place} & where & \textbf{Death} & date & \textbf{Place} & where \\ \hline
\SetCell[c=2]{l} \textbf{Burial} & x & date & \textbf{Place} & where & \textbf{Burial} & date & \textbf{Place} & where \\ \hline
\SetCell[c=2]{l} \textbf{Father} & x & date & \textbf{Mother} & where & \textbf{Father} & date & \textbf{Mother} & where \\ \hline
\hline
\SetCell[c=5]{h,l}\SetRow{12ex}\normalsize \textbf{Notes} \footnotesize {\\Write here, } & 7-2 & 7-3 & 7-4 & 7-5 & \SetCell[c=4]{h,l} \normalsize \textbf{Notes} \footnotesize {\\Here} & 7-7 & 7-8 & 7-9 \\ \hline
%DO NOT EDIT NEXT LINE
\SetCell[c=3]{c}\textbf{Children} & 8-2 & 8-3 & \SetCell[c=2]{c}\textbf{Birth} & 8-5 & \SetCell[c=2]{c}\textbf{Marriage} & 8-7 & \SetCell[c=2]{c} \textbf{Death and Burial} & 8-9 \\ \hline% DO NOT EDIT THIS LINE
1 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
2 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
3 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
4 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
5 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
6 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
7 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
8 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
9 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
10 & \SetCell[c=2]{l} name &x& \SetCell[c=2]{l} date & 9-5 & \SetCell[c=2]{l} date & 9-7 &\SetCell[c=2]{l} date & 9-9 \\ \hline
\SetCell[c=9]{l}\textbf{Additional Notes}\footnotesize {\\Write here} & ~ & ~ & ~ & ~ & ~ & ~ & ~ & ~ \\ \hline
\end{tblr}
\end{table}
\newpage
\printindex
\end{document}
附言:代码已准备好处理\index{}
条目,但目前尚未设置任何条目。
答案2
这个答案将演示如何重写tabularray
表从“旧接口”到“新接口”。
备注:在 中tabularray
,一Q
列有宽度,而一X
列只有系数。因此写 是错误的X[l,m,3cm]
,必须将其改为Q[l,m,3cm]
或X[l,m,3]
。
\documentclass{article}
\usepackage[left=1.5cm,right=1.5cm]{geometry}
\usepackage{tabularray}
\begin{document}
\begin{table}[!htbp]
\footnotesize
\caption{Family Group Sheet}
\begin{tblr}{hspan=minimal,colsep=1.5pt,
colspec={|Q[c,m,0.3cm]|Q[l,m,1.2cm]|X[l,m]|Q[l,m]|X[l,m]|Q[l,m]|X[l,m]|Q[l,m]|X[l,m]|},
%% multicolumn cells:
cell{1}{1} = {c=2}{l},
cell{1}{3,7} = {c=3}{l},
cell{2-6}{1} = {c=2}{l},
cell{3}{3} = {c=3}{l},
cell{7,8}{1} = {c=5}{h,l},
cell{7,8}{6} = {c=4}{h},
cell{9}{1} = {c=3}{c},
cell{9}{4,6,8} = {c=2}{c},
cell{10-X}{even} = {c=2}{l},
cell{Y,Z}{1} = {c=9}{l},
%% cell and row styles:
cell{1-6}{1,4,6,8} = {font=\bfseries},
cell{1}{1,6} = {font=\normalsize\bfseries},
row{7} = {font=\normalsize\bfseries,belowsep=0pt},
row{8} = {ht=9ex,abovesep=0pt},
row{9} = {font=\bfseries},
row{Y} = {font=\bfseries,belowsep=0pt},
row{Z} = {abovesep=0pt},
}
\hline
Husband & 1-2 & name & 1-4 & 1-5 & Wife & name & x & x \\ \hline
Birth & x & date & Place & where & Birth & date & Place & where \\ \hline
Military & x & what & x & & Marr. & date & Place & where \\ \hline
Death & x & date & Place & where & Death & date & Place & where \\ \hline
Burial & x & date & Place & where & Burial & date & Place & where \\ \hline
Father & x & date & Mother & where & Father & date & Mother & where \\ \hline \hline
Notes & 7-2 & 7-3 & & & Notes & 7-7 & 7-8 & 7-9 \\
Write here & 8-2 & 8-3 & 8-4 & 8-5 & Here & 8-7 & 8-8 & 8-9 \\ \hline
Children & 9-2 & 9-3 & Birth & 9-5 & Marriage & 9-7 & Death and Burial & 9-9 \\ \hline
1 & name & x & date & 10-5 & date & 10-7 & date & 10-9 \\ \hline
2 & name & x & date & 11-5 & date & 11-7 & date & 11-9 \\ \hline
3 & name & x & date & 12-5 & date & 12-7 & date & 12-9 \\ \hline
4 & name & x & date & 13-5 & date & 13-7 & date & 13-9 \\ \hline
5 & name & x & date & 14-5 & date & 14-7 & date & 14-9 \\ \hline
6 & name & x & date & 15-5 & date & 15-7 & date & 15-9 \\ \hline
7 & name & x & date & 16-5 & date & 16-7 & date & 16-9 \\ \hline
8 & name & x & date & 17-5 & date & 17-7 & date & 17-9 \\ \hline
9 & name & x & date & 18-5 & date & 18-7 & date & 18-9 \\ \hline
10 & name & x & date & 19-5 & date & 19-7 & date & 19-9 \\ \hline
Additional Notes & ~ & ~ & ~ & ~ & ~ & ~ & ~ & ~ \\
Write here & ~ & ~ & ~ & ~ & ~ & ~ & ~ & ~ \\ \hline
\end{tblr}
\end{table}
\end{document}