如果该元素是宏,为什么 \ifx 不会与 foreach 列表的列表元素匹配?

如果该元素是宏,为什么 \ifx 不会与 foreach 列表的列表元素匹配?

我有以下内容:

\documentclass{minimal}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\def\nend{6}
\def\rb{1.5mm}

\draw (0,0) -- (\nend,0);

\foreach \x in {0,...,\nend} {%
    \coordinate (\x) at (\x,0);
}

\foreach \x in {\nend,0} {%
\ifx\x\nend
    \draw[fill] (\x) circle[color=blue,radius=\rb] node[blue,below=2mm] {$x_{n}$};
\else
    \draw[fill] (\x) circle[radius=\rb] node[black,below=2mm] {$x_{\x}$};
\fi
}

\end{tikzpicture}

\end{document}

我明白了:

在此处输入图片描述

我期望最后一个节点是 x_n,但事实并非如此。我看过以下答案:这个问题,但我已经在使用整数,所以我希望事情能够匹配。无论 \nend 是列表中的第一个还是最后一个,都会发生这种情况。

这个例子确实有效:

\documentclass{minimal}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\def\nend{6}

\pgfmathparse{\nend-1}
\pgfmathsetmacro{\nm}{\pgfmathresult}

\def\nf{3}

\def\rb{1.5mm}
\def\rs{1mm}

\draw (0,0) -- (\nend,0);

\foreach \x in {0,...,\nend} {%
    \coordinate (\x) at (\x,0);
}

\foreach \x in {1,...,\nm} {%
\ifx\x\nf
    \draw[fill,color=blue] (\x) circle[radius=\rb];
\else
    \draw[fill] (\x) circle[radius=\rs] node[below=2mm] {$x_{\x}$};
\fi
}

\end{tikzpicture}

\end{document}

在此处输入图片描述

然而,当我尝试匹配最后一个元素时,它失败了。

答案1

在第二个循环中,\foreach依次执行

\def\x{\nend}<loop code>
\def\x{0}<loop code>

现在,\ifx\x\nend在两种情况下都会返回 false:在您希望返回 true 的情况下,比较是在扩展为的宏\nend和宏之间进行的\nend,它们是不同的。您必须定义一个扩展为的宏\nend才能获得 true:

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\def\nend{6}\def\isnend{\nend}
\def\rb{1.5mm}
\draw (0,0) -- (\nend,0);
\foreach \x in {0,...,\nend} {%
    \coordinate (\x) at (\x,0);
}
\foreach \x in {\nend,0} {%
  \ifx\x\isnend
    \draw[fill] (\x) circle[color=blue,radius=\rb] node[blue,below=2mm] {$x_{n}$};
  \else
    \draw[fill] (\x) circle[radius=\rb] node[black,below=2mm] {$x_{\x}$};
  \fi
}

\end{tikzpicture}

\end{document}

相关内容