根据条件 ifboolexpr 有条件地添加到计数器

根据条件 ifboolexpr 有条件地添加到计数器

我想使用 etoolbox 添加基于 ifboolexpr 的计数器,但无法让它按我希望的方式工作。

我想在文档中放置各种条件,然后在最后计算出满足这些条件的次数。因为我想在最后计算出各种计数的总和。

我可以完成下面 MWE 中标记为 DIVCNT 和 MARCNT 的基本操作。

但 \SPDD 结果不会添加到标记为 SPDCNT 的计数器中。

奇怪的是,它单独识别了条件,但 MWE 输出中的那些条件(标记为 COUNTER 1 和 COUNTER 2)似乎没有添加到计数器中

关于我做错什么有什么建议吗?这是我的 MWE:

\documentclass{article}


\usepackage{etoolbox}


\newcounter{divcnt}
\newcommand*{\divcnt}[1]{\addtocounter{divcnt}{#1}}
\newcommand*{\totaldivcnt}{\thedivcnt}

\newcounter{marcnt}
\newcommand*{\marcnt}[1]{\addtocounter{marcnt}{#1}}
\newcommand*{\totalmarcnt}{\themarcnt}

\newcounter{spdcnt}
\newcommand*{\spdcnt}[1]{\addtocounter{spdcnt}{#1}}
\newcommand*{\totalspdcnt}{\thespdcnt}

\newcommand*{\spdd}{}
\newcommand*{\spchk}{}

\begin{document}

\renewcommand{\spdd}{2000}

\renewcommand*{\spchk}{
\ifboolexpr{
test {\notblank{\spdd}}
}
{1}{0}
}
First Counter \spdcnt{\spchk} \\

\renewcommand{\spdd}{2020}

\renewcommand*{\spchk}{
\ifboolexpr{
test {\notblank{\spdd}}
}
{1}{0}
}

Second Counter \spdcnt{\spchk} \\

\divcnt{0} 
\divcnt{1} 
\divcnt{1} 
\divcnt{0} 

\marcnt{1} 
\marcnt{1} 
\marcnt{1} 
\marcnt{1}
\marcnt{1}

Total MAR Count: \totalmarcnt{} \\

Total DIV Count: \totaldivcnt{} \\

Total SPD Count: \totalspdcnt{} \\

Sum of discrepancies: \the\numexpr\themarcnt-\thedivcnt-\thespdcnt\relax


\end{document}

答案1

您检查是否为空的宏\spdd是一个命令(用 定义\newcommand),因此您可以使用\ifdefempty中的测试etoolbox。此测试已经提供了 True 和 False 部分,因此您不需要使用\ifboolexprtest这个简化的宏也适合用作计数器增量宏的参数。

另一个问题是,你定义了两次宏\spchk,并且定义完全相同。这是多余的,你可以在文档开始时定义一次,然后以后多次使用它。

梅威瑟:

\documentclass{article}
\usepackage{etoolbox}

\newcounter{divcnt}
\newcommand*{\divcnt}[1]{\addtocounter{divcnt}{#1}}
\newcommand*{\totaldivcnt}{\thedivcnt}

\newcounter{marcnt}
\newcommand*{\marcnt}[1]{\addtocounter{marcnt}{#1}}
\newcommand*{\totalmarcnt}{\themarcnt}

\newcounter{spdcnt}
\newcommand*{\spdcnt}[1]{\addtocounter{spdcnt}{#1}}
\newcommand*{\totalspdcnt}{\thespdcnt}

\newcommand*{\spdd}{}
\newcommand*{\spchk}{}

\begin{document}

\renewcommand*{\spchk}{%
\ifdefempty{\spdd}{0}{1}%
}

\renewcommand{\spdd}{2000}

First Counter \spdcnt{\spchk} \\

\renewcommand{\spdd}{2020}

Second Counter \spdcnt{\spchk} \\

\divcnt{0} 
\divcnt{1} 
\divcnt{1} 
\divcnt{0} 

\marcnt{1} 
\marcnt{1} 
\marcnt{1} 
\marcnt{1}
\marcnt{1}

Total MAR Count: \totalmarcnt{} \\

Total DIV Count: \totaldivcnt{} \\

Total SPD Count: \totalspdcnt{} \\

Sum of discrepancies: \the\numexpr\themarcnt-\thedivcnt-\thespdcnt\relax
\end{document}

结果:

在此处输入图片描述

相关内容