Tocloft 检查自定义列表是否为空

Tocloft 检查自定义列表是否为空

我使用包定义了一个名为“缺失项列表”的自定义列表tocloft。该列表包含几个项目,命令确实listof会给我相应的列表。本质上,只有当列表包含项目时,它才会显示。否则,我希望它根本不打印任何内容。我想用它来标记我仍需要在我的论文中添加的内容,但一旦所有缺失的内容都以某种方式得到解决,就不会从代码中删除任何其他内容。

为了兼容性,我希望尽可能少地使用附加包。我已经将其整理好.sty,如果它有用的话,我仍在考虑在某个时候上传它。

那我想法我需要做的是检查命令创建的计数器listof。我尝试使用\ifnum\value{missingthings}=0,但由于我在之后立即使用该命令\listoftables,计数器的值为missingthings0.0。我想我需要检查文件是否test.lomt包含任何内容行。

我该怎么做呢?我在这里使用包etoc或类似的东西检查过 .toc 文件,但这对于我的情况并没有真正的帮助,不是吗?

另外,我的 有什么问题ifnum?它似乎无法正常工作,因为\listofmissingthings即使放在文档开头, 仍然会被打印。

梅威瑟:

\documentclass{scrartcl}

\usepackage{tocloft}

\newlistof[section]{missingthings}{lomt}{List of Missing Things}

\newcommand{\missingthing}[2]{%
\refstepcounter{missingthings}
\par\noindent\textbf{Missing Thing \themissingthings: #1.} \newline #2
\addcontentsline{lomt}{missingthings}{\protect\numberline{\themissingthings}#1}\par}

\let\oldlistofmissingthings\listofmissingthings%
\renewcommand{\listofmissingthings}{ % Makes LoMT show up in ToC
    \ifnum\value{missingthings}=0%
    \oldlistofmissingthings%
    \addcontentsline{toc}{section}{List of Missing Things}%
    \else%
    %
    \fi%
}%

\begin{document}
\tableofcontents
\listofmissingthings

The current value of the counter missingthings is \themissingthings.
\section{Example}
\missingthing{First Text goes here}{This text only appears in my document, but not in my List of Missing Things}
\section{Another Example}
The current value of the counter missingthings is \themissingthings.
\end{document}

附言:我知道不建议与 KOMA-script 类一起使用tocloft。我还没有勇气改变我的文档类,所以这是另一天的话题。

答案1

借助两个新的计数器和辅助 ( *.aux) 文件,您可以在命令中实现计数器检查,\listofmissingthings以决定此命令是否会产生输出或不执行任何操作。您需要运行两次才能获得正确的输出。

两个新计数器定义为:

\newcounter{writecn}
\newcounter{existcn}

最初,它们都等于 0。

然后,在命令的定义中\missingthing添加:

\ifnum\value{writecn}=0\immediate\write\@auxout{\string\setcounter{existcn}{1}}\fi%
\ifnum\value{writecn}=1\else\setcounter{writecn}{1}\fi%

第一行会立即在 aux 文件中写入一行。这将确保即使在命令之前执行了\setcounter{existcn}{1}命令,计数器也等于 1 而不是 0。第二行只是在计数器不等于 1 时将其设置为 1。这样,即使发出了多个命令,第一行也只会执行一次。\listofmissingthings\missingthingexistcnwritecn\missingthing

然后在 的 renewcommand 定义中\listofmissingthings,使用计数器existcn来判断列表和是否addtocontentsline应该包含在输出中。例如:

\renewcommand{\listofmissingthings}{ % Makes LoMT show up in ToC
    \ifnum\value{existcn}=1
    \oldlistofmissingthings%
    \addcontentsline{toc}{section}{List of Missing Things}
    \else\fi%%
}%

完整工作示例:

\documentclass{scrartcl}
\newcounter{writecn}
\newcounter{existcn}
\usepackage{tocloft}
\newlistof[section]{missingthings}{lomt}{List of Missing Things}

\makeatletter
\newcommand{\missingthing}[2]{%
\ifnum\value{writecn}=0\immediate\write\@auxout{\string\setcounter{existcn}{1}}\fi%
\ifnum\value{writecn}=1\else\setcounter{writecn}{1}\fi%
\refstepcounter{missingthings}%
\par\noindent\textbf{Missing Thing \themissingthings: #1.} \newline #2
\addcontentsline{lomt}{missingthings}{\protect\numberline{\themissingthings}#1}\par}
\makeatother

\let\oldlistofmissingthings\listofmissingthings%
\renewcommand{\listofmissingthings}{ % Makes LoMT show up in ToC
    \ifnum\value{existcn}=1
    \oldlistofmissingthings%
    \addcontentsline{toc}{section}{List of Missing Things}
    \else\fi%%
}%

\begin{document}
\tableofcontents
\listofmissingthings
The current value of the counter missingthings is \themissingthings.
\section{Example}
\missingthing{First Text goes here}{This text only appears in my document, but not in my List of Missing Things}
\section{Another Example}
\missingthing{First Text goes here}{This text only appears in my document, but not in my List of Missing Things}
The current value of the counter missingthings is \themissingthings.
\end{document}

相关内容