条件付き ifboolexpr に基づいて Counter に条件付きで追加する

条件付き ifboolexpr に基づいて Counter に条件付きで追加する

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使用できます。このテストでは True 部分と False 部分がすでに用意されているため、で を使用する必要はありません。この簡略化されたマクロは、カウンター増分マクロの引数として使用するのにも適しています。\ifdefemptyetoolbox\ifboolexprtest

もう 1 つの問題は、まったく同じ定義でマクロを\spchk2 回定義することです。これは冗長であり、ドキュメントの先頭で 1 回定義して、後で何度でも使用できます。

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}

結果:

ここに画像の説明を入力してください

関連情報