pgfmath:大量数字组合的比较

pgfmath:大量数字组合的比较

我有一个函数 Zstart(n, l),它输出某些组合 (n, l) 的起始数字(从此开始填充相应的轨道)。

一切正常,但出于兴趣提出疑问:这可以更容易地实现吗(在 pgfmath 中)。

在此处输入图片描述

\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{tikz}
\begin{document}
\tikzset{
declare function={
Zstart(\n,\l)=(%
\n==1 && \l==0 ? 1% 1s 
: (\n==2 && \l==0 ? 3% 2s 
: (\n==3 && \l==0 ? 11% 3s 
: (\n==4 && \l==0 ? 19% 4s 
: (\n==5 && \l==0 ? 37% 5s 
: (\n==6 && \l==0 ? 55% 6s 
: (\n==7 && \l==0 ? 87% 7s 
: (\n==8 && \l==0 ? 119% 8s 
: (\n==2 && \l==1 ? 5% 2p 
: (\n==3 && \l==1 ? 13% 3p 
% ....
: -1))))))) ))% ....
);
},
}

Examples: 

\foreach \n/\l  in {1/0, 4/0, 2/1, 55/66}{
Zstart(\n, \l) = \pgfmathprint{Zstart(\n, \l)} \\ 
}
\end{document}

答案1

正如该问题的先前版本中已经说过的那样,pgfmath 和特别是 tikz(!!!) 在这里完全是错误的工具。

在此处输入图片描述

\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{tikz}
\begin{document}

\def\Zstart#1#2{%
\ifcase\numexpr#2\relax
\ifcase\numexpr#1\relax-1\or1\or3\or11\or19\or37\or55\or\87\or119\else-1\fi% l=0
\or
\ifcase\numexpr#1\relax-1\or-1\or5\or13\else-1\fi % l=1
\else
-1%
\fi}


Examples: 

\foreach \n/\l  in {1/0, 4/0, 2/1, 55/66}{
Zstart(\n, \l) = \Zstart{\n}{\l} \par
}
\end{document}

答案2

如果你不使用tikz这个math库,那就太过分了。但是如果你已经因为其他原因加载了它tikz,那么你大概可以这样使用它。

\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}

\tikzmath{
  % predefined values in array
  let \zstart={{{-1,-1},{1,-1},{3,5},{11,13},{19,-1},{37,-1},{55,-1},{87,-1},{119,-1}}};
  % function that checks the index validity and output the result
  function Zstart(\n,\l) {
    int \result;
    if \n < 0 || \n > 8 || \l < 0 || \l > 1 then {
      \result=-1;
    } else {
      \result=\zstart[\n][\l];
    };
    {\result};
  };
}
\begin{document}

  Examples:

  \foreach \n/\l  in {1/0, 4/0, 2/1, 55/77}{
    Zstart(\n, \l) = \tikzmath{Zstart(\n,\l);} \\
  }
\end{document}

在此处输入图片描述

相关内容