我想知道缩放 tikzpicture 的正确方法是什么。
我尝试过
\begin{tikzpicture}[scale=0.50]
但我得到的结果是元素之间的距离被缩放,但它们的大小或文本大小却没有被缩放。这就像图片自己折叠起来,没有正确缩放(正如我想象的那样,就像有一个缩放因子)
我是不是漏掉了什么?我应该使用其他命令吗?
答案1
您可以尝试使用命令\resizebox
。将tikzpicture
环境封闭在其中一个命令中,然后缩放。像这样:
\resizebox{<horizontal size>}{<vertical size>}{%
\begin{tikzpicture}
\end{tikzpicture}
}
如果您希望按比例缩放图像,您可以指定其中一个尺寸并输入!
另一个尺寸。还有一个\scalebox{<factor>}{...}
宏允许按因子缩放。这很有效,除非 有tikzpicture
矩阵命令,并且列由 分隔&
,在这种情况下,您可以使用 矩阵选项中的选项更改列分隔符ampersand replacement
,如 中所述pgfmanual
。
或者使用adjustbox
提供adjustbox
环境的包,该环境还允许调整大小和缩放,同时允许特殊内容,包括逐字文本所需的 catcode 更改和前面提到的内容&
。
答案2
Pgf 有两种不同类型的变换:坐标变换和画布变换。使用 时\begin{tikzpicture}[scale=0.50]
,您正在应用坐标变换。所有坐标都将缩放,而单个对象(文本、线条粗细、圆角等)将不会缩放。大多数时候这就是您想要的,您不想缩放精心排版的文本片段,您不想让线条太粗或太细而无法实际打印。
如果要缩放所有内容,则必须使用画布转换。为此,pgf 有一个命令\pgftransformscale{}
。您还可以使用pgflowlevelscope
环境:
\begin{tikzpicture}
\draw (0,0) rectangle (6,6); %create a bounding box to reserve space
\begin{pgflowlevelscope}{\pgftransformscale{5}}
\draw (0,0) -- (1,1) node[right]{$x$};
\end{pgflowlevelscope}
\end{tikzpicture}
您还可以使用\pgflowlevelsynccm
将画布变换矩阵与当前坐标变换矩阵同步的功能,例如像这样:
\begin{tikzpicture}[scale=5]
\draw (0,0) rectangle (1.2,1.2); %create a bounding box to reserve space
\pgflowlevelsynccm
\draw (0,0) -- (1,1) node[right]{$x$};
\end{tikzpicture}
请注意,由于 pgf 不会(无法)跟踪画布变换(它们由后端执行),因此您必须确保图片中有足够的空间容纳缩放的对象。在上面的示例中,我尝试先绘制边界框,然后再应用画布变换,从而预留空间。画布变换还存在其他问题,并且我不建议在没有仔细阅读 pgf 手册的相应部分的情况下使用它们。
我更多地将这个答案作为对正在发生的事情的解释,另一个更好的答案\resizebox
已经出现了。
答案3
您可以将“变换形状”选项用于整个图片、某个范围或单个节点。例如:
\begin{tikzpicture}[scale=2, transform shape]
\draw rectangle (1,1) node {foo};
\end{tikzpicture}
\begin{tikzpicture}[scale=2]
\draw rectangle (1,1) node {bar};
\end{tikzpicture}
但要小心,这不会解决您缩放 tikz 图片的所有情况,例如“圆角”不会缩放。tikz 作者(一般)建议不要缩放图形。
答案4
人们倾向于定义一个基本长度,并以此为基础绘制所有东西。这似乎可以很好地进行缩放,并避免了后缩放的一些缺点。
\makeatletter
\newlength{\b@sis}
\tikzset{
basis/.code={\setlength{\b@sis}{#1}}, % TikZ assignment code
basis/.default=1em, % Provide a default (\b@sis is undefined/unassigned)
basis, % Set initial Value (\b@sis is defined/assigned)
}
\makeatother
有时人们也需要从文本中控制这一点。为此,我们提出以下建议破碎的代码。(我还没有要求这个功能,所以从来没有修复过它。可以设置这个值,但是检索它似乎相当棘手。)
\usepackage{xparse}
\makeatletter
\NewDocumentCommand{\basis}{g}{
\IfValueTF{#1}
{
\setlength{\b@sis}{#1}
}{
% This part is broken
%\b@sis % Ideally one would return the measurement
%\the\b@sis % One could return a string but this is not much use
}
}
\makeatother
最后,要测试代码,请在您的
\makeatletter
\tikzset{
test/.pic={
code={\node[draw] at (0,-\b@sis) {\the\b@sis};
\node[draw] at (0, \b@sis) {Basis :};}},
}
\makeatother
\begin{document}
\tikz \pic {test};
\end{document}
如果\basis
工作正常,那么也可以在文本中使用以下内容
\tikz \draw (-\basis,-\basis) -- (\basis,\basis);