Tocloft проверяет, пуст ли пользовательский список

Tocloft проверяет, пуст ли пользовательский список

Я определил пользовательский список под названием «Список отсутствующих вещей» с помощью пакета 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}

PS: Я знаю, что использование tocloftне рекомендуется вместе с классами KOMA-script. Я не нашел в себе смелости изменить класс документа, так что это тема для другого дня.

решение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}. Это гарантирует, что даже если команда \listofmissingthingsбудет выполнена до команды \missingthing, счетчик existcnбудет равен 1, а не 0. Вторая строка просто установит счетчик writecnравным 1, когда он не равен 1. Таким образом, первая строка будет выполнена только после того, как \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}

Связанный контент