大家干杯!
我有一个“老\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 无关。