![Tocloft 检查自定义列表是否为空](https://linux22.com/image/473431/Tocloft%20%E6%A3%80%E6%9F%A5%E8%87%AA%E5%AE%9A%E4%B9%89%E5%88%97%E8%A1%A8%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA.png)
我使用包定义了一个名为“缺失项列表”的自定义列表tocloft
。该列表包含几个项目,命令确实listof
会给我相应的列表。本质上,只有当列表包含项目时,它才会显示。否则,我希望它根本不打印任何内容。我想用它来标记我仍需要在我的论文中添加的内容,但一旦所有缺失的内容都以某种方式得到解决,就不会从代码中删除任何其他内容。
为了兼容性,我希望尽可能少地使用附加包。我已经将其整理好.sty
,如果它有用的话,我仍在考虑在某个时候上传它。
那我想法我需要做的是检查命令创建的计数器listof
。我尝试使用\ifnum\value{missingthings}=0
,但由于我在之后立即使用该命令\listoftables
,计数器的值为missingthings
0.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
\missingthing
existcn
writecn
\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}