Establecer un contador a un valor obtenido por expansión

Establecer un contador a un valor obtenido por expansión

Yo uso los paquetes glossariesy minitoc. Los minitocs se generan para todos los glosarios impresos en la tabla de contenido, por ejemplo, con la tocopción para el paquete de glosarios. Cuando se imprimen los glosarios antes de los capítulos, se imprimen los minitocs de los glosarios aún no impresos en lugar de los de los capítulos, compensando efectivamente los minitocs con respecto a los capítulos.

Manualmente, esto se puede solucionar compensando el mtccontador de los minitocs, por ejemplo \addtocounter{mtc}{2}si hay 2 glosarios (acrónimos + glosario real, por ejemplo).

Estoy intentando hacer ese cambio automáticamente para incrustarlo en un paquete. Lo primero es obtener la cantidad de glosarios. El paquete de glosarios define la macro \@glo@typescomo una lista separada por comas de los nombres de los glosarios definidos. Así, puedo imprimir el número de glosarios con:
\expandafter\listLength\expandafter{\@glo@types}
donde\listLength macro, inspirada en esterespuestay confiando en etoolbox, es:

\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

Sin embargo, cuando intento utilizar el valor en el addtocountercomando, ya no funciona. Para el mismo ejemplo:

  • \expandafter\listLength\expandafter{\@glo@types}impresiones 2
  • \addtocounter{mtc}{\expandafter\listLength\expandafter{\@glo@types}}genera un error de "Número faltante". Intenté con diferentes combinaciones de \expandafterantes/en ese comando, pero como habrás notado, tengo problemas con el proceso de expansión.

Entonces, ¿cómo puedo compensar un contador con un valor derivado de la expansión?

Aquí hay un 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}

Respuesta1

Tu \listLengthcomando no funciona por pura expansión; deberías decir

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

como la definición de \listLengthy luego

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

en el código.

Hay una manera mucho más ingeniosa con 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}

ingrese la descripción de la imagen aquí

Como puede ver, el valor de mtces 3, una vez ejecutado el código.

El \clist_count:ncomando es completamente expandible, el tuyo \listLengthno lo es.

información relacionada