pgfplotstable:使用 create col/assign/.code 定义新列时使用命令吗?

pgfplotstable:使用 create col/assign/.code 定义新列时使用命令吗?

假设我定义了下表mytable

\pgfplotstableread{
a b
1 100
3 200
5 300
}\mytable

我想创建一个label包含的新列<a> (<b>)。我希望b值采用不同的颜色。我可以将新列设为不带颜色,也可以这样做

\pgfplotstablecreatecol[
   create col/assign/.code={%
     \getthisrow{a}\vala
     \getthisrow{b}\valb
     \edef\newentry{\vala (\valb)}%
     \pgfkeyslet{/pgfplots/table/create col/next content}\newentry
   }%
]{label}{\mytable}

或者

\pgfplotstablecreatecol[
   create col/assign/.code={%
     \edef\newentry{\thisrow{a} (\thisrow{b})}%
     \pgfkeyslet{/pgfplots/table/create col/next content}\newentry
   }%
]{label}{\mytable}

但如果我尝试将其更改为,\edef\newentry{\thisrow{a} \textcolor{blue}{(\thisrow{b})}}则会收到以下错误:

错误:未定义控制序列。

--- TeX said ---
\tikz@deactivatthings ->\def ;
                              {\tikz@nonactivesemicolon }\def :{\[email protected] ]{label}{\twenty}

我非常确定问题是由扩展/转义问题引起的,但我真的不知道如何解决它们。如果a或中的原始值b包含类似的东西\textcolor{blue}{100},我会得到同样的错误,所以手动更改b列不是一个选择。

答案1

解决方案是添加\noexpand到命令中\textcolor,例如

\pgfplotstablecreatecol[
   create col/assign/.code={%
     \getthisrow{a}\vala
     \getthisrow{b}\valb
     \edef\newentry{\vala \noexpand\textcolor{blue}{(\valb)}}%
     \pgfkeyslet{/pgfplots/table/create col/next content}\newentry
   }%
]{label}{\mytable}

或者

\pgfplotstablecreatecol[
   create col/assign/.code={%
     \edef\newentry{\thisrow{a} \noexpand\textcolor{blue}{(\thisrow{b})}}%
     \pgfkeyslet{/pgfplots/table/create col/next content}\newentry
   }%
]{label}{\mytable}

我把这个作为问答发布,因为我很难找到答案(比如)希望这可以为其他人节省几个小时。

相关内容