正确缩放 tikzpicture

正确缩放 tikzpicture

我想知道缩放 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 图片的所有情况,例如“圆角”不会缩放。t​​ikz 作者(一般)建议不要缩放图形。

答案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);

相关内容