我有一个函数 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}