
Quero adicionar um contador baseado em um ifboolexpr usando o etoolbox, mas não consigo fazê-lo funcionar como esperava.
Quero colocar várias condições ao longo do meu documento e, no final, contar quantas vezes elas foram atendidas. Como quero criar uma soma das várias contagens no final.
Posso fazer os básicos marcados como DIVCNT e MARCNT no meu MWE abaixo.
mas o resultado \SPDD não será adicionado ao contador marcado como SPDCNT.
Estranhamente, individualmente, ele reconhece a condicional, mas essas condicionais (marcadas como CONTADOR 1 e CONTADOR 2) na saída do MWE não parecem ser adicionadas ao contador
Alguma sugestão sobre o que estou fazendo de errado? aqui está meu 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}
Responder1
A macro \spdd
que você verifica se está em branco é um comando (definido com \newcommand
), portanto você pode usar o \ifdefempty
teste de etoolbox
. Este teste já fornece uma parte True e False, então você não precisa \ifboolexpr
de um test
. Esta macro simplificada também é adequada para ser usada como argumento para a macro de incremento do contador.
Outra questão é que você define a macro \spchk
duas vezes, exatamente com a mesma definição. Isso é redundante, você pode defini-lo uma vez no início do documento e usá-lo inúmeras vezes depois.
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*{\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}
Resultado: