需要加载 expl3 代码吗?

需要加载 expl3 代码吗?

请考虑以下示例:

\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

相关内容