Tocloft prüft, ob die benutzerdefinierte Liste leer ist

Tocloft prüft, ob die benutzerdefinierte Liste leer ist

Ich habe mithilfe des Pakets eine benutzerdefinierte Liste namens „Liste fehlender Dinge“ definiert tocloft. Die Liste enthält einige Elemente, und der listofBefehl gibt mir die entsprechende Liste. Im Wesentlichen sollte diese Liste nur angezeigt werden, wenn sie Elemente enthält. Andernfalls möchte ich, dass sie überhaupt nichts ausgibt. Ich möchte dies verwenden, um Dinge zu markieren, die ich meiner Arbeit noch hinzufügen muss, aber dann nichts anderes aus dem Code entfernen, sobald alle fehlenden Dinge auf die eine oder andere Weise behoben wurden.

Ich möchte aus Kompatibilitätsgründen so wenig zusätzliche Pakete wie möglich verwenden. Ich habe dies bereits in .styForm gebracht und überlege noch, es irgendwann hochzuladen, wenn es sich als nützlich erweist.

Was ich alsoGedankeIch musste den durch den listofBefehl erstellten Zähler überprüfen. Ich habe versucht, zu verwenden \ifnum\value{missingthings}=0, aber da ich den Befehl direkt nach verwende \listoftables, ist der Wert des Zählers missingthings0,0. Ich dachte, ich müsste überprüfen, ob die Datei test.lomtirgendwelche Inhaltszeilen enthält.

Wie würde ich dabei vorgehen? Ich habe hier ähnliche Themen zur Verwendung des Pakets etocoder ähnliche Dinge zur Überprüfung der TOC-Datei gelesen, aber das hilft mir in meinem Fall nicht wirklich, oder?

Und was ist mit meinem los ifnum? Es scheint nicht richtig zu funktionieren, da das \listofmissingthingsweiterhin gedruckt wird, auch wenn es am Anfang des Dokuments platziert wird.

MWE:

\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}

PS: Ich weiß, dass die Verwendung von tocloftzusammen mit KOMA-Skriptklassen nicht empfohlen wird. Ich habe nicht den Mut gefunden, meine Dokumentklasse zu ändern, daher ist dies ein Thema für einen anderen Tag.

Antwort1

Mithilfe von zwei neuen Zählern und einer Hilfsdatei ( *.aux) können Sie eine Zählerprüfung im \listofmissingthingsBefehl durchführen, um zu entscheiden, ob dieser Befehl eine Ausgabe erzeugt oder nichts tut. Sie müssen ihn zweimal ausführen, um korrekte Ausgaben zu erhalten.

Zwei neue Zähler definiert als:

\newcounter{writecn}
\newcounter{existcn}

Anfangs sind sie alle gleich 0.

Fügen Sie dann in der Befehlsdefinition \missingthingFolgendes hinzu:

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

Die erste Zeile schreibt sofort eine Zeile in die Hilfsdatei \setcounter{existcn}{1}. Dadurch wird sichergestellt, dass der Zähler gleich 1 und nicht 0 ist, auch wenn der Befehl \listofmissingthingsvor dem Befehl ausgeführt wird . Die zweite Zeile setzt den Zähler nur auf 1, wenn er nicht gleich 1 ist. Auf diese Weise wird die erste Zeile nur ausgeführt, wenn mehrere Befehle ausgegeben wurden.\missingthingexistcnwritecn\missingthing

Und dann \listofmissingthingsverwenden Sie in der Renewcommand-Definition von den Zähler, existcnum zu entscheiden, ob die Liste addtocontentslinein die Ausgabe aufgenommen werden soll. Wie:

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

Das vollständige funktionierende Beispiel:

\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}

verwandte Informationen