
我想使用 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 部分,因此您不需要\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}
結果: