将计数器设置为扩展获得的值

将计数器设置为扩展获得的值

我使用glossariesminitoc包。迷你目录是为目录中打印的所有词汇表生成的,例如使用toc词汇表包的选项。当在章节之前打印词汇表时,将打印词汇表的尚未打印的迷你目录,而不是章节的迷你目录,从而有效地抵消了章节的迷你目录。

手动地,可以通过偏移mtcminitocs 的计数器来解决这个问题,例如,\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却不能。

相关内容