请考虑以下示例:
\documentclass{article}
\usepackage{pst-plot}
\usepackage[locale=DE]{siunitx}
% Self-brewed macro.
\def\andel#1{%
\calculate{#1/(\Nord+\MidtVest+\Oestjylland+\Syd+\Fyn+\Oest+\Bornholm+\Lorry)*100}
}
\def\seere#1#2{%
\psframe[dimen=middel,fillstyle=solid,fillcolor=red!45]%
(!2 #1 mul 1 sub \bredde 2 div sub 0)%
(!2 #1 mul 1 sub \bredde 2 div add #2)
\rput(!2 #1 mul 1 sub #2 5 add){\scriptsize\num{#2 000}}
\rput{90}(!2 #1 mul 1 sub #2 2 div){%
\scriptsize\SI[round-mode=places,round-precision=1]{\andel{#2}}{\percent}%
}
}
% PSTricks stuff from Herbert.
\makeatletter
\def\pst@@@vlabel#1{%
\edef\@xyDecimals{\psk@yDecimals}%
\ifodd\psk@labels % labelss=all||y (0,2)
\else%
\ifnum#1=0 \psvlabel{\expandafter\@LabelComma#1..\@nil}%
\else \psvlabel{\expandafter\@LabelComma#1..\@nil\psk@ylabelFactor}%
\fi
\fi%
}%
\makeatother
% LaTeX 3 syntax.
\ExplSyntaxOn
\cs_new_eq:NN \calculate \fp_eval:n
\ExplSyntaxOff
\begin{document}
\begin{figure}
% Column width.
\def\bredde{0.7 }
% Constants.
\def\Nord{86}
\def\MidtVest{87}
\def\Oestjylland{107}
\def\Syd{147}
\def\Fyn{102}
\def\Oest{125}
\def\Bornholm{16}
\def\Lorry{210}
% Settings.
\centering
\psset{xunit=0.56cm,yunit=0.04cm}
% Drawing.
\begin{pspicture}(-2.5,-42)(19.1,238)
\psaxes[
xAxis=false,
Dy=20,
dy=20,
ylabelFactor={\cdot 10^3}
]{->}(0,0)(16,230)
\psaxes[
yAxis=false,
ticks=none,
mathLabel=false,
xLabels={
,Nord,
,Midt-Vest,
,{\O}stjylland,
,Syd,
,Fyn,
,{\O}st,
,Bornholm,
,Lorry,
},
xLabelsRot=90
]{->}(0,0)(16,230)[Tv-stationer,0][Seere,90]
\multido{\i=20+20}{11}{\psline[linestyle=dotted](0,\i)(16,\i)}
\seere{1}{\Nord}
\seere{2}{\MidtVest}
\seere{3}{\Oestjylland}
\seere{4}{\Syd}
\seere{5}{\Fyn}
\seere{6}{\Oest}
\seere{7}{\Bornholm}
\seere{8}{\Lorry}
\end{pspicture}
\end{figure}
\end{document}
是否可以在宏中进行计算\andel
并在\SI
宏中使用它,而无需加载以下代码?
\ExplSyntaxOn
\cs_new_eq:NN \calculate \fp_eval:n
\ExplSyntaxOff
答案1
可以使用的代码\fp_eval:n
已由 加载siunitx
。问题只是在于如何获取它;它无法\fp_eval:n
在正常环境中使用,因为它不是用户级的合法控制序列名称。
\ExplSyntaxOn
和命令\ExplSyntaxOff
设置 TeX 生成\fp_eval:n
合法的控制序列名称,就像允许在名称中使用带有 的传统\makeatletter
和\makeatother
命令一样。因此@
\ExplSyntaxOn
\cs_new_eq:NN \calculate \fp_eval:n
\ExplSyntaxOff
为强大的计算功能定义一个“用户级”接口。如果你害怕它,一个等效的方法是
\expandafter\let\expandafter\calculate\csname fp_eval:n\endcsname