我经常遇到以下情况:tikzpicture
我的 A 包含一个主区域和一些外部材料(如文本标签),这些材料几乎不对称于主区域。如果这样的图片居中,主区域就不在中心,这通常看起来不太好看。
我想说明图片的哪个(矩形)区域应放在中心。最好使用宏或选项(TikZ 设置)来说明主要区域的左下角和右上角坐标。
我知道我可以use as bounding box
在绘制主区域时使用它,这样就不会将所有内容都作为官方图片的一部分,但这通常没用。如果使用或将图片转换为 PDF 图像preview
,则standalone
外部区域将被剪裁。此外,主区域可能相当复杂,不容易放入单个范围内。
所以我的想法是使用一些代码来测量给定主要区域周围的现有边界框,并通过添加一些白色空间来扩展边界框,以便该区域位于中心。水平居中是主要目标,但也可能实现垂直居中。
例如:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\hrule
\begin{figure}
\centering
\begin{tikzpicture}[<some key>={1,0}{6,5}]
\draw (1,0) rectangle (6,5);
\draw (1,0) -- (6,5);
\node [left] at (0,2.5) {Text};
\orsomemacro{1,0}{6,5}
\end{tikzpicture}
\caption{Caption}
\end{figure}
\end{document}
我个人更喜欢 TikZ 键/样式,但如果另外提供替代宏将是一个奖励。必须特别小心,因为图片开头尚未定义坐标。坐标参数应允许任何 TikZ 坐标,包括calc
带有内部的表达式。可以使用而不是简单地解析来( )
给出坐标。但是,当然,正常的 TikZ 语法是首选。{ }
( )
我(当然)已经编写了类似这样的代码,过一段时间会将其作为答案发布。我很高兴看到其他解决方案,并很乐意为最佳解决方案提供赏金。
答案1
这是我的第一次尝试。它定义了一个xcenter around={lower left}{upper right}
应该在的可选参数中使用的键tikzpicture
,例如\begin{tikzpicture}[xcenter around={1,0}{6,5}]
。
\usetikzlibrary{calc}
\tikzset{xcenter around/.style 2 args={execute at end picture={%
\useasboundingbox let \p0 = (current bounding box.south west), \p1 = (current bounding box.north east),
\p2 = (#1), \p3 = (#2)
in
({min(\x2 + \x3 - \x1,\x0)},\y0) rectangle ({max(\x3 + \x2 - \x0,\x1)},\y1);
}}}
我正在开发一个可以增加更多功能的扩展版本。
答案2
好的,这是我的第一次尝试
\documentclass{article}
\thispagestyle{empty}
\usepackage{tikz}
\pgfkeys{/tikz/.cd,
centre picture/.style={
execute at begin picture={\resetbb},
execute at end picture={\enlargebb}
},
centre picture at/.code={\global\def\centrecoords{#1}}
}
\newcommand{\resetbb}{%
\global\let\centrecoords\relax
\global\let\pictcx\relax
\global\let\pictcy\relax
}
\resetbb
\newcommand{\enlargebb}{%
\path (current bounding box.north west);
\pgfgetlastxy{\bbw}{\bbn}
\path (current bounding box.south east);
\pgfgetlastxy{\bbe}{\bbs}
\ifx\centrecoords\relax
\else
\path \centrecoords;
\pgfgetlastxy{\pictcx}{\pictcy}
\fi
\pgfmathsetmacro{\bbww}{\pictcx + max(\bbe - \pictcx,\pictcx - \bbw)}
\pgfmathsetmacro{\bbee}{\pictcx - max(\bbe - \pictcx,\pictcx - \bbw)}
\pgfmathsetmacro{\bbnn}{\pictcy + max(\bbn - \pictcy,\pictcy - \bbs)}
\pgfmathsetmacro{\bbss}{\pictcy - max(\bbn - \pictcy,\pictcy - \bbs)}
\fill (\pictcx, \pictcy) circle[radius=2pt];
\draw (\bbww pt,\bbnn pt) rectangle (\bbee pt,\bbss pt);
\path (\bbww pt,\bbnn pt) rectangle (\bbee pt,\bbss pt);
}
\def\centrepictureat#1;{%
\path #1;
\pgfgetlastxy{\pictcx}{\pictcy}
\xdef\pictcx{\pictcx}
\xdef\pictcy{\pictcy}
}
\begin{document}
\hrule
\begin{figure}
\centering
\begin{tikzpicture}[centre picture]
\draw (1,0) rectangle (6,5);
\draw (1,0) -- (6,5);
\node [left] at (0,2.5) {Text};
%\node[centre picture at={(1,1)}] {};
\centrepictureat (2,0);
\end{tikzpicture}
\caption{Caption}
\end{figure}
\end{document}
结果(为达到效果,绘制了边界框和中心点;明显的修改是删除它们)
它的工作原理是保存给定的坐标,然后在图片末尾计算以给定坐标为中心的矩形,该矩形刚好足够容纳边界框。有两个接口:一个可以在路径上指定的键(centre picture at=coord
)和一个“类似路径”的命令\centrepictureat coord;
)。
我确信它还需要进一步完善(尤其是两个接口,我一时兴起添加了第二个接口;我没有考虑宏名)。而且出于某种原因,当前版本的软件包standalone
不喜欢它!