TikZ/tikzpagenodes

TikZ/tikzpagenodes

这个问题是对上一个问题的后续:矩阵定位大于边距

这个问题涉及到定位一个pgf超出页面水平边距的矩阵(虽然我认为这也适用于浮点数?),并且两个答案都提供了解决问题的方法。

但是,如果矩阵的水平方向边距都大于边距,那么上述解决方案都不起作用垂直。

如何确保对于边距来说(稍微)太大的矩阵在文本区域垂直居中水平?

在我看来,在上一个问题提供的答案中,基于的答案stackengine可能更适合这项任务(这就是我选择在下面使用那个答案的原因),但事实可能并非如此,当然我愿意接受各种建议。

这是使用该解决方案的示例文档stackengine

\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usetikzlibrary{matrix}
\usepackage{stackengine}
\newcommand\zerowidth[2][c]{\stackengine{0pt}{}{#2}{O}{#1}{F}{T}{L}}
\begin{document}
\newsavebox\toowide
\setbox0=\hbox{%
\begin{tikzpicture}
  \matrix [
      matrix of nodes,
      nodes={
        text depth=4em,
        text height=5em,
        minimum width=10em,
        draw
      },
      row sep=-\pgflinewidth,
      column sep=-\pgflinewidth,
    ]
  {
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
  };
\end{tikzpicture}
\unskip}

\sbox\toowide{\box0}

\centering\zerowidth{\usebox{\toowide}}

\noindent\rule{\textwidth}{1ex}
\end{document}

更新

好吧,我想我应该添加一些细节,让这个问题更贴切地反映实际问题。在实际文档中,图表位于一个table比高度宽得多的表格中,因此表格是landscape环境内。这个新的 MWE 反映了这一点,并包括 Qrrbrbirlbel 的部分解决方案:

\documentclass{article}
\usepackage{pdflscape}
\usepackage{tikz}
\usepackage{pgf}
\usetikzlibrary{matrix}
\newenvironment{xycenter}
  {\par\setbox0=\hbox\bgroup\ignorespaces}
  {\unskip\egroup\noindent\parbox[c][\textheight][c]{\hsize}{\makebox[\hsize]{\box0}}\par}
\begin{document}
\begin{landscape}
\begin{table}
\caption{This is my awesome caption}
\begin{xycenter}
\begin{tikzpicture}
  \matrix [matrix of nodes,
      nodes={
        text depth=3.5em,
        text height=4.5em,
        minimum width=9em,
        draw
      },
      row sep=-\pgflinewidth,
      column sep=-\pgflinewidth,
    ]
  {
    A & B & C & D & E & F & G \\
    A & B & C & D & E & F & G \\
    A & B & C & D & E & F & G \\
    A & B & C & D & E & F & G \\
    A & B & C & D & E & F & G \\
  };
\end{tikzpicture}
\end{xycenter}
\end{table}
\end{landscape}
\end{document}

在这种情况下,矩阵的大小可能看起来好像标题根本不应该出现在这个页面上,但实际图表比页面稍大一点,所以情况没有这么糟糕。

另一种解决方案是能够scale在选项中使用tikzpicture,但这是我尝试的第一件事,似乎没有改变任何东西。如果可以缩放,那么我就不需要费力地尝试将其挤进该页面。我开始认为我应该重命名这个问题......

答案1

您还可以修剪边界框,使得图片仍然占据具有非零宽度和高度的框。

\documentclass{article}
\usepackage[pass,showframe]{geometry} % just to show the margins

\usepackage{tikz}
\usetikzlibrary{matrix,calc}

\tikzset{fit to page/.style={fit only width,fit only height},
         fit only width/.style={
                    trim left={($(current bounding box.center)-(0.5*\textwidth,0)$)},
                    trim right={($(current bounding box.center)+(0.5*\textwidth,0)$)},
          },
          fit only height/.style={
                     execute at end picture={%
                     \useasboundingbox let 
                           \p1=(current bounding box.north east),
                           \p2=(current bounding box.south west) in
                           \pgfextra{\pgfresetboundingbox}
                           (\x2,-0.5*\textheight) rectangle (\x1-(0,0.5*\textheight);
                    }
          }
}

\begin{document}
\noindent
\begin{tikzpicture}[fit to page]
 \matrix [matrix of nodes,
      nodes={
        text depth=4em,
        text height=5em,
        minimum width=10em,
        draw
      },
      row sep=-0.5\pgflinewidth,
      column sep=-0.5\pgflinewidth,
    ]
  {
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\ 
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\        
    A & B & C & D \\        
  };

\end{tikzpicture}
\end{document}

在此处输入图片描述

对于更新的 MWE,

\documentclass{article}
\usepackage[pass,showframe]{geometry} % just to show the margins
\usepackage{tikz,rotating}
\usetikzlibrary{matrix,calc}

\tikzset{fit to page/.style={fit only width,fit only height},
         fit only width/.style={
                    trim left={($(current bounding box.center)-(0.5*\textwidth,0)$)},
                    trim right={($(current bounding box.center)+(0.5*\textwidth,0)$)},
          },
          fit only height/.style={
                     execute at end picture={%
                     \useasboundingbox let 
                           \p1=(current bounding box.north east),
                           \p2=(current bounding box.south west) in
                           \pgfextra{\pgfresetboundingbox}
                           (\x2,-0.5*\textheight) rectangle (\x1-(0,0.5*\textheight);
                    }
          }
}

\begin{document}
\begin{sidewaystable}
\begin{tikzpicture}[fit only width]
 \matrix [matrix of nodes,
      nodes={
        text depth=4em,
        text height=5em,
        minimum width=10em,
        draw
      },
      row sep=-0.5\pgflinewidth,
      column sep=-0.5\pgflinewidth,
    ]
  {
    A & B & C & D & B & C & D \\
    A & B & C & D & B & C & D \\
    A & B & C & D & B & C & D \\        
  };

\end{tikzpicture}
\caption{AGA}
\label{asdf}
\end{sidewaystable}
\end{document}

在此处输入图片描述

答案2

TikZ/tikzpagenodes

随着tikzpagenodes包,您所需要的只是overlay-remember picture组合、current page text area(伪)节点和\newpages,以便页面上只有矩阵(该overlay选项禁用边界框的计算)。

代码

\documentclass{article}
\usepackage{tikzpagenodes}
\usetikzlibrary{matrix}
\usepackage[showframe,pass]{geometry}
\begin{document}
\begin{tikzpicture}[overlay,remember picture]
  \matrix at (current page text area.center) [
      matrix of nodes,
      nodes={
        text depth=4em,
        text height=5em,
        minimum width=10em,
        draw
      },
      row sep=-\pgflinewidth,
      column sep=-\pgflinewidth
    ]
  {
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
  };
\end{tikzpicture}
\end{document}

更多环境

扩展egreg 的回答,可以添加环境ycenterxycenter

代码

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage[showframe,pass]{geometry}
\newenvironment{xcenter}
 {\par\setbox0=\hbox\bgroup\ignorespaces}
 {\unskip\egroup\noindent\makebox[\textwidth]{\box0}\par}
\newenvironment{ycenter}
 {\par\setbox0=\hbox\bgroup\ignorespaces}
 {\unskip\egroup\noindent\parbox[c][\textheight][c]{\textwidth}{\box0}\par}
\newenvironment{xycenter}
 {\par\setbox0=\hbox\bgroup\ignorespaces}
 {\unskip\egroup\noindent\parbox[c][\textheight][c]{\textwidth}{\makebox[\textwidth]{\box0}}\par}
\begin{document}
\begin{xycenter}
\begin{tikzpicture}
  \matrix [
      matrix of nodes,
      nodes={
        text depth=4em,
        text height=5em,
        minimum width=10em,
        draw
      },
      row sep=-\pgflinewidth,
      column sep=-\pgflinewidth
    ]
  {
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
  };
\end{tikzpicture}
\end{xycenter}
\end{document}

输出

在此处输入图片描述

答案3

stackengine方法...

\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usetikzlibrary{matrix}
\usepackage{stackengine}
\usepackage[pass,showframe]{geometry}
\newcommand\zerowidth[2][c]{\stackengine{0pt}{}{#2}{O}{#1}{F}{T}{L}}
\begin{document}
\newsavebox\toowideANDtall
\setbox0=\hbox{%
\begin{tikzpicture}
  \matrix [
      matrix of nodes,
      nodes={
        text depth=4em,
        text height=5em,
        minimum width=10em,
        draw
      },
      row sep=-\pgflinewidth,
      column sep=-\pgflinewidth,
    ]
  {
    A & B & C & D \\
    A & B & C & D \\ 
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
    A & B & C & D \\
  };
\end{tikzpicture}
\unskip}
\sbox\toowideANDtall{\box0}
\def\useanchorwidth{T}
\def\stacktype{L}
\savestack{\XYZ}{\belowbaseline[.5\ht\toowideANDtall-\baselineskip]{%
  \zerowidth{\usebox{\toowideANDtall}}}}
{\centering
\belowbaseline[.5\textheight]{\smash{\XYZ}}\par
}
\end{document}

在此处输入图片描述

相关内容