tikzpicture 中 beamer 框架中使用 \ifnum 导致 \ifx 不完整

tikzpicture 中 beamer 框架中使用 \ifnum 导致 \ifx 不完整

我想tikzpicture在动画中使用以下内容,如果宏\iFrame不等于零,则不应绘制其中的一部分。如果我在standalone不带以下代码的类中使用以下代码frame环境的类中使用以下代码,它会按预期工作,如果我使用\ifnum 外部tikzpicture也按预期工作。但是,如果我\ifnum在 a 内部使用tikzpicturea frame,编译会因Incomplete \ifx; all text was ignored after line 40.错误而停止。我想知道为什么。

\documentclass{beamer}

\usepackage{tikz}

\tikzset{
    axis/.style={-stealth,line width=1.5pt},
    xaxis/.style={axis,red},
    yaxis/.style={axis,green},
    zaxis/.style={axis,blue}
}

\begin{document}
    \begin{frame}
        \begin{tikzpicture}[line width = 1pt]
            \pgfmathtruncatemacro\iFrame{15}
            \begin{scope}[shift={(0,0)},rotate=30]
                \filldraw[fill=violet,fill opacity=.5] (0,0) circle (2.2 and 0.6);
                \draw[xaxis] (0,0,0) -- (1,0,0);
                \draw[yaxis] (0,0,0) -- (0,1,0);
                \draw[zaxis] (0,0,0) -- (0,0,1);
                \node[left] {\( \Psi_a \)};
                \coordinate (pa1) at (2,0);
                \fill (pa1) circle (1mm);
            \end{scope}
            \begin{scope}[shift={({\iFrame/10+4*cos(30)},0)},rotate=330]
                \filldraw[fill=orange,fill opacity=.5] (0,0) circle (2.2 and 0.6);
                \draw[xaxis] (0,0,0) -- (1,0,0);
                \draw[yaxis] (0,0,0) -- (0,1,0);
                \draw[zaxis] (0,0,0) -- (0,0,1);
                \node[above left] {\( \Psi_b \)};
                \coordinate (pb1) at (-2,0);
                \fill (pb1) circle (1mm);
            \end{scope}
            \ifnum\iFrame=0\relax
                \begin{scope}[shift={({2*cos(30)},{2*sin(30)})}]
                    \draw[xaxis] (0,0,0) -- (1,0,0);
                    \draw[yaxis] (0,0,0) -- (0,1,0);
                    \draw[zaxis] (0,0,0) -- (0,0,1);
                    \node[above right] {\( \Psi_j \)};
                \end{scope}
            \fi
        \end{tikzpicture}
    \end{frame}
\end{document}

答案1

一种解决方案是使用环境fragile选项frame,这样内容就会逐字写入辅助文件,并且beamer在读取材料时不会混淆。我不太确定问题出在哪里,但它肯定存在于“原始”条件中。

事实上,另一种解决方案是执行条件

        \ifnumequal{\iFrame}{0}
          {
            \begin{scope}[shift={({2*cos(30)},{2*sin(30)})}]
                \draw[xaxis] (0,0,0) -- (1,0,0);
                \draw[yaxis] (0,0,0) -- (0,1,0);
                \draw[zaxis] (0,0,0) -- (0,0,1);
                \node[above right] {\( \Psi_j \)};
            \end{scope}
          }{}

不要忘记“假”分支的空括号。没有扫描“原始”条件,一切顺利。构造\ifnumequal由 定义etoolbox,并由 自动加载beamer

相关内容