tikz \foreach 带有环境参数的动态列表

tikz \foreach 带有环境参数的动态列表

我正在创建一个axis接收 5 个参数的环境(第一个是可选的,默认情况下为 1)。为了在 x 轴上制作 x 标记,我使用

\foreach \x in {#2,...,#4}
{\ifthenelse{\x = 0}{}{\draw [shift={(\x,0)}] (0,1pt)--(0,-1pt);\draw (\x,0.5mm) node[anchor=north,font=\tiny] {$\x$};}}

并且工作完美,但它不灵活:它标记和之间的所有整数#2#4所以我写下这个试图让它不标记所有数字:

\foreach \x in {#2,#2+#1,...,#4}%#1 is the optional argument and by default is 1.
{\ifthenelse{\x = 0}{}{\draw [shift={(\x,0)}] (0,1pt)--(0,-1pt);\draw (\x,0.5mm) node[anchor=north,font=\tiny] {$\x$};}}

但我得到:

Missing = inserted for \ifnum."

我也尝试过:

\foreach \x [evaluate=\x as \xeval using \evaluar{\x}] in {#2,#2+#1,...,#4}
{\ifthenelse{\x = 0}{}{\draw [shift={(\x,0)}] (0,1pt)--(0,-1pt);\draw (\x,0.5mm) node[anchor=north,font=\tiny] {$\x$};}}

在哪里

\newcommand{\evaluar}[1]{\pgfmathparse{int(#1)} \pgfmathresult}

并得到:

Incomplete \iffalse; all text was ignored after line 121.

我尝试了很多组合,但 LaTeX 总是报错。有什么办法吗?

谢谢。

PD:我来自阿根廷,如果我的写作有错误,我很抱歉。

答案1

如果只涉及整数,则可以使用\numexpr(在我的示例中,我使用了\axis仅带有三个参数的命令:强制的第二和第三个参数控制范围,可选的第一个参数给出“步骤”):

\documentclass{article}
\usepackage{tikz}
\usepackage{ifthen}

\newcommand\axis[3][1]{%
  \foreach \x in {#2,\the\numexpr#2+#1\relax,...,#3}
    {\ifthenelse{\x = 0}{}{%
      \draw [shift={(\x,0)}] (0,1pt)--(0,-1pt);
      \draw (\x,0.5mm) node[anchor=north,font=\tiny] {$\x$};}}}

\begin{document}

\begin{tikzpicture}
\axis{2}{13}
\end{tikzpicture}

\begin{tikzpicture}
\axis[2]{2}{13}
\end{tikzpicture}

\begin{tikzpicture}
\axis[3]{2}{13}
\end{tikzpicture}

\begin{tikzpicture}
\axis[5]{2}{13}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

我认为没有必要如果那么您提供的 MWE 中的包。另外,查看 tikZ 的内部解析会发现,\relax后面的部分\the\numexpr#2+#1不是必需的。

\newcommand\axis[3][1]{%
  \foreach \x in {#2,\the\numexpr#2+#1,...,#3}{%
    \ifnum\x=0\relax\else
      \draw [shift={(\x,0)},color=red]
        (-1.5pt,0) -- (1.5pt,0) (0,-1.5pt) -- (0,1.5pt);
      \draw (\x,0.5mm) node[anchor=north,font=\normalfont] {$\mathbf{\x}$};
    \fi
  }%
}

在此处输入图片描述

我认为 Medina 和我的结果存在问题。既然最后一个点始终是13,为什么13输出中的某些行没有显示 ?

由于这个观察,我重新计算了结果\newforeach并获得了以下输出。

\newcommand\axis[3][3]{%
  \newforeach \x in {#2,\the\numexpr#2+#1,...,#3}{%
    \ifnum\x=0\relax\else
      \draw [shift={(\x,0)},color=red]
        (-1.5pt,0) -- (1.5pt,0) (0,-1.5pt) -- (0,1.5pt);
      \draw (\x,0.5mm) node[anchor=north,font=\normalfont] {$\mathbf{\x}$};
    \fi
  }%
}

在此处输入图片描述

这是另一个测试:

\newcommand\axis[3][5]{%
  \newforeach [
    count in = \ci all \x satisfying \ifnum\x>4\fi initially 0,
    remember = \x as \lastx initially 1
  ]
   \x in {#2,\the\numexpr#2+#1,...,#3}{%
    \ifnum\x=0\relax\else
      \draw [shift={(\x*.9,0)},color=red]
        (-1.5pt,0) -- (1.5pt,0) (0,-1.5pt) -- (0,1.5pt);
      \draw (\x*.9,0.4mm) node[anchor=north,font=\small] {$\mathbf{\lastx,\x}$};
      \ifforeachlastitem
        \draw (\x,0.4mm) node[anchor=north,font=\small,blue] {$>4:\ci$};
      \fi
    \fi
  }%
}

在此处输入图片描述

相关内容