Setzen eines Zählers auf einen durch Erweiterung erhaltenen Wert

Setzen eines Zählers auf einen durch Erweiterung erhaltenen Wert

Ich verwende die Pakete glossariesund minitoc. Für alle im Inhaltsverzeichnis gedruckten Glossare werden Minitocs generiert, z. B. mit der tocOption für das Glossarpaket. Wenn man die Glossare vor den Kapiteln druckt, werden die noch nicht gedruckten Minitocs der Glossare anstelle der Kapitel-Minitocs gedruckt, wodurch die Minitocs in Bezug auf die Kapitel effektiv ausgeglichen werden.

Manuell kann dies durch Versetzen des mtcZählers der Minitocs gelöst werden, zB \addtocounter{mtc}{2}wenn es 2 Glossare gibt (z.B. Akronyme + eigentliches Glossar).

Ich versuche, diese Verschiebung automatisch durchzuführen, um sie in ein Paket einzubetten. Zuerst wird die Anzahl der Glossare ermittelt. Das Glossarpaket definiert das Makro \@glo@typesals eine durch Kommas getrennte Liste der Namen der definierten Glossare. So kann ich die Anzahl der Glossare mit folgendem ausgeben:
\expandafter\listLength\expandafter{\@glo@types}
wobei das \listLengthMakro, inspiriert von diesemAntwortund basierend auf etoolbox, ist:

\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

Wenn ich jedoch versuche, den Wert im Befehl zu verwenden addtocounter, funktioniert es nicht mehr. Für das gleiche Beispiel:

  • \expandafter\listLength\expandafter{\@glo@types}druckt 2
  • \addtocounter{mtc}{\expandafter\listLength\expandafter{\@glo@types}}gibt einen „Fehlende Nummer“-Fehler aus. Ich habe es mit verschiedenen Kombinationen von \expandaftervor/in diesem Befehl versucht, aber wie Sie vielleicht bemerkt haben, habe ich Probleme mit dem Erweiterungsprozess.

Wie kann ich also einen Zähler auf einen durch Erweiterung abgeleiteten Wert verrechnen?

Hier ist ein 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}

Antwort1

Ihr \listLengthBefehl funktioniert nicht durch reine Erweiterung; Sie sollten sagen

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

als Definition von \listLengthund dann

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

im Code.

Es gibt einen viel eleganteren Weg mit 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}

Bildbeschreibung hier eingeben

Wie Sie sehen, beträgt der Wert mtc3, nachdem der Code ausgeführt wurde.

Der \clist_count:nBefehl ist vollständig erweiterbar, Ihrer \listLengthnicht.

verwandte Informationen