问题
是否可以定义内部包含多个语句的函数?
背景
我想通过定义函数来自动化创建堆积图所涉及的一些计算。特别的,我希望有像下面这样的代码:
mp_setup(bottom_margin, top_margin) = \
set tmargin 0; \
set bmargin 0; \
mp_available_height = 1.0 - top_margin - bottom_margin; \
mp_current_height = bottom_margin;
mp_plot(plot_height) = \
mp_plot_size = plot_height * mp_available_height; \
set origin 0,mp_current_height; \
set size 1,mp_plot_size; \
mp_current_height = mp_current_height + mp_plot_size;
预期使用目的是:
...
set multiplot
mp_setup(0.05, 0.05)
mp_plot(1.0/3.0)
plot ...
mp_plot(2.0/3.0)
plot ...
这样做可以自动将图形堆叠在一起,而不需要为每个图形计算原点和大小。
问题
上面定义函数的方式不可行,因为似乎函数定义的解析在第一个分号处结束;但是这些分号是必需的,以便分隔每个语句(否则,我们会得到无效的“set tmargin 0 set bmargin 0…”)。
似乎Gnuplot不支持任何分组语句的方法(如C/C++中的“{...}”);或者至少我从未遇到过。
可能的解决方案
我知道的唯一存储多个函数并评估它们的方法是使用宏:
mp_setup = "<as above>"
mp_plot = "<as above>"
然而,这里的问题在于宏不允许传递参数,相反,每个变量都必须事先声明,如下所示:
...
set multiplot
top_margin = 0.05
bottom_margin = 0.05
@mp_setup
plot_height = 1.0/3.0
@mp_plot
plot ...
plot_height = 2.0/3.0
@mp_plot
plot ...
尽管这个解决方案应该可以运行,但并不那么优雅。
难道没有其他方法可以实现吗?
eval
,另一种是使用语法set multiplot layout ... margins ... spacing ...
,这是在5.0版本中新增的(在新年发布)。 - Christoph