\documentclass{standalone} %or standalone
\usepackage[all]{genealogytree}
\gtrset{info separators={\par}{. }{}{}} %no period after comment
\begin{document}
\begin{tikzpicture}
\genealogytree[
processing=fit,
level distance=1cm,
level size=1.5cm,
node size from=2cm to 4cm,
box clear,
box={enhanced,fit basedim=8pt,
halign=center,valign=center,
before upper={\parskip 0.15\tcbfitdim plus 0pt minus 0pt},
drop fuzzy shadow
},
database content interpreter,
database format=full,
list separators hang,
edges=rounded,
date format=dd.mm.yyyy]{
parent{
g[female]{
female,
name = {Name \surn{Long Surname}},
birth- = {1865-10-08},
death- = {1945-08-20},
comment = {born NameWithfxx},
}
}
}
\end{tikzpicture}
\end{document}
我得到了这个:
这很糟糕,因为我不知道为什么左边和右边留出了更多空间并且字体却更小。
如果我现在将注释中的字符“f”替换为“r”,我会得到这样的结果:
这真的很奇怪,因为我使用的字符不应该以这种方式影响(我也尝试过其他字符,有些似乎有效,有些则无效)。
我尝试了一些方法,最后我发现,如果我删除框的“上部之前”选项,我就会得到这个
和 f
有谁知道为什么会这样,为什么使用哪个字符很重要,以及“上部之前”选项有什么作用?(我只是从路标模板中获取它,无法在互联网上找到该选项的作用)
编辑:最终发现上面的选项(before upper={\parskip 0.15\tcbfitdim plus 0pt minus 0pt},
)由 tcolorbox 处理(给定的代码位于颜色和字体设置之后但在内容之前)。但我仍然不知道为什么这会与 f、g 或 q 等字符冲突
答案1
解决方案 1:允许可变节点宽度和字体大小缩小。稍微放大到level size=1.5cm
,例如level size=1.6cm
,以处理特定情况(f
导致字体缩小)。
解决方案 2:允许可变的节点高度,但以固定节点宽度和固定字体大小为代价。(见下文)
解释
重要的是节点的总高度g[female]
。这里的“节点”是一个genealogytree
概念,与节点不同tikz
。
首先,genealogytree
设置选项timeflow=down
。这会将每个节点的高度固定为level size
,并让选项node size from
设置节点宽度的范围。如果节点的自然高度或宽度分别大于固定高度或最小宽度,则genealogytree
首先尝试扩大宽度。如果最大宽度(固定高度)仍然不够大,则使用fitting
库缩小字体大小tcolorbox
。
在你的例子中,
level size=1.5cm
并node size from=2cm to 4cm
设置节点大小;- 通过设置
\gtrset{info separators={\par}{. }{}{}}
,将节点内容拆分为四个段落,由三个垂直跳跃连接\parskip
; - 通过设置
before upper={\parskip=0.15\tcbfitdim plus 0pt minus 0pt}
,\parskip
在节点内容的开头设置为字体大小可变。这里表示库设置的\tcbfitdim
使用的字体大小。(通过设置,从 开始)。fitting
tcolorbox
fit basedim=8pt
\tcbfitdim
8pt
- 最棘手的部分来了:
f
中的(带深度)comment = {born NameWithfxx}
使节点的自然(总)高度略大于 1.5cm,这导致节点宽度增大。但即使使用最大宽度也无法解决过高的问题,字体大小会缩小(应用了最大宽度)。这导致f
和的输出r
在两个方面有所不同:节点宽度和字体大小。但这些差异有相同的原因。 - 改变无非
\parskip
就是增加垂直空间,并使节点更高。
一些例子可以说明它有多么棘手:
\documentclass{article} %or standalone
\usepackage[all]{genealogytree}
\gtrset{info separators={\par}{. }{}{}} %no period after comment
\begin{document}
\newcommand\testGTree[3][]{
\par
\parbox{20em}{\texttt{%
\detokenize{\parindent= #2} ... \\
comment = \detokenize{#3}
}}
\begin{tikzpicture}[baseline=(current bounding box.center)]
\genealogytree[
processing=fit,
level distance=1cm,
level size=1.5cm,
node size from=2cm to 4cm,
box clear,
box={enhanced,fit basedim=8pt,
halign=center,valign=center,
before upper={\parskip=#2 plus 0pt minus 0pt},
drop fuzzy shadow
},
database content interpreter,
database format=full,
list separators hang,
edges=rounded,
date format=dd.mm.yyyy,
#1]
{
parent{
g[id=xxx]{
female,
name = {Name \surn{Long Surname}},
birth- = {1865-10-08},
death- = {1945-08-20},
comment = {#3\smash{, \the\tcbfitdim}},
}
}
}
\draw (0, 0) grid (4, .1); % to measure node width
\end{tikzpicture}
\par
}
\parindent=0pt
\paragraph{Group 1} zero \verb|\parindent| is ok
\testGTree{0pt}{f}
\testGTree{0pt}{r}
\paragraph{Group 2} \verb|\parindent=.8pt ...| is enough to trigger width enlarging and font size shrinking
\testGTree{.8pt}{f}
\testGTree{.8pt}{r}
\paragraph{Group 3} with \verb|\parindent=0.15\tcbfitdim ...|, depth \verb|0.2pt| is enough to trigger.
\newlength{\charDepth}
\newcommand{\showDepth}[1]{%
\settodepth\charDepth{#1}%
#1\smash{, \the\charDepth}
}
\testGTree{0.15\tcbfitdim}{\showDepth f}
\testGTree{0.15\tcbfitdim}{\showDepth r}
\testGTree{0.15\tcbfitdim}{r \rule[-.2pt]{1pt}{5pt}}
\paragraph{Group 4} a slightly larger \verb|level size=1.6cm| fixes the original problem.
\testGTree[level size=1.6cm]{0pt}{f}
\testGTree[level size=1.6cm]{0pt}{r}
\end{document}
解决方案 2
结果:固定节点宽度,让节点高度随内容变化。受包实现限制,您不能同时拥有宽度和高度变量。
主要变化:使用tcolorbox
选项。在文档中natural height
搜索以查看更多示例。natural height
genealogytree
详细变化:
natural height
在里面添加选项box={...}
。- 更改
processing=fit
为processing=tcolorbox
,以允许可变节点高度。还添加size=title
内部box={...}
以设置 tcolorbox 边距。 - 调整
node size
为某个合适的值。这将用作固定节点宽度。 - 替换无用的
fitting
相关选项。里面box={...}
,- 替换
fit basedim=8pt
为fontupper=\fontsize{8}{9.6}\selectfont
0.15\tcbfitdim
用( )before upper={...}
来代替。1.2pt
8pt * 0.15
- 替换
\documentclass{article} %or standalone
\usepackage[all]{genealogytree}
\gtrset{info separators={\par}{. }{}{}} %no period after comment
\begin{document}
\begin{tikzpicture}[baseline=(current bounding box.center)]
\genealogytree[
processing=tcolorbox,
level distance=1cm,
level size=1.5cm,
node size=3cm,
box clear,
box={enhanced,
fontupper=\fontsize{8}{9.6}\selectfont,
halign=center, valign=center, size=title,
% 1.2pt = 8pt * 0.15
before upper={\parskip=1.2pt plus 0pt minus 0pt},
drop fuzzy shadow,
natural height
},
database content interpreter,
database format=full,
list separators hang,
edges=rounded,
date format=dd.mm.yyyy]
{
parent{
g[id=xxx]{
female,
name = {Name \surn{Long Surname}},
birth- = {1865-10-08},
death- = {1945-08-20},
comment = {born NameWithfxx},
}
}
}
\end{tikzpicture}
\end{document}