请考虑以下 MWE 及其后的输出。我已定义一个空宏,并用于\ifx
将其标识为空宏。但是,当从 接收到一个空宏时\pgfkeysgetvalue
,\ifx
不起作用。
\documentclass{article}
\usepackage{pgfplots, filecontents}
\pgfplotsset{compat=1.6}
\begin{filecontents}{test.dat}
Time Distance
0 0
1 1
\end{filecontents}
\pgfplotstableset{
columns/Distance/.style={
column name={$D_{\alpha}$},
}
}
\begin{document}
%
\def\tmp{}
\ifx\tmp\empty
\noindent Tmp is \tmp.\\
\fi
%
\pgfplotstableread{test.dat}{\loadedtable}%
\pgfplotstableforeachcolumn\loadedtable\as\col{%
\pgfplotstableset{columns/\col/.try}%
\pgfkeysgetvalue{/pgfplots/table/column name}\temp%
\ifx\temp\empty%
\noindent Temp is empty.\\%
\else%
\noindent Macro col is \col. Macro temp is \temp.\\%
\fi%
}%
\end{document}
我不确定\temp
返回的宏是否\pgfkeysgetvalue
是\empty
。但它没有打印任何内容。我查看了这些相关文章:
答案1
如果你将代码修改为如下形式
\pgfkeysgetvalue{/pgfplots/table/column name}\temp%
\show\temp
\ifx\temp\empty%
\noindent Temp is empty.\\%
您将看到\temp
没有\relax
值的情况,因此测试
\ifx\temp\relax
不要忘记将其\show
从生产代码中取出。
答案2
您的 MWE 不完整:无法加载pgfplotstable
。但是,column name
仅在 内可用pgfplotstable
。
让我困惑的是,尽管你使用了未定义的键,但你却没有收到错误。啊 - 这是/.try
处理程序。显然,它吞掉了嵌套的错误消息。我不知道这种行为......
无论如何,我检查了如果加载会发生什么pgfplotstable
(就像您在更大的生产代码中所做的那样)。 并且:column name
最初不为空。它只会扩展为一个空值(更准确地说:扩展为\pgfkeysnovalue
)。显然,这有一些特殊的支持,但(遗憾的是)没有记录: - 如果您说column name={}
,则列的显示名称为空字符串。 - 如果您说column name=\pgfkeysnovalue
,则列的显示名称默认为列的名称。这是默认设置。
我会调整文档。
这是一个合适的解决方案:
\documentclass{article}
\usepackage{pgfplots, filecontents}
\usepackage{pgfplotstable}% ---------- CF
\pgfplotsset{compat=1.6}
\begin{filecontents}{test.dat}
Time Distance
0 0
1 1
\end{filecontents}
\pgfplotstableset{
columns/Distance/.style={
column name={$D_{\alpha}$},
}
}
% --------- CF
\def\emptycolname{\pgfkeysnovalue}
\begin{document}
%
\def\tmp{}
\ifx\tmp\empty
\noindent Tmp is \tmp.\\
\fi
%
\pgfplotstableread{test.dat}{\loadedtable}%
\pgfplotstableforeachcolumn\loadedtable\as\col{%
\begingroup% ---- CF
\pgfplotstableset{columns/\col/.try}%
\pgfkeysgetvalue{/pgfplots/table/column name}\temp%
\ifx\temp\emptycolname% ----- CF
\noindent Temp is empty.\\%
\else%
\noindent Macro col is \col. Macro temp is \temp.\\%
\fi%
\endgroup% ---- CF
}%
\pgfplotstabletypeset\loadedtable
\end{document}
我介绍了四更改:首先,我加载了pgfplotstable
。其次,我定义了\emptycolname
包含的值,pgfplotstable
假设您从未分配过列名:\pgfkeysnovalue
。第三,在比较中使用该值\ifx
。最后(但并非最不重要的一点),我\begingroup ... \endgroup
在循环内部引入了。否则,您将继承上column name
一个循环迭代的。我还添加了\pgfplotstabletypeset
以查看它是否有效。
看http://pgfplots.sourceforge.net/TeX-programming-notes.pdf如何将局部变量传输到 TeX 组之外(如果需要的话)。