Я использую пакеты glossaries
и minitoc
. Minitocs генерируются для всех глоссариев, напечатанных в таблице содержания, например, с toc
опцией для пакета glossaries. Когда кто-то печатает глоссарии перед главами, то печатаются еще не напечатанные minitoc глоссариев вместо глав, эффективно смещая minitoc относительно глав.
Вручную эту проблему можно решить, сместив mtc
счетчик мини-глоссария, например, \addtocounter{mtc}{2}
если имеется 2 глоссария (например, аббревиатуры + сам глоссарий).
Я пытаюсь автоматически сделать этот сдвиг, чтобы встроить его в пакет. Сначала получаем количество глоссариев. Пакет глоссариев определяет макрос \@glo@types
как разделенный запятыми список имен определенных глоссариев. Таким образом, я могу вывести количество глоссариев с помощью:
\expandafter\listLength\expandafter{\@glo@types}
где \listLength
макрос, вдохновленный этимотвечатьи опираясь на etoolbox, это:
\makeatletter
\newcounter{listlength@cnt}
\newcommand*{\listlength@add}[1]{\stepcounter{listlength@cnt}}
\newcommand*{\listLength}[1]{%
\setcounter{listlength@cnt}{0}%
\forcsvlist{\listlength@add}{#1}%
\thelistlength@cnt%
}
\makeatother
Однако, когда я пытаюсь использовать значение в addtocounter
команде, оно больше не работает. Для того же примера:
\expandafter\listLength\expandafter{\@glo@types}
отпечатки 2\addtocounter{mtc}{\expandafter\listLength\expandafter{\@glo@types}}
выводит ошибку "Отсутствует число". Я пробовал разные комбинации\expandafter
до/в этой команде, но, как вы могли заметить, у меня возникли проблемы с процессом расширения.
Итак, как мне сместить счетчик на значение, полученное путем расширения?
Вот MWE:
\documentclass{report}
\usepackage[nohints]{minitoc}
\usepackage{etoolbox}
\usepackage[acronym,xindy,toc]{glossaries}
\makeglossaries
\begin{filecontents}{glossary.tex}
\newacronym{nraa}{NRAA}{Not Really An Acronym}
\newglossaryentry{stuff}{
name={stuff},
description={a test}%
}
\end{filecontents}
\loadglsentries{glossary}
% macro to count args of csv-list
\makeatletter
\newcounter{listlength@cnt}
\newcommand*{\listlength@add}[1]{\stepcounter{listlength@cnt}}
\newcommand*{\listLength}[1]{%
\setcounter{listlength@cnt}{0}%
\forcsvlist{\listlength@add}{#1}% % from etoolbox
\thelistlength@cnt%
}
\makeatother
\begin{document}
\dominitoc % Generating mini-toc
\tableofcontents
\glsaddall % adding all glossary entries for the test
\printglossary[type=\acronymtype]
\printglossary[type=main]
\addtocounter{mtc}{2} % manual offset
\newpage
\makeatletter
number of glossaries:
\expandafter{\expandafter\listLength\expandafter{\@glo@types} % prints 2
%\addtocounter{mtc}{\expandafter\listLength\expandafter{\@glo@types}}
% results in error, missing number
\makeatother
\chapter{chap1}
chapter's toc is:
\minitoc
Content is:
\section{s1}
\subsection{s11}
\end{document}
решение1
Ваша \listLength
команда не работает путем чистого расширения; вы должны сказать
\newcommand*{\listLength}[1]{%
\setcounter{listlength@cnt}{0}%
\forcsvlist{\listlength@add}{#1}%
}
как определение \listLength
и затем
\listLength{\@glo@types}%
\addtocounter{mtc}{\value{listlength@cnt}}%
в коде.
Есть гораздо более изящный способ expl3
:
\documentclass{report}
\usepackage[nohints]{minitoc}
\usepackage{xparse}
\usepackage[acronym,xindy,toc]{glossaries}
\makeglossaries
\begin{filecontents}{glossary.tex}
\newacronym{nraa}{NRAA}{Not Really An Acronym}
\newglossaryentry{stuff}{
name={stuff},
description={a test}%
}
\end{filecontents}
\loadglsentries{glossary}
% macro to count args of csv-list
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\listLength}{m}
{
\clist_count:n { #1 }
}
\ExplSyntaxOff
\begin{document}
\dominitoc % Generating mini-toc
\tableofcontents
\glsaddall % adding all glossary entries for the test
\printglossary[type=\acronymtype]
\printglossary[type=main]
\addtocounter{mtc}{2}% manual offset
\newpage
number of glossaries:
\makeatletter
\listLength{\@glo@types} % prints 2
\addtocounter{mtc}{\listLength{\@glo@types}}
\themtc
\makeatother
\chapter{chap1}
chapter's toc is:
\minitoc
Content is:
\section{s1}
\subsection{s11}
\end{document}
mtc
Как видите, после выполнения кода значение равно 3.
Команда \clist_count:n
полностью расширяема, ваша \listLength
— нет.