我正在尝试创建一个需要 8 个输入的自定义形状的“网格”:
1 = 原点 x
2 = 原点 y
3 = 盒子长度 x
4 = 盒子高度 y
5 = 列数 x
6 = y 行数
7 = 列空间 x
8 = 行距 y
我尝试的是这样的:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand{\boxarray}[8]{
\foreach \k in {1,...,#6}
\foreach \i in {1,...,#5}
\def\xo{{#1 + (\i - 1)*(#3 + #7)}}
\def\yo{{#2 + (\k - 1)*(#4 + #8)}}
\draw (\xo + .1, \yo)
-- (\xo + #3 - .1,\yo)
arc (180:270:.1)
-- (\xo + #3,\yo - #4 - .1)
arc (90:180:.1)
-- (\xo + .1,\yo - #4)
arc (0:90:.1)
-- (\xo,\yo-.1)
arc (270:360:.1)
-- cycle;
}
\end{document}
但是,我不断收到两个“非法测量单位”和一个“缺失数字”错误。我知道这很麻烦,但是当我使用我创建的命令在 \foreach 内创建形状时,它出现了大约 23 个错误。我对 latex 中的循环还很陌生,所以任何帮助我都会很感激。
这是我想要创建的形状:
\draw (6.6, 0)
-- (10.4,0)
arc (180:270:.1)
-- (10.5,-7.9)
arc (90:180:.1)
-- (6.6,-8)
arc (0:90:.1)
-- (6.5, -.1)
arc (270:360:.1)
-- cycle;
答案1
你的变量没有及时展开。将宏定义改为
\newcommand{\boxarray}[8]{
\foreach \k in {1,...,#6}
\foreach \i in {1,...,#5}
\pgfmathsetmacro{\xo}{{#1 + (\i - 1)*(#3 + #7)}}
\pgfmathsetmacro{\yo}{{#2 + (\k - 1)*(#4 + #8)}}
\draw (\xo + .1, \yo)
-- (\xo + #3 - .1,\yo)
arc (180:270:.1)
-- (\xo + #3,\yo - #4 - .1)
arc (90:180:.1)
-- (\xo + .1,\yo - #4)
arc (0:90:.1)
-- (\xo,\yo-.1)
arc (270:360:.1)
-- cycle;
}
\begin{tikzpicture}
\boxarray11111111
\end{tikzpicture}
答案2
定义中的多出的一对括号\xo
会\yo
导致解析问题。可以省略它们,但保护 )
通过封闭解析器内部X或者是括号中的值。
当然,最好只通过一次评估值\pgfmathsetmacro
,然后在不受保护的情况下使用它们(因为它们不包含任何)
或{}
更多),就像percusse 的回答。
代码
\documentclass[tikz]{standalone}
\newcommand{\boxarray}[8]{
\foreach \k in {1,...,#6}
\foreach \i in {1,...,#5}
\def\xo{#1 + (\i - 1)*(#3 + #7)}
\def\yo{#2 + (\k - 1)*(#4 + #8)}
\draw[delta angle=90, radius=.1]
({\xo + .1}, {\yo})
-- ({\xo + #3 - .1}, {\yo})
arc [start angle=180]
-- ({\xo + #3}, {\yo - #4 - .1})
arc [start angle=90]
-- ({\xo + .1}, {\yo - #4})
arc [start angle=0]
-- ({\xo}, {\yo-.1})
arc [start angle=270]
-- cycle;
}
\begin{document}
\tikz{
\boxarray11111111
}
\end{document}