ifthen 和 spreadtab

ifthen 和 spreadtab

我使用spreadtabxifthen包来计算百分位数,但我发现了一个不寻常的行为。我给出了一个错误结果的例子:一个 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" ifltifeqifgt由 提供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本机的ifltifeqifgt,并向包作者提出功能请求ifoddifeven测试......


先前的答案(过时的)。

这是一个解决方法

\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处理定点数。

fpREADME中提供了更完整的操作列表

 - 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

相关内容