![ifthen 和 spreadtab](https://linux22.com/image/324888/ifthen%20%E5%92%8C%20spreadtab.png)
我使用spreadtab
和xifthen
包来计算百分位数,但我发现了一个不寻常的行为。我给出了一个错误结果的例子:一个 true 命令在电子表格中使用时仍然是 false。该命令
\ifthenelse{\isodd{19}\and\isodd{21}}{True}{False}
在下表中,正确的内容被表示为错误的内容:
\begin{spreadtab}{{tabular}{|c|c|c|}}
\hline
19 & 21
\\ \hline
\ifthenelse{\isodd{:={[0,-1]}}\and\isodd{:={[1,-1]}}}{True}{False}
&
\\ \hline
\end{spreadtab}
这是什么原因?我该如何坚持下去?我在这里举一个例子,可以看到测试在表格之外取得了良好的结果
\documentclass[12pt]{article}
\usepackage{spreadtab}
\usepackage{xifthen}
\usepackage{polyglossia}
\setmainlanguage{english}
\begin{document}
\begin{spreadtab}{{tabular}{|c|c|c|}}
\hline
19 & 21
\\ \hline
\ifthenelse{\isodd{:={[0,-1]}}\and\isodd{:={[1,-1]}}}{True}{False}
&
\\ \hline
\end{spreadtab}
\ifthenelse{\isodd{19}\and\isodd{21}}{True}{False}
\end{document}
从“jfbu”的回答中,我看到这取决于所使用的测试,并给出了我使用的原始测试。此文件无法编译。
\documentclass[12pt]{article}
\usepackage{spreadtab}
\usepackage{xifthen}
\usepackage{polyglossia}
\setmainlanguage{english}
\newtest{\ainfb}[2]{%
\cnttest{(#1)}{<=}{(#2)}%
}
\begin{document}
\begin{spreadtab}{{tabular}{|c|c|c|}}
\hline
19 & 21
\\ \hline
\ifthenelse{\ainfb{:={[0,-1]}}{20}\and\ainfb{20}{:={[1,-1]}}}{T}{F}
&
\\ \hline
\end{spreadtab}
\ifthenelse{\isodd{19}\and\isodd{21}}{True}{False}
\end{document}
更新
我尝试使用 @jfbu 建议的“xintexpr”包来测试值,但仍然遇到一些问题。我在这里给出了一个计算百分位数的示例(此处为 P_{25})。可以看到,为此目的提供宏的良好命令是:
\multicolumn{5}{m{8cm}|}{\xintifboolexpr{{:={[0,-1]}<=25} 'and' {25<=:={[1,-1]}}}
但该宏被程序拒绝,并给出代码错误
'!未定义的控制序列。\XINT_expr_unknown_variable'。
我将 ':={[1,-1]}' 替换为 33.33,然后编译成功。我这样做是为了展示我想用这个程序做什么,但很明显这不是一个通用的解决方案。所以我有两个问题
1/ 我怎样才能执行类似
'\xintifboolexpr{{:={[0,-1]}}{=25}' 和 '{25<=:={[1,-1]}}'?
2 / 我已经完成了下一个单元格中百分位数的计算,因为必须通过命令完成的计算
'':={[0,-6]+(25-[0,-2])*([1,-6]-[0,-6])/([1,-2]-[0,-2])}''
测试单元格中的 不会被执行,并被视为字符...每当我添加 @ 时。我怎样才能做到这一点?
我给出 tex 文件:
\documentclass[12pt]{article}
\usepackage{spreadtab}
\usepackage{array}
\usepackage{polyglossia}
\setmainlanguage{english}
\usepackage{xintexpr}
\begin{document}
\STautoround{2}
\begin{spreadtab}{{tabular}{|m{3.2cm}|c|c|c|c|c|c|}}
\hline
@ \raggedright Bounds &1 & :={[-1,0]+ 5}& :={[-1,0]+ 5}
& :={[-1,0]+5}& :={[-1,0]+ 5}& :={[-1,0]+5}
\\\hline
@ Intervals & @(<<[0,-1]>>-<<[1,-1]>>(& @(<<[0,-1]>>-<<[1,-1]>>(& @(<<[0,-1]>>-<<[1,-1]>>(
&@(<<[0,-1]>>-<<[1,-1]>>(&@(<<[0,-1]>>-<<[1,-1]>>(&
\\\hline
@ Freq.&2&18&30&8&2&
\\\hline
@ Freq. Cum.&:={[0,-1]}&:={[0,-1]+[-1,0]}&:={[0,-1]+[-1,0]}&:={[0,-1]+[-1,0]}&:={[0,-1]+[-1,0]}&
\\\hline
@ Rel. Freq. Cum.&:={[0,-1]*100/[4,-1]}&:={[0,-1]*100/[3,-1]}&:={[0,-1]*100/[2,-1]}&:={[0,-1]*100/[1,-1]}&:={[0,-1]*100/[0,-1]}&
\\\hline
@\raggedright Percentile
&
%%% The wanted command %%%
%\multicolumn{5}{m{8cm}|}{\xintifboolexpr{{:={[0,-1]}<=25} 'and' {25<=:={[1,-1]}}}
\multicolumn{5}{m{8cm}|}{\xintifboolexpr{{:={[0,-1]}<=25} 'and' {25<=33.33}}
{$<<[0,-1]>>\leq 25\leq <<[1,-1]>>\Longrightarrow P_{25}\in(<<[0,-5]>>,<<[1,-5]>>($
}{FALSE}
}
\\\hline
&
%%%\multicolumn{5}{m{8cm}|}{\xintifboolexpr{{:={[0,-1]}<=25} 'and' {25<=:={[1,-1]}}}
\multicolumn{5}{m{8cm}|}{\xintifboolexpr{{:={[0,-2]}<=25} 'and' {25<=33.33}}
{\raggedleft $ P_{25}=<<[0,-6]>>+\frac{25-<<[0,-2]>>}{<<[1,-2]>>-<<[0,-2]>>}(<<[1,-6]>>-<<[0,-6]>>)=$}{FALSE}
}
&:={[-5,-6]+(25-[-5,-2])*([-4,-6]-[-5,-6])/([-4,-2]-[-5,-2])}
\\\hline
\end{spreadtab}
\end{document}
答案1
抱歉,我还没有充分阅读spreadtab
文档。
这可能是更好的方法(假设您想使用xifthen
布尔值):
\documentclass{article}
\usepackage{spreadtab}
\usepackage{xifthen}
\usepackage{polyglossia}
\setmainlanguage{english}
\begin{document}\thispagestyle{empty}\Huge
\begin{spreadtab}{{tabular}{|c|c|}}
\hline
19 & 21
\\ \hline
@\ifthenelse{\isodd{<<[0,-1]>>}\and\isodd{<<[1,-1]>>}}{True}{False}
&%
\\ \hline
\end{spreadtab}
\end{document}
我不确定<<..>>
东西是否可以在括号内使用,但事实确实如此。
输出:
在评论中,有人要求进行比较测试。您已预定义"macro-functions"
iflt
,ifeq
,ifgt
由 提供spreadtab
。
\documentclass{article}
\usepackage{spreadtab}
%\usepackage{xifthen}
\usepackage{polyglossia}
\setmainlanguage{english}
\usepackage{xintexpr}
\begin{document}\thispagestyle{empty}\Huge
\begin{spreadtab}{{tabular}{|c|c|c|c|}}
\hline
19 & 20 & 21.5 & 37.8\\
\hline
iflt([0,-1],[1,-1],[2,-1]+[3,-1],[2,-1]-[3,-1])&&&
\\
\hline
\end{spreadtab}
\end{document}
% Local Variables:
% TeX-engine: luatex
% End:
但是如果你想根据这样的比较测试打印一些文本内容,似乎必须恢复使用@
和 的技术<<
。>>
例如\xintifboolexpr
:
\documentclass{article}
\usepackage{spreadtab}
%\usepackage{xifthen}
\usepackage{polyglossia}
\setmainlanguage{english}
\usepackage{xintexpr}
\begin{document}\thispagestyle{empty}\Huge
\begin{spreadtab}{{tabular}{|c|c|c|c|}}
\hline
19 & 20 & 21.5 & 37.8\\
\hline
@\xintifboolexpr{odd(<<[0,-1]>>) && odd(<<[1,-1]>>)}{T}{not both are odd}
&@\xinttheiexpr[1] (odd(<<a1>>) 'and' odd(<<b1>>))?{<<c1>>+<<d1>>}{<<a1>>+<<b1>>}\relax
&@\xinttheiexpr[1] (odd(<<a1>>) 'or' odd(<<b1>>))?{<<c1>>+<<d1>>}{<<a1>>+<<b1>>}\relax
&
\\
\hline
\end{spreadtab}
\end{document}
% Local Variables:
% TeX-engine: luatex
% End:
在此示例中,一个单元格使用 @\xintifboolexpr {boolean expression}{True text}{False text}
。
其他单元格根据布尔条件使用语法进行计算\xinttheiexpr[d] ... \relax
(其中[d]
是输出中小数点后要打印的位数)。在后者中&
不能使用 naked ,而使用'and'
而不是&&
。在前一个示例中,被表格中的\xintifboolexpr
括号&&
隐藏,不会与制表符混淆。
警告:以这种方式通过 和某些数学引擎计算数值的单元格
@
不被 视为“数字单元格”spreadtab
。因此,类似这样的引用b2
不起作用。结论:对于数值条件评估,尽可能多地使用
spreadtab
本机的iflt
、ifeq
和ifgt
,并向包作者提出功能请求ifodd
和ifeven
测试......
先前的答案(过时的)。
这是一个解决方法
\documentclass{article}
\usepackage{spreadtab}
\usepackage{xifthen}
\usepackage{polyglossia}
\setmainlanguage{english}
\begin{document}\thispagestyle{empty}
\begin{spreadtab}[\STsavecell\XXX{a1}\STsavecell\YYY{b1}]{{tabular}{|c|c|c|}}
\hline
19 & 21
\\ \hline
@\ifthenelse{\isodd{\XXX}\and\isodd{\YYY}}{True}{False}
&%
\\ \hline
\end{spreadtab}
\end{document}
% Local Variables:
% TeX-engine: luatex
% End:
我目前正在阅读spreadtab
文档。它使用 fp
数学引擎。但是识别的函数是\FPeval
:
Known infix operations are
+, -, *, /, ^ for add, sub, mul, div, pow
Each other operation is a prefix one that needs
a (comma or colon seperated) list of subexpressions.
Exception: The unary prefix operation - is not known!
(Use the function neg instead.)
Example 1:
With
\edef\result{11}
and
\FPeval\result{round(root(2,sin(result + 2.5)):2)}
or
\FPeval{result}{round(root(2,sin(result + 2.5)):2)}
\result becomes the value 0.90
我看不出有明显的“奇数”处理方法,即使使用“trunc”,也能fp
处理定点数。
fp
README中提供了更完整的操作列表
- fp-upn.sty:
The following macros are public ones to be used in the document:
\FPupn#1#2 % #1 := eval(#2) where eval evaluates the
upn-expression #2
Known operations are:
+,add,-,sub,*,mul,/,div,abs,neg,min,max,
round,trunc,clip,e,exp,ln,pow,root,pi,sin,cos,
sincos,tan,cot,tancot,arcsin,arccos,arcsincos,
arctan,arccot,arctancot,pop,swap,copy
where
pop removes the top element
swap exchanges the first two elements
copy copies the top element
看来它们在\FPeval
(我猜除了pop
,, )swap
方面是有意义的copy
。