1 = 原点 x

1 = 原点 x

我正在尝试创建一个需要 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}

相关内容