带有 sgplot 的 ODS PDF:如何每页制作一个 TOC 书签(每页有两个图表)
ODS PDF with sgplot: How to make one TOC bookmark per page (with two graphs per page)
我正在使用 ODS 创建 PDF,每页有两个图表。两个图都具有相同的类型变量值,如下所示 'month'。我想为每个页面创建一个目录书签,它引用最高级别变量的值(下面的'year')。 'year' 可以有任意数量的值,但每年只有两个 'month' 值。我不想要多级书签,每页一个。
我查看了 ODS 文档,但我不知道如果我有不确定数量的图表是否可以将其用于此目的。
这是我现在拥有的:
data new;
do year = 1 to 5;
do month = 1 to 2;
do day = 1 to 10;
emp = year*month*day;
output;
end;
end;
end;
run;
ods pdf file='K:\brent\test_graphs_pages.pdf' startpage=never;
proc sgplot data=new;
by year month;
series x = day y = emp;
run;
ods pdf close;
它给我三个级别的书签,每页两个书签。我怎样才能每页只得到一个?另外,为什么第 2 年的书签 link 到第 1 年的页面?
谢谢
这听起来确实像是 PROC DOCUMENT 问题。您可能需要使用宏语言来生成代码,因为我认为其中一些代码在 proc document
(主要是 setlabel
部分)内不能完全自动化,但大体上是:
ods document
生成文档
proc document
然后到 move
与 where
month=1 和 month=2 条目到单个 dir
proc document
与 setlabel
使用 #BYVAL(YEAR)
正确设置标签
proc document
replay
输出文档。
这是第一部分 - 您仍然想要自定义标签,就像我说的那样,您需要使用宏语言自动执行此操作。
data new;
do year = 1 to 5;
do month = 1 to 2;
do day = 1 to 10;
emp = year*month*day;
output;
end;
end;
end;
run;
ods document name=TOCtest(write);
ods pdf file='h:\temp\test_graphs_pages_before.pdf' startpage=never;
proc sgplot data=new;
by year month;
series x = day y = emp;
run;
ods pdf close;
ods document close;
ods listing;
proc document name=TOCtest;
list / levels=all; run;
make \Year1;
move \SGPlot#1\ByGroup1#1\SGPlot#1 to \Year1#1;
move \SGPlot#1\ByGroup2#1\SGPlot#1 to \Year1#1;
delete \SGPlot#1\ByGroup1#1;
delete \SGPlot#1\ByGroup2#1;
make \Year2;
move \SGPlot#1\ByGroup3#1\SGPlot#1 to \Year2#1;
move \SGPlot#1\ByGroup4#1\SGPlot#1 to \Year2#1;
delete \SGPlot#1\ByGroup3#1;
delete \SGPlot#1\ByGroup4#1;
make \Year3;
move \SGPlot#1\ByGroup5#1\SGPlot#1 to \Year3#1;
move \SGPlot#1\ByGroup6#1\SGPlot#1 to \Year3#1;
delete \SGPlot#1\ByGroup5#1;
delete \SGPlot#1\ByGroup6#1;
make \Year4;
move \SGPlot#1\ByGroup7#1\SGPlot#1 to \Year4#1;
move \SGPlot#1\ByGroup8#1\SGPlot#1 to \Year4#1;
delete \SGPlot#1\ByGroup7#1;
delete \SGPlot#1\ByGroup8#1;
make \Year5;
move \SGPlot#1\ByGroup9#1\SGPlot#1 to \Year5#1;
move \SGPlot#1\ByGroup10#1\SGPlot#1 to \Year5#1;
delete \SGPlot#1\ByGroup9#1;
delete \SGPlot#1\ByGroup10#1;
run;
list /details levels=all; run;
ods pdf file="h:\temp\test_graph_pages_after.pdf" startpage=never;
replay ^
run;
ods pdf close;
这仍然表现出您之前注意到的“一次性”问题。对于 startpage=never 这似乎是不可避免的 - 我不确定那里的解决方法,可能值得联系 support@sas.com 因为它可能是一个错误。他们在 9.4m1/m2 中有一个类似的错误已修复,但并不完全相同。
我正在使用 ODS 创建 PDF,每页有两个图表。两个图都具有相同的类型变量值,如下所示 'month'。我想为每个页面创建一个目录书签,它引用最高级别变量的值(下面的'year')。 'year' 可以有任意数量的值,但每年只有两个 'month' 值。我不想要多级书签,每页一个。
我查看了 ODS 文档,但我不知道如果我有不确定数量的图表是否可以将其用于此目的。
这是我现在拥有的:
data new;
do year = 1 to 5;
do month = 1 to 2;
do day = 1 to 10;
emp = year*month*day;
output;
end;
end;
end;
run;
ods pdf file='K:\brent\test_graphs_pages.pdf' startpage=never;
proc sgplot data=new;
by year month;
series x = day y = emp;
run;
ods pdf close;
它给我三个级别的书签,每页两个书签。我怎样才能每页只得到一个?另外,为什么第 2 年的书签 link 到第 1 年的页面?
谢谢
这听起来确实像是 PROC DOCUMENT 问题。您可能需要使用宏语言来生成代码,因为我认为其中一些代码在 proc document
(主要是 setlabel
部分)内不能完全自动化,但大体上是:
ods document
生成文档proc document
然后到move
与where
month=1 和 month=2 条目到单个dir
proc document
与setlabel
使用#BYVAL(YEAR)
正确设置标签proc document
replay
输出文档。
这是第一部分 - 您仍然想要自定义标签,就像我说的那样,您需要使用宏语言自动执行此操作。
data new;
do year = 1 to 5;
do month = 1 to 2;
do day = 1 to 10;
emp = year*month*day;
output;
end;
end;
end;
run;
ods document name=TOCtest(write);
ods pdf file='h:\temp\test_graphs_pages_before.pdf' startpage=never;
proc sgplot data=new;
by year month;
series x = day y = emp;
run;
ods pdf close;
ods document close;
ods listing;
proc document name=TOCtest;
list / levels=all; run;
make \Year1;
move \SGPlot#1\ByGroup1#1\SGPlot#1 to \Year1#1;
move \SGPlot#1\ByGroup2#1\SGPlot#1 to \Year1#1;
delete \SGPlot#1\ByGroup1#1;
delete \SGPlot#1\ByGroup2#1;
make \Year2;
move \SGPlot#1\ByGroup3#1\SGPlot#1 to \Year2#1;
move \SGPlot#1\ByGroup4#1\SGPlot#1 to \Year2#1;
delete \SGPlot#1\ByGroup3#1;
delete \SGPlot#1\ByGroup4#1;
make \Year3;
move \SGPlot#1\ByGroup5#1\SGPlot#1 to \Year3#1;
move \SGPlot#1\ByGroup6#1\SGPlot#1 to \Year3#1;
delete \SGPlot#1\ByGroup5#1;
delete \SGPlot#1\ByGroup6#1;
make \Year4;
move \SGPlot#1\ByGroup7#1\SGPlot#1 to \Year4#1;
move \SGPlot#1\ByGroup8#1\SGPlot#1 to \Year4#1;
delete \SGPlot#1\ByGroup7#1;
delete \SGPlot#1\ByGroup8#1;
make \Year5;
move \SGPlot#1\ByGroup9#1\SGPlot#1 to \Year5#1;
move \SGPlot#1\ByGroup10#1\SGPlot#1 to \Year5#1;
delete \SGPlot#1\ByGroup9#1;
delete \SGPlot#1\ByGroup10#1;
run;
list /details levels=all; run;
ods pdf file="h:\temp\test_graph_pages_after.pdf" startpage=never;
replay ^
run;
ods pdf close;
这仍然表现出您之前注意到的“一次性”问题。对于 startpage=never 这似乎是不可避免的 - 我不确定那里的解决方法,可能值得联系 support@sas.com 因为它可能是一个错误。他们在 9.4m1/m2 中有一个类似的错误已修复,但并不完全相同。