Definir um contador para um valor obtido por expansão

Definir um contador para um valor obtido por expansão

Eu uso os pacotes glossariese minitoc. Minitocs são gerados para todos os glossários impressos no índice, por exemplo, com a tocopção do pacote glossários. Quando se imprime os glossários antes dos capítulos, os minitocs ainda não impressos dos glossários são impressos em vez dos capítulos, compensando efetivamente os minitocs em relação aos capítulos.

Manualmente, isso pode ser resolvido compensando o mtccontador dos minitocs, por exemplo, \addtocounter{mtc}{2}se houver 2 glossários (acrônimos + glossário real, por exemplo).

Estou tentando fazer essa mudança automaticamente para incorporá-la em um pacote. Primeiro é obter o número de glossários. O pacote glossários define a macro \@glo@typescomo uma lista separada por vírgulas dos nomes dos glossários definidos. Assim, posso imprimir a quantidade de glossários com:
\expandafter\listLength\expandafter{\@glo@types}
onde está a \listLengthmacro, inspirada nestarespondere contar com 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

Porém, quando tento usar o valor no addtocountercomando, ele não funciona mais. Para o mesmo exemplo:

  • \expandafter\listLength\expandafter{\@glo@types}impressões 2
  • \addtocounter{mtc}{\expandafter\listLength\expandafter{\@glo@types}}gera um erro de "Número ausente". Tentei com diferentes combinações de \expandafterantes/nesse comando, mas como você deve ter percebido, tenho problemas com o processo de expansão.

Então, como posso compensar um contador para um valor derivado da expansão?

Aqui está um 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}

Responder1

Seu \listLengthcomando não funciona por pura expansão; você deveria dizer

\newcommand*{\listLength}[1]{%
    \setcounter{listlength@cnt}{0}%
    \forcsvlist{\listlength@add}{#1}%
}

como a definição de \listLengthe então

\listLength{\@glo@types}%
\addtocounter{mtc}{\value{listlength@cnt}}%

no código.

Há uma maneira muito mais inteligente com 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}

insira a descrição da imagem aqui

Como você pode ver, o valor de mtcé 3, após a execução do código.

O \clist_count:ncomando é totalmente expansível, o seu \listLengthnão.

informação relacionada