Использовать пользовательский класс вместо GraphValueText для опции textattrs в шаблоне PROC?
Использование SAS 9.3 и попытка придерживаться DRY путем определения собственного стиля и использования его с несколькими операторами ENTRY в блоке statgraph PROC TEMPLATE.
Пользовательский стиль:
proc template;
define style llama;
parent=styles.fancyPrinter;
style CustomFonts from GraphFonts /
'GraphValueFont'=("<sans-serif>, <MTsans-serif>",25pt,italic)
;
class foo from GraphValueText /
font = CustomFonts('GraphValueFont')
color = GraphColors('gtext');
end;
run;
и затем открывается параметром style= в операторе ODS. Я пытаюсь использовать Foo:
Entry halign=left "bar / 1000" / textattrs=foo;
но получите сообщение журнала:
ПРИМЕЧАНИЕ. Элемент стиля 'foo' в опции TEXTATTRS недопустим. По умолчанию будет использоваться.
Он отлично работает, когда TEXTATTRS установлен с использованием такого определения (но, поскольку я использую его несколько раз, он не будет СУХИМЫМ):
textattrs=GraphValueText(weight=bold size=16pt color=CX800080)
Кроме того, я знаю, что ODS читает определение стиля, потому что если я это сделаю:
style GraphFonts from GraphFonts
и изменить шрифты, это повлияет на графики.
1 ответ
К сожалению, у меня нет хорошего ответа на вопрос, как это сделать, хотя возможно, что он существует.
Я думаю, что GTL не совсем тебя слушает. Например:
proc template;
define style llama;
parent=styles.fancyPrinter;
style CustomFonts from GraphFonts /
'GraphValueFont'=("<sans-serif>, <MTsans-serif>",25pt,italic)
;
style graphUnicodeText from GraphValueText /
color=red;
style graphValueText from GraphValueText/
color=green;
end;
run;
proc template;
define statgraph entry;
begingraph;
layout overlay;
entry halign=right "First entry statement" /
valign=top textattrs=graphValueText;
histogram weight;
entry halign=right "Second entry statement" /
textattrs=graphUnicodeText;
entry halign=right "Third entry statement" /
valign=bottom pad=(bottom=40px);
endlayout;
endgraph;
end;
run;
ods _all_ close;
ods html file="c:\temp\test.html" path="" gpath="c:\temp\" style=llama;
proc sgrender data=sashelp.class template=entry;
run;
ods html close;
Обратите внимание, что вы не получаете никаких ошибок о GraphUnicodeText... но вы также не получаете никакого эффекта от него. Я предполагаю, что GTL выполняет свою работу только с частичным пониманием стиля и, следовательно, не всегда может уважать то, что вы просите его сделать.
Мое предложение (по крайней мере, до тех пор, пока Санджай, Дэн или подобные им не помогут вам найти лучший вариант) - использовать для этой цели макропеременную и / или динамическую переменную.
proc template;
define style llama;
parent=styles.fancyPrinter;
style CustomFonts from GraphFonts /
'GraphValueFont'=("<sans-serif>, <MTsans-serif>",25pt,italic)
;
style graphUnicodeText from GraphValueText /
color=red;
style graphValueText from GraphValueText/
color=green;
end;
run;
proc template;
define statgraph entry;
begingraph;
layout overlay;
dynamic entrycolor;
entry halign=right "First entry statement" /
valign=top;
histogram weight;
entry halign=right "Second entry statement" /
textattrs=(color=entrycolor);
entry halign=right "Third entry statement" /
valign=bottom pad=(bottom=40px);
endlayout;
endgraph;
end;
run;
ods _all_ close;
ods html file="c:\temp\test.html" path="" gpath="c:\temp\" style=llama;
proc sgrender data=sashelp.class template=entry;
dynamic entrycolor="red";
run;
ods html close;
Затем вы можете использовать повторно entrycolor
в нескольких местах в шаблоне, и разрешить его указывать пользователем во время выполнения. Это не идеально, но это работает, по крайней мере...