Bedingtes Hinzufügen zum Zähler basierend auf bedingtem ifboolexpr

Bedingtes Hinzufügen zum Zähler basierend auf bedingtem ifboolexpr

Ich möchte mithilfe von etoolbox einen Zähler basierend auf einem ifboolexpr ergänzen, bekomme es aber nicht wie erhofft zum Laufen.

Ich möchte in meinem Dokument verschiedene Bedingungen festlegen und am Ende zählen, wie oft sie erfüllt wurden. Am Ende möchte ich eine Summe der verschiedenen Zählungen erstellen.

Ich kann die grundlegenden Aufgaben ausführen, die in meinem MWE unten als DIVCNT und MARCNT gekennzeichnet sind.

aber das \SPDD-Ergebnis wird nicht zum als SPDCNT gekennzeichneten Zähler hinzugefügt.

Seltsamerweise erkennt es die Bedingung einzeln, aber diese Bedingungen (markiert als COUNTER 1 und COUNTER 2) in der MWE-Ausgabe scheinen nicht zum Zähler hinzugefügt zu werden

Irgendwelche Vorschläge, was ich falsch mache? Hier ist mein 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}

Antwort1

Das Makro \spdd, das Sie auf Leerzeichen prüfen, ist ein Befehl (definiert mit \newcommand), daher können Sie den \ifdefemptyTest von verwenden etoolbox. Dieser Test bietet bereits einen True- und False-Teil, sodass Sie ihn nicht \ifboolexprmit einem testverwenden müssen. Dieses vereinfachte Makro eignet sich auch als Argument für das Zählerinkrementmakro.

Ein weiteres Problem besteht darin, dass Sie das Makro \spchkzweimal mit genau derselben Definition definieren. Dies ist redundant, da Sie es einmal am Anfang des Dokuments definieren und es später beliebig oft verwenden können.

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}

Ergebnis:

Bildbeschreibung hier eingeben

verwandte Informationen