为什么我不能使用在 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}