关于 tikz 中奇怪的 \if 行为的解释

关于 tikz 中奇怪的 \if 行为的解释

几周前,这张 tikzpicture 制作得非常好,所以我认为我不再有问题了,并开始编写部分。但是当我几天前检查图片时,图片变成了这样: 在此处输入图片描述

我认为错误出在 \if 上,但是当我尝试使用相同的自定义类在新的 tex 项目上重现它时,tikz 图片绘制得很好。

之后又添加了很多东西,所以我不知道为什么我会遇到这种奇怪的行为。有人能帮我找到问题吗?

这是代码:

\begin{figure}[htbp]
\centering
\begin{adjustbox}{max width=\textwidth}
\tikzset{
    neuron/.style={shape=circle, minimum size=1.25cm, inner sep=0, draw, font=\small},
    rct/.style={draw, font=\small, inner sep=0, minimum size=1.25cm, shape=rectangle},
    ttk/.style={draw=none, scale=2},
}
\begin{tikzpicture}[x=2.2cm, y=1.5cm, >=Stealth]
  \foreach \t [count=\ti, evaluate={\ta=int(\ti-1);}] in {-1, 1, 2, 3, \ldots, T, -1}{
    \if\t=\ldots
        \node [ttk] at (\ti,1) (h-\ti) {\ldots};
    \else
      \ifnum\ti=1
        \node [ttk] at (\ti, 1) (h-\ti) {};
      \else
        \ifnum\ti=7
          \node [ttk] at (\ti, 1) (h-\ti) {};
        \else
            \node [rct] at (\ti,1) (h-\ti){$\mathbf h_{\t}$};
            \node [rct, below=of h-\ti] (x-\t) {$\mathbf x_{\t}$};
            \node [rct, above=of h-\ti] (y-\t) {$\mathbf y_{\t}$};
            \draw [->] (x-\t) -- (h-\ti);
          \draw [->] (h-\ti) -- (y-\t);
        \fi
      \fi
    \fi
    \ifnum\ti>1
      \draw [->] (h-\ta.east) -- (h-\ti.west);
    \fi
  }
\end{tikzpicture}
\end{adjustbox}
\caption{Some caption}
\label{img:my-arsitektur}
\end{figure}

这是复现的图片(也是问题出现之前的图片):在此处输入图片描述

[编辑]

我刚刚找到了这种奇怪行为的原因,并且可以解决我的问题。 但我仍然提出这个问题,以解释为什么这样的事情会导致 tikz 图片出现奇怪的行为。

这是主要原因:我把它放在我的 tex 上

\firstexaminer{\ldots}

该类的定义是:

\newcommand{\firstexaminer}[1]{\gdef\@firstexaminer{#1}}%
\newcommand{\@firstexaminer}{}

该命令的使用位置在类的这一部分:

\def\approvalpage{%
 \newpage\thispagestyle{empty}%
  \begin{center}
  \begin{singlespace}
  \MakeUppercase{\normalfont\large\bfseries\expandafter{Halaman Pengesahan}}\\
  \vspace{1.0cm}
  \MakeUppercase{\normalfont\large\bfseries\expandafter{Skripsi}}\\
  \vspace{0.5cm}
      \MakeUppercase{\normalfont\bfseries\@titleind}\par\nobreak
  \vspace{1.0cm}
Telah dipersiapkan dan disusun oleh\\
\vspace{0.5cm}
\MakeUppercase{\@fullname}\\
\@idnum\\
\vspace{1.0cm}
Telah dipertahankan di depan Tim Penguji\\
pada tanggal \expandafter{\@examdate}\\
\vspace{0.5cm}
Susunan Tim Penguji\\
\vspace{2.2cm}
\begin{tabular}{p{8cm}p{6cm}}
\@firstsupervisor&\@firstexaminer\\
Pembimbing&Ketua Penguji
\end{tabular}

\vspace{2.0cm}
\begin{tabular}{p{8cm}p{6cm}}
\@secondsupervisor&\@secondexaminer\\
&Anggota Penguji
\end{tabular}

\bigskip
\vspace{2.0cm}
\begin{tabular}{p{8cm}p{6cm}}
&\@thirdexaminer\\
&
\end{tabular}
    \end{singlespace}
    \end{center}
\addcontentsline{toc}{chapter}{Halaman Pengesahan}
}

当我改变\ldots为一个真正的角色时

\firstexaminer{John Doe}

tikzpicture 里面的 \if 运行得很好。


这是类文件:https://github.com/muhrifqii/skripsi-fmipa-ugm-latex/blob/master/ugmskripsi.cls

答案1

\if\t=\ldots

扩展\t然后测试前两个字符的章程代码

所以如果\t是,aa则为真,如果\tab,则为假。如果\t只有一个字符,则将根​​据进行测试,=因此如果是,则为真。=如果为空,则测试将测试\t扩展中的第一个字符是否为。\ldots=

也许你想要

\ifx\t\zldots

其中\zldots定义为

\def\zldots{\ldots}

答案2

这是一个更简单的方法:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\begin{document}

  \begin{tikzpicture}[rct/.style={draw, font=\small, inner sep=0, minimum size=8mm, shape=rectangle},
                      scale=1.5,
                      >=Stealth]
    \foreach \row[count=\y] in {x, h, y} {
       \foreach \x/\sub in {1/1, 2/2, 3/3, 5/T} {
           \node[rct](\row\x) at (\x,\y) {$\row_{\sub}$};
        }
    };
    \foreach \x in {1,2,3,5} {
        \draw[->] (x\x) -- (h\x);
        \draw[->] (h\x) -- (y\x);
    };
    \coordinate (h0) at (0,2);
    \coordinate (h6) at (6,2);
    \node[shape=rectangle, inner sep=0, minimum size=8mm] (h4) at (4,2) {$\cdots$};
    \foreach \x [evaluate=\x as \xx using int(\x+1)] in {0, ..., 5} {
        \draw[->] (h\x) -- (h\xx);
    };
  \end{tikzpicture}

\end{document}

如上所述,这将产生:

在此处输入图片描述

相关内容