pgf/tikz 与 genealogytree 和框的“上部之前”设置

pgf/tikz 与 genealogytree 和框的“上部之前”设置
\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 在注释中,与上部选项之前

这很糟糕,因为我不知道为什么左边和右边留出了更多空间并且字体却更小。

如果我现在将注释中的字符“f”替换为“r”,我会得到这样的结果:

r 在注释中,位于上部选项之前

这真的很奇怪,因为我使用的字符不应该以这种方式影响(我也尝试过其他字符,有些似乎有效,有些则无效)。

我尝试了一些方法,最后我发现,如果我删除框的“上部之前”选项,我就会得到这个

r 在注释中,没有 upper 选项

和 f

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.5cmnode size from=2cm to 4cm设置节点大小;
  • 通过设置\gtrset{info separators={\par}{. }{}{}},将节点内容拆分为四个段落,由三个垂直跳跃连接\parskip
  • 通过设置before upper={\parskip=0.15\tcbfitdim plus 0pt minus 0pt}\parskip在节点内容的开头设置为字体大小可变。这里表示库设置的\tcbfitdim使用的字体大小。(通过设置,从 开始)。fittingtcolorboxfit basedim=8pt\tcbfitdim8pt
  • 最棘手的部分来了: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 heightgenealogytree

详细变化:

  • natural height在里面添加选项box={...}
  • 更改processing=fitprocessing=tcolorbox,以允许可变节点高度。还添加size=title内部box={...}以设置 tcolorbox 边距。
  • 调整node size为某个合适的值。这将用作固定节点宽度。
  • 替换无用的fitting相关选项。里面box={...}
    • 替换fit basedim=8ptfontupper=\fontsize{8}{9.6}\selectfont
    • 0.15\tcbfitdim用( )before upper={...}来代替。1.2pt8pt * 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}

相关内容