这个问题是对上一个问题的后续:矩阵定位大于边距
这个问题涉及到定位一个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
(伪)节点和\newpage
s,以便页面上只有矩阵(该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 的回答,可以添加环境ycenter
和xycenter
。
代码
\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}