使用 pgfmath 计算坐标中的值吗?

使用 pgfmath 计算坐标中的值吗?

为什么我不能使用在 TikZ 坐标中使用 pgfmath 的结果?

这是一个不起作用的(最小)示例:

\documentclass[11pt]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}

\newcommand{\leftBoundary}{\pgfmathparse{0.255in*3/2}\pgfmathresult}

% This is fine:
\node at (0,0) {\leftBoundary};

% This does not work:
\draw[thick] (\leftBoundary,2) rectangle +(1,1);

\end{tikzpicture}
\end{document}

我想要实现的是计算一些维度,然后使用它们来排列图形中的事物。虽然我知道我也可以($(point1)+(3,4)$)在 TikZ 中绘制东西时使用代码,但为了获得更好的概览,如果可以预先计算维度就太好了。

答案1

不,这不起作用,因为 TikZ 只接受完全可扩展的输入。

顺便说一下,坐标输入无论如何都会被投入到 PGF 数学中,所以

\draw[thick] (0.255in*3/2,2) …

效果一样好(情况 1)。

您也可以只存储0.255in*3/2\leftBoundary使用该宏(情况 2;同样,使用该宏的任何东西都会通过 PGF 的数学引擎进行解析)。

当然,对于非常繁琐的计算,或者经常用到的值,可以事先预先计算一些值,然后使用解析计算的结果。

为此,您需要使用

\pgfmathsetmacro\leftBoundary{0.255in*3/2}

(情况 3)或

\pgfmathparse{0.255in*3/2}\let\leftBoundary\pgfmathresult

(只要结果是一个数字,这或多或少是同一件事)。

两者都将设置\leftBoundary为结果值,pt但没有单位。TikZ 随后将在标准用户坐标系中解释此值,这会让您的 TikZ 图片突然宽度接近 28 厘米。您需要pt在路径中再次附加。

这里非常有用的是(除了使用真实的 TeX 维度,情况 5)将宏自行\pgfmathsetlengthmacro附加pt到结果值(情况 4)。


+您可能想知道为什么我在情况 3、4 和 5 中使用了。正如开头所说,TikZ 无论如何都会通过 PGF 数学来处理其大部分输入。

不过,前面的步骤+将禁用数学解析“并使用普通的 TeX 分配或增量进行简单的分配或增量。这将比调用解析器快几个数量级。”(PGF 手册,v 2.10,第 62.1 节“解析表达式的命令”,第 527 页)

对于情况 3 和 4,这可以应用,因为\leftBoundary仅包含27.6438pt,在情况 5 中\leftBoundary实际上是一个维度(长度)并且是为 TeX 的分配而制作的。

在情况 1 和 2 中,前面加上 a+将导致*3/2在 TikZ 图片中排版,就像0.255in合法的 TeX 作业一样:

在此处输入图片描述

使用+3/2*0.255in(在 PGF 数学中是合法的)将导致 TeX 出现错误。

这实际上有多重要(就编译时间而言),我从未彻底测试过它。

 如有疑问,
  请忽略。

代码

\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{backgrounds}\tikzset{every picture/.append style={framed}}
\begin{document}
\begin{tikzpicture}
\node at (0,0) {$(0,0)$};
\draw[thick] (0.255in*3/2,2) rectangle +(1,1) node[midway] {1};
\end{tikzpicture}

\begin{tikzpicture}
\newcommand*{\leftBoundary}{0.255in*3/2}
\node at (0,0) {$(0,0)$};
\draw[thick] (\leftBoundary,2) rectangle +(1,1) node[midway] {2};
\end{tikzpicture}

\begin{tikzpicture}
\pgfmathsetmacro\leftBoundary{0.255in*3/2}
\node at (0,0) {$(0,0)$};
\draw[thick] (+\leftBoundary pt,2) rectangle +(1,1) node[midway] {3};
\end{tikzpicture}

\begin{tikzpicture}
\pgfmathsetlengthmacro\leftBoundary{0.255in*3/2}
\node at (0,0) {$(0,0)$};
\draw[thick] (+\leftBoundary,2) rectangle +(1,1) node[midway] {4};
\end{tikzpicture}

\begin{tikzpicture}
\newdimen\leftBoundary % or \newlength\leftBoundary
\pgfmathsetlength\leftBoundary{0.255in*3/2}
\node at (0,0) {$(0,0)$};
\draw[thick] (+\leftBoundary,2) rectangle +(1,1) node[midway] {5};
\end{tikzpicture}
\end{document}

输出(示例)

在此处输入图片描述

相关内容