词汇表计数器的宏

词汇表计数器的宏

我想要自定义我的词汇表,特别是我想要一些类似的东西

我的词汇表条目及其含义(见第 1 页),如果该条目仅提到一次

或者

我的词汇表条目,它的含义(见第 1、2 页),如果这个条目多次提到

因此我创建命令来计算列表 ##2 中使用的项目数

\newglossarystyle

和另一个打印命令see p.see pp.

我在定义之外测试了这些命令\newglossarystyle,它们似乎可以工作。但在这个定义中,用于计算列表中项目数量的命令不接受参数##2

以下是我的示例:

% arara: pdflatex
% arara: makeglossaries
% arara: pdflatex
% arara: makeglossaries
% arara: pdflatex

\documentclass[onecolumn,twoside,openright,a4paper,11pt]{report}    

\usepackage[utf8]{inputenc}     
\usepackage[T1]{fontenc}        

\usepackage{hyperref}       
\usepackage{calc}
\usepackage{pgffor}     % you don't need this if tikz is already included

\usepackage[toc,acronym,xindy,section=section]{glossaries} 



\newcounter{moncompteur}

\newcommand{\Znumlist}[1]{
\setcounter{moncompteur}{0}
    \foreach \e in{#1}{%
    \addtocounter{moncompteur}{1}
    }
\themoncompteur
}

\newcommand{\montest}[1]{%
    \ifnum#1<2%
        \seename\ p.
    \else%
        \seename\ pp.
    \fi%
}
\newglossarystyle{mylist}{  %
    \setglossarystyle{list} % base this style on the list style
    \renewcommand*{\glossentry}[2]{%
    \item[\glsentryitem{##1}%
    \glstarget{##1}{\glossentryname{##1}}]
    %\glossentrydesc{##1}\glspostdescription\space \Znumlist{##2}\montest{\themoncompteur}\space ##2} %
    \glossentrydesc{##1}\glspostdescription\space \Znumlist{##2}\space ##2}
}


\newglossary[ntg]{notation}{not}{ntn}{Glossaire}
\newglossary[slg]{symbols}{sym}{sbl}{Nomenclature}

 \makeglossaries        %




\newglossaryentry{glscard}{ %type=main,
    name=cardinality,
    description={The number of elements in the specified set}}

\newglossaryentry{mesh}{type=notation,
    name={Mesh},
    description={maillage},
    sort={m}}

\newglossaryentry{mbb}{type=symbols,    
    name={\ensuremath{ {M} }},
    text={ {M} },                                 
    description={matrix},               
    sort=m,                             
    see=[see also]{glscard}} 

\begin{document}       % 

\setglossarystyle{mylist}    
\printglossary[toctitle=Lexique,type=main]
\newacronym{pc}{PC}{personal computer}   
\printglossary[toctitle=Acronyms,type=acronym]
\printglossary[type=notation]
\printglossary[type=symbols]

\chapter{Introduction}
\section{ab}

 \gls{pc}; \gls{glscard}; \gls{mbb}; \gls{mesh}; \newpage 
 \gls{mesh}

\Znumlist{1,3,4} \montest{\themoncompteur}

\end{document}

如何##2在命令内部使用参数?

答案1

glossaries软件包已经提供了一种用于计算条目使用次数的机制,但必须使用 启用它\glsenableentrycount。此功能已添加到版本 4.14 中,并记录在第14.1节用户手册。

例子:

\documentclass{article}

\usepackage{glossaries}

\makeglossaries

\glsenableentrycount

\newglossaryentry{sample}{name={sample},description={an example}}

\newacronym{ab}{AB}{sample abbreviation}

\begin{document}
Number of times ``sample'' was used on the last run:
\glsentryprevcount{sample}.

\gls{sample}. \gls{sample}. \gls{ab}.

Number of times ``sample'' has been used in this run \emph{so far}:
\glsentrycurrcount{sample}.

\newpage

\gls{sample}. \gls{ab}.

\newpage

\printglossaries

\end{document}

运行第二次后,结果如下:

结果图片。上次运行使用了 3 次,目前使用了 2 次

笔记:

  1. \glsenableentrycount必须在定义条目之前使用。
  2. 该机制对 的使用施加了仅限前导码的限制\newglossaryentry(因此,也在\newacronym内部使用\newglossaryentry)。

\glsentryprevcount然后您可以在词汇表样式中使用:

\newglossarystyle{mylist}
{%
  \setglossarystyle{list}%
  \renewcommand*{\glossentry}[2]{%
    \item[\glsentryitem{##1}%
          \glstarget{##1}{\glossentryname{##1}}]
       \glossentrydesc{##1}\glspostdescription\space
       \ifnum\glsentryprevcount{##1}>1 pp.\else p.\fi\ ##2}%
}

请注意,之前的计数值表示该条目被使用的总次数。此值将重置为零,\glsreset并且也不一定与位置列表中的位置数相匹配。例如,如果某个条目在一页上使用两次,但在文档的其他地方没有使用,则位置列表将只有一个位置(该页),但条目计数将为 2。

(目前为实验性质)额外词汇表该包增强了此功能并提供每个单位的计数。

编辑:

仅使用glossaries

% arara: pdflatex
% arara: makeglossaries
% arara: pdflatex
\documentclass{report}    

\usepackage[utf8]{inputenc}     
\usepackage[T1]{fontenc}        

\usepackage[colorlinks]{hyperref}       

\usepackage[toc,acronym,xindy,section=section]{glossaries} 

\newglossarystyle{mylist}{%
  \setglossarystyle{list}% base this style on the list style
  \renewcommand*{\glossentry}[2]{%
  \item[\glsentryitem{##1}%
  \glstarget{##1}{\glossentryname{##1}}]
  \glossentrydesc{##1}\glspostdescription\space
  \ifnum\glsentryprevcount{##1}>1 pp.\else p.\fi\ ##2}%
}


\newglossary[ntg]{notation}{not}{ntn}{Glossaire}
\newglossary[slg]{symbols}{sym}{sbl}{Nomenclature}

\makeglossaries        %

\glsenableentrycount

\newglossaryentry{glscard}{
    name=cardinality,
    description={The number of elements in the specified set}}

\newglossaryentry{mesh}{type=notation,
    name={Mesh},
    description={maillage},
    sort={m}}

\newglossaryentry{mbb}{type=symbols,    
    name={\ensuremath{M}},
    text={M},                                 
    description={matrix},               
    sort=m,                             
    see=[see also]{glscard}} 

\newacronym{pc}{PC}{personal computer}   

\setglossarystyle{mylist}    

\begin{document} 
\printglossary[toctitle=Lexique,type=main]
\printglossary[toctitle=Acronyms,type=acronym]
\printglossary[type=notation]
\printglossary[type=symbols]

\chapter{Introduction}
\section{ab}

\gls{pc}; \gls{pc}; \gls{glscard}; \gls{mbb}; \gls{mesh}; \newpage 
\gls{mesh}

\end{document}

得出的结果为:

词汇表图片

除了pc在第 2 页出现两次但在其他页面上未出现的条目外,此方法大部分情况下都有效。由于该条目的总使用量大于 1,因此即使位置列表中只有一个页面pp,也会使用 而不是p。下面是使用 的替代解决方案glossaries-extra

警告: glossaries-extra仍处于实验阶段,并且由于 TeX 的异步输出例程,当条目出现在跨段落的分页符中时,可能会失败。

以下内容可使您的 mwe 适应使用glossaries-extra

% arara: pdflatex
% arara: makeglossaries
% arara: pdflatex
\documentclass{report}    

\usepackage[utf8]{inputenc}     
\usepackage[T1]{fontenc}        

\usepackage[colorlinks]{hyperref}       
\usepackage[nopostdot=false,% put a dot after the descriptions
 abbreviations,% create a separate list of abbreviations
 xindy,section=section]{glossaries-extra} 

\GlsXtrEnableEntryUnitCounting
 {general,abbreviation}% apply to both general and abbreviation categories
 {0}% don't trigger index suppression
 {page}% count per page

\newglossarystyle{mylist}{%
  \setglossarystyle{list}% base this style on the list style
  \renewcommand*{\glossentry}[2]{%
  \item[\glsentryitem{##1}%
  \glstarget{##1}{\glossentryname{##1}}]
  \glossentrydesc{##1}\glspostdescription\space
  \ifnum\glsentryprevtotalcount{##1}>1 pp.\else p.\fi\ ##2}%
}

% In case an entry is used two or more times on one page but not on any of the
% other pages.
\let\ORGglsxtrpostunset\glsxtrpostunset

\renewcommand*{\glsxtrpostunset}[1]{%
  \ifnum\glsentrycurrcount{#1}>0 \else\ORGglsxtrpostunset{#1}\fi
}


\newglossary[ntg]{notation}{not}{ntn}{Glossaire}
\newglossary[slg]{symbols}{sym}{sbl}{Nomenclature}

\makeglossaries

% general entries

\newglossaryentry{glscard}{
    name=cardinality,
    description={The number of elements in the specified set}}

\newglossaryentry{mesh}{type=notation,
    name={Mesh},
    description={maillage},
    sort={m}}

\newglossaryentry{mbb}{type=symbols,    
    name={\ensuremath{M}},
    text={M},                                 
    description={matrix},               
    sort=m,                             
    see=[see also]{glscard}} 

% abbreviations

\newabbreviation{pc}{PC}{personal computer}   

\setglossarystyle{mylist}    

\begin{document} 

\printglossary[toctitle=Lexique,type=main]
\printabbreviations
\printglossary[type=notation]
\printglossary[type=symbols]

\chapter{Introduction}
\section{ab}

 \gls{pc}; \gls{pc}; \gls{glscard}; \gls{mbb}; \gls{mesh}; \newpage 
 \gls{mesh}

\end{document}

得出的结果为:

词汇表图片

笔记:

  • 尽管该glossaries-extra包在内部加载了glossaries包,但它设置了不同的默认值(例如tocnopostdot)。为了说明这一点,我删除了选项toc并添加了nopostdot以模拟您的 mwe 的设置。
  • glossaries-extra包有一种不同的(且更好的)处理缩写的方法。
  • 随着每单位计数,\glsentrycurrcount\glsentryprevcount参考计数現有單位。因此,如果您\glsentryprevcount{pc}在第 1 页,您将获得该条目的使用次数在第 1 页(其中单位计数器为page)。这意味着它在词汇表样式中毫无用处,因为您对该条目在词汇表中被使用的次数不感兴趣(恰好为 0)。
  • 全部的通过获取计数(来自前一次运行),\glsentryprevtotalcount以便样式测试该值是否大于一。
  • 为了解决一个条目在文档的一页上使用两次或多次但在其他页面上完全未使用的可能性,我调整了 的定义\glsxtrpostunset。例如,我pc在一页上使用两次,但在其他页面上没有使用,这会将总计数设置为 2,并且“pp”将出现在该条目的词汇表中pc(如上例所示)。此修改有效地将每页的最大计数设置为 1。

相关内容