考虑一下这个MWE:
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usetikzlibrary{calc}
\pgfplotstableread[col sep=space,row sep=newline,header=true]{
ts val
0.0 0.0
1.0 1.0
1.1 4.9
2.0 2.0
2.2 4.9
4.8 0.2
}\mytable
\def\drawLines{%
\pgfplotstableforeachcolumnelement{[index]0}\of\mytable\as\cx{%
% \node{I have now cell element ‘\cx’ at row index ‘\pgfplotstablerow’;\par};
\edef\temp{ %
\noexpand\draw[%
draw=black,%
fill=none,%
opacity=0.7,%
] let \noexpand\p1=({axis cs:\cx,0}), \noexpand\p2=({rel axis cs:0,0}),
\noexpand\p3=({rel axis cs:1,1}) in
(\noexpand\x1,\noexpand\y2) -- (\noexpand\x1,\noexpand\y3)
; %
}
\temp
}
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[extra x ticks={3.5}]
\addplot[smooth] table {\mytable};
\addplot[only marks,mark=*,mark options={color=blue}] table {\mytable};
\draw[red] let \p1=(rel axis cs:0,0), \p2=(rel axis cs:1,1), \p3=(axis cs:3.5,0)
in (\x3,\y1) -- (\x3,\y2);
\drawLines % passes no problem
\end{axis}
\drawLines % fails w/ "! Missing \endcsname inserted." \pgfcrdmth@x
\end{tikzpicture}
\end{document}
事实上,它将会失败:
! Missing \endcsname inserted.
<to be read again>
\pgfcrdmth@x
l.42 \drawLines
% fails w/ "! Missing \endcsname inserted." \pgfcrdmth@x
...但是如果你注释掉标有 - 的行% fails...
,那么文档就可以成功编译,并且符合预期?显然,通过\drawLines
调用的函数,\draw
\pgfplotstableforeachcolumnelement
做工作 - 但只能从内部进行{axis}
,而不是从外部进行?
为什么会发生这种情况 - 我怎样才能让这个宏在 之外执行{axis}
,同时仍在 中{tikzpicture}
? 否则我怎么知道哪段代码可以从哪里运行?
PS: 事实上,这看起来像为什么 \foreach 变量在 \axis 中的 \draw 中不起作用?,但我猜这个问题可以用我在这里使用的 \edef\temp...\temp 来回答;这就是为什么这个问题让我困惑...