使用 \ifx 从 pgfplots 中识别空宏

使用 \ifx 从 pgfplots 中识别空宏

请考虑以下 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}

MWE 的输出

我不确定\temp返回的宏是否\pgfkeysgetvalue\empty。但它没有打印任何内容。我查看了这些相关文章:

如何检查宏值是否为空或不会使用纯 TeX 条件创建文本?

为什么 \ifx 在 TikZ 中的节点命令中不起作用?

\pgfutil@empty 和 \ifx 环境中的 \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 组之外(如果需要的话)。

相关内容