Установка счетчика на значение, полученное путем расширения

Установка счетчика на значение, полученное путем расширения

Я использую пакеты 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— нет.

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