假设我定义了下表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}
我把这个作为问答发布,因为我很难找到答案(比如这)希望这可以为其他人节省几个小时。