我正在尝试使用组件长度作为宏来制作 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}