Eu uso os pacotes glossaries
e minitoc
. Minitocs são gerados para todos os glossários impressos no índice, por exemplo, com a toc
opçã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 mtc
contador 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@types
como 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 \listLength
macro, 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 addtocounter
comando, 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\expandafter
antes/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 \listLength
comando 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 \listLength
e 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}
Como você pode ver, o valor de mtc
é 3, após a execução do código.
O \clist_count:n
comando é totalmente expansível, o seu \listLength
não.