TikZ 的计算和未定义的控制序列

TikZ 的计算和未定义的控制序列

我已经使用 TikZ 制作了几个图形,但我看不出这个片段有什么问题:

\documentclass[a4paper,10pt,twoside]{scrbook}
\usepackage[utf8x]{inputenc}
\usepackage{tikz}
\begin{document}
    \begin{tikzpicture}
        \def\groundwidth{8.0cm}
        \def\streetwidth{2.0cm}

        \def\gw{0.5*(\groundwidth-\streetwidth)}

        \fill[color=green!75!black] (0, 0) -- (\gw,0) -- (\gw,\gw) -- (0,\gw) -- cycle;
    \end{tikzpicture}
\end{document}

使用 pdftex 编译它,会产生以下错误消息:

! Package pgf Error: No shape named 0 is known.

See the pgf package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.11 ...ll[color=green!75!black] (0, 0) -- (\gw,0)
                                               -- (\gw,\gw) -- (0,\gw) -...

我猜想其中肯定存在问题\gw,但我不知道如何修复。您有什么建议或可以给出解释该问题的文档链接吗?

答案1

解决方案是\def\gw{{0.5*(\groundwidth-\streetwidth)}}

\documentclass[a4paper,10pt,twoside]{scrbook}
\usepackage[utf8x]{inputenc}
\usepackage{tikz}
\begin{document}
        \def\groundwidth{8.0cm}
        \def\streetwidth{2.0cm}
        \def\gw{{0.5*(\groundwidth-\streetwidth)}}    
    \begin{tikzpicture}
        \fill[color=green!75!black] (0, 0) -- (\gw,0) -- (\gw,\gw) -- (0,\gw) -- cycle;
    \end{tikzpicture}
\end{document} 

你也可以使用

 \fill[color=green!75!black] (0, 0) -- ({\gw},0) -- ({\gw},{\gw}) -- (0,{\gw}) -- cycle;

代替

  \def\gw{{0.5*(\groundwidth-\streetwidth)}}    

答案2

原因是,在解析出\gw全部内容之前,似乎就将其展开了,因此:( )

(0, 0) -- (\gw,0)

被视为:

(0, 0) -- (0.5*(\groundwidth-\streetwidth),0)

因为圆括号( )不像大括号那样匹配{ },所以第一个圆括号)被当作结束圆括号,所以 TikZ 认为0.5*(\groundwidth-\streetwidth是内容。根据 TikZ 的解析规则,这看起来不像坐标,因为没有包含,:。因此它被视为节点名称。语法是node name.anchor,即它认为0是节点名称和5*(\groundwidth-\streetwidth锚点名称。这导致错误No shape named 0 is known(这里的 shape 表示节点)。

解决方案是,正如 Altermundus 已经指出的那样,用 括住整个\gw表达式。这会迫使 TeX在进一步寻找 之前先{ }寻找结尾,从而使内部对 起作用。})( )

相关内容