Условное добавление к Counter на основе условного ifboolexpr

Условное добавление к Counter на основе условного ifboolexpr

Я хочу выполнить добавление к счетчику на основе ifboolexpr с помощью etoolbox, но не могу заставить его работать так, как я надеялся.

Я хочу разместить различные условия по всему документу, а затем в конце получить подсчет того, сколько раз они были выполнены. Поскольку я хочу создать сумму различных подсчетов в конце.

Я могу выполнить основные действия, отмеченные как DIVCNT и MARCNT в моем MWE ниже.

но результат \SPDD не будет добавлен к счетчику, отмеченному как SPDCNT.

Как ни странно, он распознает условные операторы по отдельности, но эти условные операторы (отмеченные как COUNTER 1 и COUNTER 2) в выходных данных MWE, похоже, не добавляются в счетчик.

Есть какие-нибудь предложения, что я делаю не так? Вот мой 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, поэтому вам не нужно \ifboolexprс test. Этот упрощенный макрос также подходит для использования в качестве аргумента для макроса увеличения счетчика.

Другая проблема заключается в том, что вы определяете макрос \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}

Результат:

введите описание изображения здесь

Связанный контент