\pgfmathsetmacro 没有设置宏

\pgfmathsetmacro 没有设置宏

大家干杯!

我有一个“老\pgfmathsetmacro问题”,无论如何也解决不了。TikZ 和 PGFPlots 之间是否存在我没​​发现的故障。我只想在\foreach底部的循环中绘制 x 值和 y 值之间的线,但白天出现了各种错误。我试验和错误中最新的、与此版本相关的是宏上的“未定义的控制序列” \result。错误位于命令\draw

有人发现这个错误吗?

妇女权利委员会:

\documentclass{article}

\usepackage{tikz, pgfplots}
\usetikzlibrary{calc}
\pgfplotsset{compat=1.13}

\begin{document}
  \begin{center}
    \hspace*{\fill}
\begin{tikzpicture}[
        >=latex,
        font={\footnotesize},
        declare function={
          f(\x) = .5 + \x - sin(\x*180/3.14;
        }
  ]
  \begin{axis}[
    axis lines=middle,
    width=10cm,
    height=10cm,
    axis lines = middle,
    domain = 0.5:3,
    clip = false
  ]
  \addplot[black!70, very thick]{f(x)};
  \foreach \i in {0.25, 2.25}{
    \pgfmathsetmacro{\result}{f(\i)};
    \draw (0, \result) -- (\i, result) -- (\i, 0);
  }
\end{axis}
\end{tikzpicture}%
\end{center}
\end{document}

答案1

问题是axis环境会存储其绘图命令直到环境结束,然后一次性执行它们。它会在不扩展的情况下收集它们,这意味着您的\draw命令会在您编写它们时保存。但是,在\foreach循环之外\result,宏未定义,因此会出现错误(请注意,错误实际上是在行中报告的\end{axis},而不是\draw行)。有几种方法可以解决这个问题,但对于您来说,最简单的方法是强制在调用时扩展您想要扩展的宏。一个相当标准的方法是将辅助宏定义为具有扩展\draw坐标的命令,然后调用它。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/325334/86}
\usepackage{tikz, pgfplots}
\usetikzlibrary{calc}
\pgfplotsset{compat=1.13}

\begin{document}
  \begin{center}
    \hspace*{\fill}
\begin{tikzpicture}[
        >=latex,
        font={\footnotesize},
        declare function={
          f(\x) = .5 + \x - sin(\x*180/3.14;
        }
  ]
  \begin{axis}[
    axis lines=middle,
    width=10cm,
    height=10cm,
    axis lines = middle,
    domain = 0.5:3,
    clip = false
  ]
  \addplot[black!70, very thick]{f(x)};
  \foreach \i in {0.25, 2.25}{
  \pgfmathsetmacro{\result}{f(\i)}
  \edef\temp{
    \noexpand\draw (0, \result) -- (\i, \result) -- (\i, 0);
  }
  \temp
  }
\end{axis}
\end{tikzpicture}%
\end{center}
\end{document}

请注意,由于您的轴从(0.5,0.5)盒子运行看起来有点不合适,但这是原点选择的特征,与 TeX 无关。

相关内容