为什么 \ifthenelse 不起作用?

为什么 \ifthenelse 不起作用?

我目前正在处理代码中的一个问题。我不断收到use of \nextx does not match its definition来自该\pgfmathsetmacro\nextAsInt...行的错误。但我看不出问题所在。它应该返回一个整数。

\usepackage{tikz}
\usepackage{tikz-3dplot}
\usepackage{calc}
\usepackage{pgfmath}
\usepackage{ifthen}

\begin{document}
\begin{center}
    \tdplotsetmaincoords{50}{-15}
    \begin{tikzpicture}[tdplot_main_coords, scale = 1]

        \def \xy{{  {2, 1, 0.5, 1}, 
                    {4, 1, 2, 3}, 
                    {3, 2, 4, 1}, 
                    {0.5, 3, 5, 4}}}

        \foreach \x in {0,...,3}{
            \foreach \y in {0,...,3}{
                \pgfmathsetmacro\asInt{int(\xy[\y][\x])}
                \pgfmathsetmacro\r{(\asInt+1)/2}
                
                \def \nextx \ifthenelse {\x=3} {\value{\x}} {\value{\x+1}}
                \def \nexty \ifthenelse {\y=3} {\value{\y}} {\value{\y+1}}

                \pgfmathsetmacro\nextAsInt{int(\xy[int(\nextx)][int(\nexty)])}
                \pgfmathsetmacro\nextr{(\nextAsInt+1)/2}

                \draw[thick, blue, -](\x+0.5,\y+0.5,0) -- (\x+0.5,\y+0.5,\r);
                \draw[fill = blue](\x+0.5,\y+0.5,\r) circle (2pt);
                \draw[thick, green, -](\x,\y+0.5,\r) -- (\nextx,\nexty,\nextr)
            }
        }

    \end{tikzpicture}
\end{center}
\end{document}

非常感谢。

答案1

它无法工作有几个原因。首先,它的\def工作方式与你认为的不同;其次,它\value计数器,而不是检索某些算术表达式的值。

你最好使用\pgfmathsetmacro以下方法:

\pgfmathsetmacro\nextx{\x==3 ? \x : \x+1}

这也是其他编程语言中的常见语法:之前的条件?要么返回 1(如果测试为真),要么返回 0(如果测试为假);当为 1 时,采用冒号之前的分支,否则采用冒号之后的分支。

我不确定输出是否是你想要的,但如果我在设置变量后添加一些调试信息,我会得到

*** \x=0; \nextx=1.0; \y=0; \nexty=1.0 ***
*** \x=0; \nextx=1.0; \y=1; \nexty=2.0 ***
*** \x=0; \nextx=1.0; \y=2; \nexty=3.0 ***
*** \x=0; \nextx=1.0; \y=3; \nexty=3 ***
*** \x=1; \nextx=2.0; \y=0; \nexty=1.0 ***
*** \x=1; \nextx=2.0; \y=1; \nexty=2.0 ***
*** \x=1; \nextx=2.0; \y=2; \nexty=3.0 ***
*** \x=1; \nextx=2.0; \y=3; \nexty=3 ***
*** \x=2; \nextx=3.0; \y=0; \nexty=1.0 ***
*** \x=2; \nextx=3.0; \y=1; \nexty=2.0 ***
*** \x=2; \nextx=3.0; \y=2; \nexty=3.0 ***
*** \x=2; \nextx=3.0; \y=3; \nexty=3 ***
*** \x=3; \nextx=3; \y=0; \nexty=1.0 ***
*** \x=3; \nextx=3; \y=1; \nexty=2.0 ***
*** \x=3; \nextx=3; \y=2; \nexty=3.0 ***
*** \x=3; \nextx=3; \y=3; \nexty=3 ***

这样您就可以看到循环是如何进行的。如果您想看到相同的结果,请将 更改为\iffalse\iftrue但当您确定正确的值时,请删除整个块)。

\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usepackage{calc}
\usepackage{pgfmath}
\usepackage{ifthen}

\begin{document}

\begin{center}

\tdplotsetmaincoords{50}{-15}

\begin{tikzpicture}[tdplot_main_coords, scale = 1]

  \def \xy{{%
    {2, 1, 0.5, 1}, 
    {4, 1, 2, 3}, 
    {3, 2, 4, 1}, 
    {0.5, 3, 5, 4}%
  }}

  \foreach \x in {0,...,3}{
    \foreach \y in {0,...,3}{
      \pgfmathsetmacro\asInt{int(\xy[\y][\x])}
      \pgfmathsetmacro\r{(\asInt+1)/2}
      \pgfmathsetmacro\nextx{\x==3 ? \x : \x+1}
      \pgfmathsetmacro\nexty{\y==3 ? \y : \y+1}
      \pgfmathsetmacro\nextAsInt{int(\xy[int(\nextx)][int(\nexty)])}
      \pgfmathsetmacro\nextr{(\nextAsInt+1)/2}

      \iffalse
        \message{***
          \string\x=\x; \string\nextx=\nextx;
          \string\y=\y; \string\nexty=\nexty
          \space***^^J%
        }
      \fi

      \draw[thick, blue, -](\x+0.5,\y+0.5,0) -- (\x+0.5,\y+0.5,\r);
      \draw[fill = blue](\x+0.5,\y+0.5,\r) circle (2pt);
      \draw[thick, green, -](\x,\y+0.5,\r) -- (\nextx,\nexty,\nextr);
    }
  }

\end{tikzpicture}

\end{center}

\end{document}

在此处输入图片描述

相关内容