![关于 tikz 中奇怪的 \if 行为的解释](https://linux22.com/image/354453/%E5%85%B3%E4%BA%8E%20tikz%20%E4%B8%AD%E5%A5%87%E6%80%AA%E7%9A%84%20%5Cif%20%E8%A1%8C%E4%B8%BA%E7%9A%84%E8%A7%A3%E9%87%8A.png)
几周前,这张 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
则为真,如果\t
是ab
,则为假。如果\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}
如上所述,这将产生: