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