我读这个问题在词汇表条目出现的页面前插入“页面”。
我尝试过建议的解决方案,依赖于以下代码:
\renewcommand{\glsnumberformat}[1]{%
(\ifthenelse{\DTLisSubString{#1}{\delimN}\OR\DTLisSubString{#1}{\delimR}}%
{pages #1}{page #1})}
我在frontmatter
、mainmatter
和中使用了首字母缩略词backmatter
。问题是它们都有不同的编号:
frontmatter
:一、二、三、四、...mainmatter
:1、2、3、...backmatter
:A1、A2、...
出现了几个问题:
当相同的首字母缩略词出现在至少 2 个不同的部分时,它们在首字母缩略词列表中的出现不再在一起
使用不同的命令时,“组合”会失败。我
\acrlong
在第 1 页和\acrfull
第 3 页使用了...页码上的超链接消失了(但文本中引用表格的超链接仍然出现)
当首字母缩略词出现在标题中时,目录中指向此部分的超链接将消失,只保留指向首字母缩略词列表的链接
编辑LaTeX + Glossary + LaTeX + LaTeX
下面是使用编译时的 MWE TeX + DVI
:
\documentclass[a4paper,11pt,oneside]{book}
\usepackage[hyperindex, breaklinks,
linktoc=all,
pdfborder={0 0 0}]{hyperref}
% List of abbreviations
\usepackage[acronym,toc]{glossaries}
\makeglossaries
\glsnoexpandfields
% Enable entry counting
\glsenableentrycount
% Columns in acronym table
\newglossarystyle{mylong}{%
\setglossarystyle{long}%
\renewenvironment{theglossary}%
{\begin{longtable}[l]{@{}p{\dimexpr 2cm-\tabcolsep}p{0.8\hsize}}}% <-- change the value here
{\end{longtable}}%
\renewcommand{\glossentry}[2]{%
\glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
\glossentrydesc{##1}\glspostdescription\space
\ifnum\glsentryprevcount{##1}=1\relax
Page
\else
Pages
\fi
##2\tabularnewline
}%
}
\newacronym{TLS}{TLS}{Transport Layer Security}
\newacronym{CLV}{CLV}{Some Acronym}
\begin{document}
\frontmatter
\printglossary[type=\acronymtype,style=mylong,title=Abbreviations]
\mainmatter
\chapter{Sample Chapter}
\section[\glsentryshort{TLS}]{\acrshort{TLS}}
\newpage
\subsection{Section}
\chapter{Other chapter}
\acrfull{TLS}
\acrfull{CLV}
\backmatter
\appendix
\setcounter{page}{1}
\renewcommand{\thepage}{A\arabic{page}}
\chapter{Sample Appendix}
\acrlong{TLS}
\end{document}
答案1
方法 1:
(我稍微简化了你的例子。)\glsnumberformat
我认为,与其重新定义,不如对你的新词汇表样式进行修改:
\documentclass[a4paper,11pt,oneside]{book}
\usepackage[hyperindex, breaklinks,
linktoc=all,
pdfborder={0 0 0}]{hyperref}
% List of abbreviations
\usepackage[acronym,toc]{glossaries}
\makeglossaries
\glsnoexpandfields
% Enable entry counting
\glsenableentrycount
% Columns in acronym table
\newglossarystyle{mylong}{%
\setglossarystyle{long}%
\renewenvironment{theglossary}%
{\begin{longtable}[l]{@{}p{\dimexpr 2cm-\tabcolsep}p{0.8\hsize}}}% <-- change the value here
{\end{longtable}}%
\renewcommand{\glossentry}[2]{%
\glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
\glossentrydesc{##1}\glspostdescription\space
\ifnum\glsentryprevcount{##1}=1\relax
page
\else
pages
\fi
##2\tabularnewline
}%
}
\newacronym{TLS}{TLS}{Transport Layer Security}
\newacronym{aa}{AA}{Another Abbreviation}
\begin{document}
\frontmatter
\tableofcontents
\printglossary[type=\acronymtype,style=mylong,title=Abbreviations]
\mainmatter
\chapter{Sample Chapter}
\section[\glsentryshort{TLS}]{\acrshort{TLS}}
\gls{aa}.
\newpage
\subsection{Section}
\chapter{Other chapter}
\acrfull{TLS}
\backmatter
\appendix
\setcounter{page}{1}
\renewcommand{\thepage}{A\arabic{page}}
\chapter{Sample Appendix}
\acrlong{TLS}
\end{document}
使用latex
, makeglossaries
, latex
, latex
(或pdflatex
, makeglossaries
, pdflatex
, pdflatex
)得出
如果需要,您可以使用包选项将page
/更改pages
为Page
/Pages
或抑制帖子描述点。nopostdot
导致此方法失败的情况有:
- 重置条目:这将使条目的计数器重置为 0
- 在一个页面上多次使用某个条目,但在其他页面上未使用。例如,如果
\gls{aa}
在第 1 页上使用 3 次,但在其他页面上未使用,则位置列表将仅包含第 1 页,但由于该条目已使用 3 次,因此条件\ifnum\glsentryprevcount{##1}=1
将为假。 - 条目计数用于计算条目被标记为已使用的次数。这意味着,只有
\glsunset
使用时计数才会增加。这由 之类的命令在内部完成\gls
,但不适用于 之类的命令\acrfull
,因此,此方法仅在您仅使用 -like 命令时才有用\gls
。
方法 2:
正如您在问题中链接到的答案一样,第二种方法假设位置列表中存在\delimN
或\delimR
意味着列表中有多个页面。另一个答案尝试解析位置列表中的这些命令的实例,但这很棘手,因为它们可能包含在参数中。这种替代方法定义了一个新的条件\ifpages
并重新定义\delimN
并将\delimR
其切换为 true。这当然意味着我们只有在排版位置列表后才知道所需的信息,因此需要将信息写入辅助文件,以便在下一次 (pdf|xe|lua) 运行时获取它latex
。
\documentclass[a4paper,11pt,oneside]{book}
\usepackage[hyperindex, breaklinks,
linktoc=all,
pdfborder={0 0 0}]{hyperref}
% List of abbreviations
\usepackage[acronym,toc]{glossaries}
\makeglossaries
\glsnoexpandfields
\newif\ifpages
\renewcommand*{\delimN}{\pagestrue, }
\renewcommand*{\delimR}{\pagestrue--}
\makeatletter
\newcommand*{\savepagestag}[2]{%
\protected@write\@auxout{}{\string\pages@tag{#1}{#2}}}
\newcommand*{\pages@tag}[2]{\csgdef{pages@tag@#1}{#2}}
\newcommand*{\usepagestag}[1]{\csuse{pages@tag@#1}}
\makeatother
% Columns in acronym table
\newglossarystyle{mylong}{%
\setglossarystyle{long}%
\renewenvironment{theglossary}%
{\begin{longtable}[l]{@{}p{\dimexpr 2cm-\tabcolsep}p{0.8\hsize}}}%
{\end{longtable}}%
\renewcommand{\glossentry}[2]{%
\glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
\glossentrydesc{##1}\glspostdescription\space
\pagesfalse
\usepagestag{##1}\space
##2%
\ifpages
\savepagestag{##1}{pages}%
\else
\savepagestag{##1}{page}%
\fi
\tabularnewline
}%
}
\newacronym{TLS}{TLS}{Transport Layer Security}
\newacronym{CLV}{CLV}{Some Acronym}
\begin{document}
\frontmatter
\printglossary[type=\acronymtype,style=mylong,title=Abbreviations]
\mainmatter
\chapter{Sample Chapter}
\section[\glsentryshort{TLS}]{\acrshort{TLS}}
\newpage
\subsection{Section}
\chapter{Other chapter}
\acrfull{TLS}
\acrfull{CLV}
\backmatter
\appendix
\setcounter{page}{1}
\renewcommand{\thepage}{A\arabic{page}}
\chapter{Sample Appendix}
\acrlong{TLS}
\end{document}
方法 3
此方法使用glossaries-extra
扩展包:
\documentclass[a4paper,11pt,oneside]{book}
\usepackage[colorlinks]{hyperref}
% List of abbreviations
\usepackage[acronym,postdot]{glossaries-extra}
\makeglossaries
\setabbreviationstyle[acronym]{long-short}
\newacronym{TLS}{TLS}{Transport Layer Security}
\newacronym{aa}{AA}{Another Abbreviation}
\begin{document}
\frontmatter
\tableofcontents
\printglossary[type=\acronymtype,style=long,title=Abbreviations]
\mainmatter
\chapter{Sample Chapter}
\section{\glsfmtshort{TLS}}
\gls{aa}.
\newpage
\subsection{Section}
\chapter{Other chapter}
\glsxtrfull{TLS}
\backmatter
\appendix
\setcounter{page}{1}
\renewcommand{\thepage}{A\arabic{page}}
\chapter{Sample Appendix}
\glsxtrlong{TLS}
\end{document}