![将计数器设置为扩展获得的值](https://linux22.com/image/309971/%E5%B0%86%E8%AE%A1%E6%95%B0%E5%99%A8%E8%AE%BE%E7%BD%AE%E4%B8%BA%E6%89%A9%E5%B1%95%E8%8E%B7%E5%BE%97%E7%9A%84%E5%80%BC.png)
我使用glossaries
和minitoc
包。迷你目录是为目录中打印的所有词汇表生成的,例如使用toc
词汇表包的选项。当在章节之前打印词汇表时,将打印词汇表的尚未打印的迷你目录,而不是章节的迷你目录,从而有效地抵消了章节的迷你目录。
手动地,可以通过偏移mtc
minitocs 的计数器来解决这个问题,例如,\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
却不能。