根据重新缩放的 Tikzpicture 绘制背景

根据重新缩放的 Tikzpicture 绘制背景

我想制作一张带有家谱树的海报。到目前为止,我设法创建了树并使用 resizebox 将其调整到合适的高度。现在,我想用不同的颜色为整个页面的背景着色,这种着色的坐标取决于家谱树。在下面的 MWE 中,我用灰色和黄色为调整大小的 tikzpicture 的边界框着色,灰色和黄色之间的线的高度由树决定。我想将这种着色扩展到整个背景。

我遇到的问题如下:

  • 如果我在单独的 tikzpicture 中绘制背景,则由于调整大小框,我无法访问树的节点。
  • autosizetikzpicturegenealogytree包中也有同样的问题
  • 如果我只是通过添加超出页面的节点来使图片变得非常大,那么我就会产生溢出并在实际海报之前得到一张白页。

欢迎任何想法。以下是 MWE:

\documentclass{beamer}

\usepackage[size = a0,orientation = portrait]{beamerposter}
\usepackage[all]{genealogytree}
\usetikzlibrary{backgrounds}

\setbeamersize{text margin left=0mm}
\setbeamersize{text margin right=0mm}

\begin{document}%
    \centering%
    \phantom{}
    \vspace{1cm}
    
    \noindent\resizebox{!}{.97\paperheight}{%
    \begin{tikzpicture}[remember picture]%
        \genealogytree[template=signpost]{
            parent{
                g[id=a1]{a1}
            parent{
                g[id=a2]{a2}
            parent{
                g[id=a3]{a3}
            parent{
                g[id=a4]{a4}
            parent{
                g[id=a5]{a5}
            parent{
                g[id=a6]{a6}
            parent{
                g[id=a7]{a7}
            parent{
                g[id=a8]{a8}
            parent{
                g[id=a9]{a9}
            parent{
                g[id=a10]{a10}
            }}}}}}}}}}}

        \begin{pgfonlayer}{background}
            \fill[black!60] (current bounding box.south west)  rectangle (a5-|current bounding box.south east);
            \fill[yellow!55] (a5-|current bounding box.south west)  rectangle (current bounding box.north east);
        \end{pgfonlayer}
    \end{tikzpicture}}
\end{document}

答案1

两处(半处)变化:

  • 除了从 的角绘制背景外current bounding box,您还可以使用 的角current page(需要remember picture选项)

  • 为了避免由于图片不适合文本区域而出现额外的白页,您可以使用overlay背景路径选项。

  • (我总是使用frame带有 beamer 的环境,即使你只制作一页文档。这将使你免于手动在顶部添加垂直空间等黑客攻击)


\documentclass{beamer}

\usepackage[size = a0,orientation = portrait]{beamerposter}
\usepackage[all]{genealogytree}
\usetikzlibrary{backgrounds}

\setbeamersize{text margin left=0mm}
\setbeamersize{text margin right=0mm}

\begin{document}%
\begin{frame}
    \centering%
    
    \resizebox{!}{.97\paperheight}{%
    \begin{tikzpicture}[remember picture]%
        \genealogytree[template=signpost]{
            parent{
                g[id=a1]{a1}
            parent{
                g[id=a2]{a2}
            parent{
                g[id=a3]{a3}
            parent{
                g[id=a4]{a4}
            parent{
                g[id=a5]{a5}
            parent{
                g[id=a6]{a6}
            parent{
                g[id=a7]{a7}
            parent{
                g[id=a8]{a8}
            parent{
                g[id=a9]{a9}
            parent{
                g[id=a10]{a10}
            }}}}}}}}}}}

        \begin{pgfonlayer}{background}
            \fill[black!60,overlay] (current page.south west)  rectangle (a5-|current page.south east);
            \fill[yellow!55,overlay] (a5-|current page.south west)  rectangle (current page.north east);
        \end{pgfonlayer}
    \end{tikzpicture}}
\end{frame}
\end{document}

在此处输入图片描述

答案2

我的解决方案并没有什么不同萨姆卡特的.current page提供了节点,但并没有解决难题。我认为,其中一个问题是,由于背景位于要调整大小的框内,因此您最终会调整背景的大小。例如,由于背景被调整为纸张高度的 97%,因此您总是会在顶部和底部看到白色边距。

另一个问题是,出于我不明白的原因,这也会导致树本身消失。我以为这可能是由于genealogytree使用了background,但显然并非如此。文档中有使用标准background层并在后面创建附加层的示例背景并不能解决问题。

因此,这个问题的部分原因可能是背景被调整了大小。显而易见的解决方案是不调整背景大小。我没有使用overlay(我没有想到),而是简单地告诉tikz在计算图片的边界框时不要考虑背景。

remember picture这里仍然需要使用以使current page节点正常工作。

\documentclass{beamer}

\usepackage[size = a0,orientation = portrait]{beamerposter}
\usepackage[all]{genealogytree}
\usetikzlibrary{backgrounds}

\makeatletter
\let\mypgfrelevantforpicturesizefalse\pgf@relevantforpicturesizefalse
\let\mypgfrelevantforpicturesizetrue\pgf@relevantforpicturesizetrue
\makeatother

\setbeamersize{text margin left=0mm}
\setbeamersize{text margin right=0mm}

\begin{document}
\centering
\phantom{}
\vspace{1cm}

\noindent
\begin{autosizetikzpicture}[remember picture]{}{.97\paperheight}
  \genealogytree[template=signpost]{
    parent{
      g[id=a1]{a1}
      parent{
        g[id=a2]{a2}
        parent{
          g[id=a3]{a3}
          parent{
            g[id=a4]{a4}
            parent{
              g[id=a5]{a5}
              parent{
                g[id=a6]{a6}
                parent{
                  g[id=a7]{a7}
                  parent{
                    g[id=a8]{a8}
                    parent{
                      g[id=a9]{a9}
                      parent{
                        g[id=a10]{a10}
                      }}}}}}}}}}}
  
  \mypgfrelevantforpicturesizefalse
  \begin{scope}[on background layer]
    \fill[black!60] (current page.south west)  rectangle (a5-|current page.east);
    \fill[yellow!55] (a5-|current page.west)  rectangle (current page.north east);
  \end{scope}
\end{autosizetikzpicture}
\end{document}

虽然我在这里没有这样做,但我还是建议使用frame中的内容beamer。首先,它使应用modes和利用类的各种功能变得更加容易。

树后的背景填充

相关内容