强制执行维度表达式的运算顺序?

强制执行维度表达式的运算顺序?

我正在尝试使用组件长度作为宏来制作 tikz 绘图,这样我就可以轻松调整内容并传播更改。这可行,但当我尝试使用除法在宏定义的宽度上以相等的间隔绘制线条时,我遇到了问题。我认为这是因为分数仅应用于 tableWidth 命令中的第一个值,因为它只是一个愚蠢的替换,而不是在将其插入正文之前组合命令中的值。

在对某个维度应用其他操作之前,如何强制 latex 对维度进行数学运算?我应该使用其他软件包来执行此操作吗?我在 google 上搜索并找到了与 dimexpr 和其他软件包相关的内容,但无法理解它或使其适用于我的上下文。

\documentclass[letterpaper]{scrartcl}

\usepackage{tikz}
\usepackage{graphicx}


\newcommand{\positionRad}{14mm}
\newcommand{\positionSpacing}{32mm}

\newcommand{\iconSize}{12mm}

\newcommand{\tableHeight}{20mm}
\newcommand{\tablePad}{6mm}

\newcommand{\tablePositionSep}{\positionRad+8mm}


\newcommand{\tableWidth}{4*\positionSpacing + \positionRad}


\graphicspath{{../icons/}}

\begin{document}
\begin{tikzpicture}
    
\draw (\positionSpacing, \tablePositionSep+\tableHeight) circle (\positionRad) node{\LARGE1};
\draw (2*\positionSpacing, \tablePositionSep+\tableHeight) circle (\positionRad) node{\LARGE2};
\draw (3*\positionSpacing, \tablePositionSep+\tableHeight) circle (\positionRad) node{\LARGE3};
\draw (4*\positionSpacing, \tablePositionSep+\tableHeight) circle (\positionRad) node{\LARGE4};

\draw (\positionSpacing-\positionRad,\tablePad) rectangle (\tableWidth,\tablePad+\tableHeight);
\draw (1/6*\tableWidth,\tablePad) -- (1/6*\tableWidth,\tablePad+\tableHeight);
\draw (1/3*\tableWidth,\tablePad) -- (1/3*\tableWidth,\tablePad+\tableHeight);
\draw (1/2*\tableWidth,\tablePad) -- (1/2*\tableWidth,\tablePad+\tableHeight);
\draw (5/6*\tableWidth,\tablePad) -- (5/6*\tableWidth,\tablePad+\tableHeight);
\draw (2/3*\tableWidth,\tablePad) -- (2/3*\tableWidth,\tablePad+\tableHeight);

\end{tikzpicture}
    
\end{document}

答案1

我认为这是因为分数仅应用于 tableWidth 命令中的第一个值,因为它只是一个愚蠢的替换,而不是在将其插入正文之前组合命令中的值。

正确,这是愚蠢的替代。

\newcommand\foo{1+2}

当 PGFmath 对其进行评估时,表达式3*\foo变为。3*1+2

您需要3*(\foo),但是,在您的情况下,我只需直接将括号添加到\foo

\newcommand\foo{(1+2)}

那么3*\foo(→ 3*(1+2)) 的求值就是正确的。

然而,由于 TikZ 解析器在解析坐标时非常贪婪,因此需要通过将组件括在内来保护这些表达式{…}

还有一个选项是使用由 定义的 PGFmath 函数declare function,例如

declare function={
  tablePositionSep=\positionSpacing+8mm;
  tableWidth=4*\positionSpacing+\positionRad;
}

但是将其与尺寸单位混合使用会使 TikZ 内部使用时变得混乱……或者我通过转换你的图片弄乱了一些东西。

代码

\documentclass[letterpaper]{scrartcl}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\newcommand{\positionRad}    {14mm}
\newcommand{\positionSpacing}{32mm}
\newcommand{\iconSize}       {12mm}
\newcommand{\tableHeight}    {20mm}
\newcommand{\tablePad}        {6mm}

\newcommand{\tablePositionSep}{(\positionRad+8mm)}
\newcommand{\tableWidth}      {(4*\positionSpacing + \positionRad)}

\begin{document}
\begin{tikzpicture}[radius=\positionRad]
\draw (0,0) -- (1,1);
\draw (  \positionSpacing, {\tablePositionSep+\tableHeight}) circle [] node{\LARGE1};
\draw (2*\positionSpacing, {\tablePositionSep+\tableHeight}) circle [] node{\LARGE2};
\draw (3*\positionSpacing, {\tablePositionSep+\tableHeight}) circle [] node{\LARGE3};
\draw (4*\positionSpacing, {\tablePositionSep+\tableHeight}) circle [] node{\LARGE4};

\draw (\positionSpacing-\positionRad, \tablePad) rectangle ({\tableWidth}, \tablePad+\tableHeight);
\draw ({1/6*\tableWidth}, \tablePad) -- ({1/6*\tableWidth}, \tablePad+\tableHeight);
\draw ({1/3*\tableWidth}, \tablePad) -- ({1/3*\tableWidth}, \tablePad+\tableHeight);
\draw ({1/2*\tableWidth}, \tablePad) -- ({1/2*\tableWidth}, \tablePad+\tableHeight);
\draw ({5/6*\tableWidth}, \tablePad) -- ({5/6*\tableWidth}, \tablePad+\tableHeight);
\draw ({2/3*\tableWidth}, \tablePad) -- ({2/3*\tableWidth}, \tablePad+\tableHeight);
\end{tikzpicture}
\end{document}

相关内容