词汇表:使用(子)部分的名称代替页码

词汇表:使用(子)部分的名称代替页码

我怎样才能像上面那样打印该部分而不是 glossar/index 中的页码\nameref。最好有类似这样的内容:
在此处输入图片描述

\documentclass{report}

\usepackage[colorlinks]{hyperref}
\usepackage{glossaries}

% Syntax: \newperson{label}{forename}{surname}
\newcommand*{\newperson}[3]{%
  \newglossaryentry{#1}%
  {%
     name={#2\space#3},
     sort={#3},% sort on surname
      description={#3},
     text={#2\ #3},% title \space surname
     user1={#2},% forname
     user2={#3},% surname
  }%
}

\let\Pforename\glsuseri
\let\Psurname\glsuserii

\newglossarystyle{person}%
{%
   \glossarystyle{list}%
   \glsnogroupskiptrue
   \renewcommand*{\glossaryentryfield}[5]{%
    \item[]\glsentryitem{##1}\textbf{\glstarget{##1}{##2}}
       \\~##5}%
}%

\makeglossaries

\newperson{miller}{Marmaduke}{Miller}
\newperson{foobar}{Aardvark}{Foobar}
\newperson{foo}{Bar}{Foo}

\begin{document}

\section{DNS}
\subsection{stuff}
\gls{miller}
\section{DHCP}
\subsection{stuff}
\gls{foobar}
\section{FTP}
\subsection{stuff}
\gls{foo}
\clearpage
\section{SMTP}
\subsection{stuff}
\gls{foo}

\printglossary[title={Stuff},style=person]

\end{document}

答案1

位置必须以数字形式写入外部文件(使用标准计数器命令格式化,例如\arabic\roman\alph),否则makeindex将拒绝该条目。即使使用xindy,您也必须定义位置样式并列出所有章节编号及其标题之间的映射。以下示例将章节编号正常写入外部文件,但定义了一组从章节编号到章节标题的映射,并重新定义\glsnumberformat为根据章节编号获取相应的标题。但是,即使这并不简单,因为 的参数可能包含由或\glsnumberformat分隔的列表(\delimN\delimR编辑:我已将示例更改为包含多个词汇表):

\documentclass{report}

\usepackage{lipsum}
\usepackage{etoolbox}
\usepackage[colorlinks]{hyperref}
\usepackage[counter=section]{glossaries}

\newglossary{glossary2}{gls2}{glo2}{Glossary 2}[page]
\newglossary{glossary3}{gls3}{glo3}{Glossary 3}[section]

\makeglossaries

\makeatletter
\newcommand\@fourthoffive[5]{#4}

% adapt toc section command to get number -> title map

\let\org@l@section\l@section
\renewcommand{\l@section}[2]{%
  \org@l@section{#1}{#2}%
  \expandafter\@fetchsecnum\@fourthoffive#1\end@fetchsecnum
}

\def\@fetchsecnum#1#2#3\end@fetchsecnum{%
  \ifdefequal\numberline{#1}%
  {%
     % numbered section, save title
     \csgdef{sec@#2}{#3}%
  }%
  {%
     % unnumbered section, do nothing
  }%
}

% also need to take into account any glossary entries at the start
% of the chapter before the first section

\let\org@l@chapter\l@chapter
\renewcommand{\l@chapter}[2]{%
  \org@l@chapter{#1}{#2}%
  \expandafter\@fetchchapnum\@fourthoffive#1\end@fetchchapnum
}

\def\@fetchchapnum#1#2#3\end@fetchchapnum{%
  \ifdefequal\numberline{#1}%
  {%
     % numbered chapter, save title
     \csgdef{sec@#2.0}{#3}%
  }%
  {%
     % unnumbered chapter, do nothing
  }%
}

\makeatother

\newcommand*{\getsectitle}[1]{%
  \ifcsdef{sec@#1}
  {%
    \hyperlink{section.#1}{\csuse{sec@#1}}%
  }%
  {%
    \hyperlink{section.#1}{#1}% undefined so just display section number
  }%
}

\DeclareListParser*{\glsnumlistN}{\delimN}

\newcommand{\glsnumlistNhandler}[1]{%
 \locNsep
 \def\locRsep{}%
 \glsnumlistR{\glsnumlistRhandler}{#1}%
 \let\locNsep\delimN
}

\DeclareListParser*{\glsnumlistR}{\delimR}

\newcommand{\glsnumlistRhandler}[1]{%
 \locRsep\getsectitle{#1}\let\locRsep\delimR
}

\newcommand*{\glstitlelocformat}[1]{%
 \def\locNsep{}%
 \glsnumlistN{\glsnumlistNhandler}{#1}%
}

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

\newglossaryentry{sample2}{type=glossary2,
 name=sample2,description={a second example}}

\newglossaryentry{sample3}{type=glossary3,
 name=sample3,description={a third example}}

\begin{document}
\tableofcontents

\chapter{Sample Chapter}

\gls{sample}. \gls{sample2}.

\section{First section}

\gls{sample}.

\section{Second section}
\gls{sample}. \gls{sample2}.

\section{Third section}

\section{Fourth section}
\gls{sample}. \gls{sample3}.

\section{Fifth section}
\gls{sample}. 

\lipsum

\gls{sample2}.

\let\glsnumberformat\glstitlelocformat
\printglossary

\renewcommand{\glsnumberformat}[1]{\glshypernumber{#1}}
\printglossary[type=glossary2]

\let\glsnumberformat\glstitlelocformat
\printglossary[type=glossary3]

\end{document}

结果:

样本词汇表的图片

警告:

您需要考虑读者可能想要打印文档并阅读硬拷贝的可能性,在这种情况下,这种设计使得查找参考资料变得困难,因为您迫使读者搜索目录以找到适当的页码。至少有了章节编号,读者可以直观地猜测章节在文档中的大致位置。

由于我认为这种文档设计风格很差,所以我不愿意将其添加为一项功能,但如果您真的想这样做,上述操作应该可以起作用。

答案2

以下方法无效,但由于似乎没有解决此问题的方法,我将其取消删除。可能有助于找到一些解决方案...


得到以下解决方案,似乎最有效:将以下代码添加到 glossaries.sty


\let\Sectionmark\sectionmark
\def\sectionmark#1{\def\thesectionname{#1}\Sectionmark{#1}}

\ifthenelse{\equal{\glscounter}{sectionname}}%
{%
  \ifcsundef{chapter}{}%
  {%
    \let\@gls@old@chapter\@chapter
    \def\@chapter[#1]#2{\@gls@old@chapter[{#1}]{#2}%
    \ifcsundef{hyperdef}{}{\hyperdef{section}{\thesectionname}{}}}%
  }%
}%
{}

并使用以下命令激活它:

\usepackage[counter=sectionname]{glossaries}

不知道为什么,但似乎不适用于第一页的引用 :( 可能有人可以在不编辑词汇表的情况下发布解决方案,或者 Nicola 可以添加这样的功能

相关内容