我喜欢创建一个命名法,显示页码(带有\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}
结果: