如何在命名法中添加页码以链接到带有“标签”的任意页面?

如何在命名法中添加页码以链接到带有“标签”的任意页面?

我喜欢创建一个命名法,显示页码(带有\pageref\hyperlink等),指向我分配标签的其他页面。可能,此标签应该是 nomenclature 命令的一个参数。

在一个类似问题可以给命名法添加页码,但是它们会把页码放在\nomenclature它本身所在的位置。而我需要自己分配页面。

这个问题的动机是我把所有的命名法都写在一个文件中,symbols.tex比如说

% In symbolds.tex
% We have groups of symbols (here S, and P)
\nomenclature[S,001]{$N$}{Integer}{\ref{numencl:N}}
\nomenclature[P,001]{$M$}{Another integer}{\ref{numencl:M}}

并在任何章节开始之前包含它们(\include{symbolds.tex})。这样,我可以在大型文档中更好地重新排序和重新分组条目。在每个章节的后面,我将锚点(\label)添加到变量首次定义的位置。我喜欢命名法,因为它知道在哪里可以找到文档中放在前面的标签的页码。类似

% In symbolds.tex
\nomenclature[S,001]{$N$}{An integer}{\ref{numencl:N}}

% Later in a chapter
The variable $N$ \label{nomencl:N} is ...

以下是一个例子

% In main.tex

\documentclass{memoir}

\usepackage{lipsum}

% Nomenclature stuff
\usepackage[refpage]{nomencl}
\usepackage[backref=page,pageanchor]{hyperref}

% I am not sure I need the next line, this is from the linked stack exchange page above
\def\pagedeclaration#1{, \dotfill\hyperlink{page.#1}{\nobreakspace#1}} 
\makenomenclature

% Grouping symbols
usepackage{etoolbox}
\renewcommand\nomgroup[1]{%
  \item[\bfseries
  \ifstrequal{#1}{S}{Sets}{%
  \ifstrequal{#1}{P}{Symbols}{}}%
]}
% ------------------

\begin{document}

% Some fillers here (title page, abstract, table of content, list of figures, etc.
\frontmatter
\tableofcontents*
\clearpage
\thispagestyle{plain}
\begin{abstract}
\lipsum[1]
\end{abstract}

% Here is the nomenclature
\include{symbols}
\clearpage
\printnomenclature

% Chapters start
\chapter{Introduction}
Let $N$ be an integer \label{nomencl:N} ... and $M$ another integer \label{nomencl:M} defined by ...

\end{document}

我想知道如何更新\nomenclature或其他相关命令,以便它接受\label{nomencl:N})作为选项。

如果这不可能,那么放置对任意页面的引用的可行解决方案是什么?

答案1

要使\nomenclature命令使用标签作为页面引用,您可以修改命令以接受额外的参数#4。该命令定义为nomencl.sty一系列命令:\nomenclature调用\@nomenclature哪个调用\@@nomenclature哪个最后调用\@@@nomenclature。这最后一个命令是实际格式化的地方。原始命令包含以下行

|nompageref}{\thepage}}%

它被解释为“将\nompageref命令放在输出中并\thepage作为参数”,其中\thepage展开为调用命令的页码。您可以将其更改为使用不同的参数调用不同的命令。一种简单的方法似乎是使用\pageref额外的命令来调用#4。但是,这不起作用,因为原始命令\nompageref在末尾包含一些额外的代码,这些代码对于命名法的处理是必需的。因此,您可以定义一个新命令(\nomlabelref在下面的代码中调用)以包含空格、\pageref和额外的代码,并在 中调用该新命令\@@@nomenclature

梅威瑟:

\documentclass{article}
\usepackage[refpage]{nomencl}
\makeatletter
\def\nomlabelref#1{\ \pageref{#1}\nomentryend\endgroup}
\def\@@@nomenclature[#1]#2#3#4{%
 \def\@tempa{#2}\def\@tempb{#3}\def\@tempc{#4}%
 \protected@write\@nomenclaturefile{}%
  {\string\nomenclatureentry{#1\nom@verb\@tempa @[{\nom@verb\@tempa}]%
      \begingroup\nom@verb\@tempb\protect\nomeqref{\theequation}%
        |nomlabelref}{\@tempc}}%
 \endgroup
 \@esphack}
\makeatother
\usepackage[backref=page,pageanchor]{hyperref}
\makenomenclature
\begin{document}
\nomenclature[S,001]{$N$}{Integer}{nomencl:N}
\nomenclature[P,001]{$M$}{Another integer}{nomencl:M}
first page
\printnomenclature
\clearpage
second page

Let $N$ be an integer \label{nomencl:N} ... and $M$ another integer \label{nomencl:M} defined by ...
\end{document}

结果:

在此处输入图片描述

请注意,我没有#4直接使用,而是定义了一个临时变量\@tempc,以与其余定义保持一致(为和\@tempa定义和)。\@tempb#2#3


回应评论:您可以检查空参数,并在这种情况下删除 pageref。因为makeindex需要一个参数,所以您可以使用虚拟值,如1。然后\makelabelref您可以检查此值,并且只有当参数是实际标签时才打印 pageref。检查使用\ifnum1=0#1适用于数字和字符串的,请参阅https://tex.stackexchange.com/a/306500/

梅威瑟:

\documentclass{article}
\usepackage[refpage]{nomencl}
\makeatletter
% if argument is 1 do nothing, else print pageref
\def\nomlabelref#1{\ifnum1=0#1\relax\else\ \pageref{#1}\fi\nomentryend\endgroup}
\def\@@@nomenclature[#1]#2#3#4{%
 \def\@tempa{#2}\def\@tempb{#3}\def\@tempc{#4}%
 \ifx\@tempc\@empty\def\@tempc{1}\fi% set dummy value if argument is empty
 \protected@write\@nomenclaturefile{}%
  {\string\nomenclatureentry{#1\nom@verb\@tempa @[{\nom@verb\@tempa}]%
      \begingroup\nom@verb\@tempb\protect\nomeqref{\theequation}%
        |nomlabelref}{\@tempc}}%
 \endgroup
 \@esphack}
\makeatother
\usepackage[backref=page,pageanchor]{hyperref}
\makenomenclature
\begin{document}
\nomenclature[A,001]{$N$}{Integer}{nomencl:N}
\nomenclature[B,001]{$M$}{Another integer}{nomencl:M}
\nomenclature[C,001]{$Z$}{Yet another integer}{}
first page
\printnomenclature
\clearpage
second page

Let $N$ be an integer \label{nomencl:N} ... and $M$ another integer \label{nomencl:M} defined by ...
\end{document}

结果:

在此处输入图片描述

相关内容