这可能是一种愚蠢的做法,但请忍耐一下。
我有一个文档,其中我定义了 lua 表中的值,以便在对它们进行一些计算后在表或 pgf 图中重复使用它们。
我的问题是,尽管这种方法似乎对几乎所有事情都有效,但是当我在 pgf 中定义我的 ybar 图并特别是值时symbolic x coords
,它却无法工作,因为它无法解析此时给出的任何内容。
我起初以为这是一个directlua
问题,但事实上,即使使用相同值定义的 LaTeX 命令也不起作用。
只有当我手动输入我想要的值时,文档才会编译。否则我会得到类似这样的错误
! 包 pgfplots 错误:抱歉,输入坐标“1 天”未定义为“symbolic x coords={\xcoordlabelsii }... 可能是拼写错误?或者您指的是 [normalized]1 天?之类的东西。
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgf}
\pgfplotsset{compat=1.13}
\usepgfplotslibrary{units}
\directlua{
labelset={"1 day","1 month","2 months","3 months","6 months","1 year"}
worstcasecache = {3.40, 103.30, 206.61 ,309.91, 619.82, 1239.65 }
bestcasecache = {0.74, 22.37, 44.74, 67.11, 134.22, 268.44}
}
\begin{document}
\begin{tikzpicture}
\newcommand{\xcoordlabelsi}{\directlua{tex.print{table.concat(labelset, " , ")}}}
\newcommand{\xcoordlabelii}{1 day,1 month,2 months,3 months,6 months,1 year}
\begin{axis}[
width = \textwidth,
height = 0.65\textwidth,
ylabel near ticks,
use units,
%x tick label style={/pgf/number format/1000 sep},
ylabel=Data volume,
y unit = B,
y unit prefix = Ti,
symbolic x coords={1 day, 1 month, 2 months, 3 months, 6 months, 1 year}, % works as expected
% symbolic x coords = \directlua{tex.print("{" .. table.concat(labelset, " , ") .. "}")}, % doesn't work
%symbolic x coords = {\xcoordlabelsi}, % doesn't work
%symbolic x coords = {\expandafter\xcoordlabelsii}, % doesn't work
%enlargelimits=0.15,
ybar,
bar width=10pt,
xtick=data,
x tick label style={rotate=45,anchor=east},
ymin = 1,
%xscale = 2,
legend style = {draw=none},
legend cell align = left,
legend pos = north west,
]
\addplot coordinates {\directlua{
for i=1,6 do
tex.print("(" .. labelset[i] .. "," .. bestcasecache[i]*100/1024 .. ")")
end}
};
\addplot coordinates {\directlua{
for i=1,6 do
tex.print("(" .. labelset[i] .. "," .. worstcasecache[i]*100/1024 .. ")")
end}
};
\legend{Best case, Worst case}
\end{axis}
\end{tikzpicture}
\end{document}
答案1
有些键不会执行/扩展其参数,而是立即解析它们。想象一下,您的符号标签中有一些脆弱的宏,如果您扩展它们,则会导致错误,或者其他一些情况可能会导致问题。因此,您必须提供扩展版本。
对于您定义的第二个宏,如果您实际上强制扩展宏,它就会按预期工作:
symbolic x coords/.expand once = \xcoordlabelii,
给出
对于第一个参数,如果你将其展开一次,就会得到数组的典型括号版本,因此 pgfplots 将其视为单个实体,我们得到
symbolic x coords/.expand once = \xcoordlabelsi,
我们可以进一步扩展。因此,如果您使用expand twice
或,expanded
您将看到它会抱怨,因为与表示空格字符a day
不同。因此,您必须删除代码中的空格<_>a day<_>
<_>
directlua
\newcommand{\xcoordlabelsi}{\directlua{tex.print{table.concat(labelset,",")}}}
然后使用
symbolic x coords/.expand twice = \xcoordlabelsi,
它的输出与第一张图片相同。