定义词汇表样式:页码问题

定义词汇表样式:页码问题

我是新来的,我有一个关于定义词汇表样式的问题。

我想拥有:

  • 包含 3 列的词汇表样式
  • 第一个应该是符号,第二个是描述,第三个是页码

我的问题是:我想手动定义每列的宽度(孔表的宽度应与 \textwidth 一样宽)。有些符号是较长术语的缩写,因此我想在第三列中从第一次使用开始链接页面,但其他符号或多或少都很熟悉,因此第三列中不应该有页面链接。更准确地说,如果我在文本中使用 \gls{..} 调用词汇表条目,则词汇表的第三列中应该有一个页面链接。其他词汇表条目应该只显示符号和说明,而没有页码。我不会单独调用它们。

经过长时间的研究,我发现了类似的问题,但解决方案对我来说并不好。以下是我现在的情况:

\documentclass{article}

\usepackage{amsfonts}
\newcommand*{\Z}{\mathbb{Z}}
\newcommand*{\Q}{\mathbb{Q}}

\usepackage{lipsum} % to have some dummy text, and therefore larger page numbers
\usepackage[colorlinks]{hyperref}
\usepackage{glossaries}
\usepackage{glossary-longragged}

\glsdisablehyper %Entfernt links von den Symbolen


\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}

\newglossarystyle{tabx3col}{%
 % put the glossary in a longtable environment:
 \renewenvironment{theglossary}%
  {\renewcommand{\arraystretch}{1.5}
  \begin{longtable}{@{}p{0.2\textwidth}@{}p{0.7\textwidth}@{}>{\raggedleft}p{0.1\textwidth}@{}}}%
  {\end{longtable}}%
 % Set the table's header:
 \renewcommand*{\glossaryheader}{}%
 % No heading between groups:
  \renewcommand*{\glsgroupheading}[1]{}%
 % Main (level 0) entries displayed in a row:
  \renewcommand*{\glossaryentryfield}[5]{%
    \glstarget{##1}{##2}% Name
    & ##3% Description
    & ##5% Page list
    \\% end of row
  }%
}

\newcommand*{\glsgobblenumber}[1]{}
% \renewcommand*{\glsgobblenumber}[1]{#1}% uncomment for testing

\makeatletter
%% lockstep's code
\newcommand*{\glsaddnp}[2][]{%
  \glsdoifexists{#2}%
  {
    %  \def\@glsnumberformat{glsnumberformat}% DELETED
    \def\@glsnumberformat{glsgobblenumber}% NEW
    \edef\@gls@counter{\csname glo@#2@counter\endcsname}%
    \setkeys{glossadd}{#1}%
    \@gls@saveentrycounter
    \@do@wrglossary{#2}%
  }%
}
%% new code; modified \glsaddall
\renewcommand{\glsaddallunused}[1][]{%
  \edef\@glo@type{\@glo@types}%
  \setkeys{glossadd}{#1}%
  \forallglsentries[\@glo@type]{\@glo@entry}{%
    \ifglsused{\@glo@entry}{}{%
     \glsaddnp[#1]{\@glo@entry}}}%
}
\makeatother


\newglossaryentry{integers}{name=\ensuremath{\Z},
  description={the ring of integers}, sort=Z}

\newglossaryentry{rationals}{name=\ensuremath{\Q},
  description={the field of rational numbers}, sort=Q, nonumberlist}

\newglossaryentry{vector-space}{name=\ensuremath{V},
  description={a vector space}, sort=V}

\makeglossaries

\begin{document}
A vector space \gls{vector-space} \ldots
\lipsum[1-10]

\glsaddallunused
\printglossary[style=tabx3col]
\end{document}

当文本中没有使用 \gls{..} 的符号调用时,似乎会出现问题。错误消息为:

! Extra alignment tab has been changed to \cr.

您有什么办法可以解决这个问题吗?在此处输入图片描述

答案1

你不需要:

\newcommand*{\glsgobblenumber}[1]{}

glossaries包已经提供了\glsignore相同的功能并在中使用\glsaddallused

style 命令\glossaryentryfield现已过时,并\glossentry在 v4.0 中被替换glossaries。它只有两个参数:标签和位置列表。

我认为您遇到的主要问题是由于\\行分隔符。列类型会改变这一点,因此您需要改为这样做\tabularnewline

还缺少两个命令,它们始终需要在样式中重新定义。它们是\subglossentry(用于子条目)和\glsgroupskip。如果没有子条目,则\subglossentry不是那么重要,但\glsgroupskip很重要。默认样式(list)将其定义为

\ifglsnogroupskip \else \indexspace \fi

如果你没有使用 ,这会干扰表格材料nogroupskip。如果你希望你的风格符合nogroupskip选项,你可以\glsgroupskip使用以下方式定义:

  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{ & &\tabularnewline}%
  \fi

如果你不希望你的风格在各个群体之间有差距,那么就定义

\renewcommand*{\glsgroupskip}{}

修改后的 MWE:

\documentclass{article}

\usepackage{amsfonts}
\newcommand*{\Z}{\mathbb{Z}}
\newcommand*{\Q}{\mathbb{Q}}

\usepackage{lipsum} % to have some dummy text, and therefore larger page numbers
\usepackage[colorlinks]{hyperref}
\usepackage{glossaries}
\usepackage{glossary-longragged}

\glsdisablehyper %Entfernt links von den Symbolen


\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}

\newglossarystyle{tabx3col}{%
 % put the glossary in a longtable environment:
 \renewenvironment{theglossary}%
  {\renewcommand{\arraystretch}{1.5}
  \begin{longtable}{@{}p{0.2\textwidth}@{}p{0.7\textwidth}@{}>{\raggedleft}p{0.1\textwidth}@{}}}%
  {\end{longtable}}%
 % Set the table's header:
 \renewcommand*{\glossaryheader}{}%
 % No heading between groups:
  \renewcommand*{\glsgroupheading}[1]{}%
 % Main (level 0) entries displayed in a row:
  \renewcommand*{\glossentry}[2]{%
    \glstarget{##1}{\glossentryname{##1}}% Name
    & \glossentrydesc{##1}% Description
    & ##2% Page list
    \tabularnewline% end of row
  }%
  % make sub-entries the same 
  \renewcommand*{\subglossentry}[3]{%
    \glossentry{##2}{##3}%
  }%
  % no group separator
  \renewcommand*{\glsgroupskip}{}%
}

\newglossaryentry{integers}{name=\ensuremath{\Z},
  description={the ring of integers}, sort=Z}

\newglossaryentry{rationals}{name=\ensuremath{\Q},
  description={the field of rational numbers}, sort=Q, nonumberlist}

\newglossaryentry{vector-space}{name=\ensuremath{V},
  description={a vector space}, sort=V}

\makeglossaries

\begin{document}
A vector space \gls{vector-space} \ldots
\lipsum[1-10]

\glsaddallunused
\printglossary[style=tabx3col]
\end{document}

词汇表图片

如果您的任何条目包含对其他条目的引用(例如,如果\gls\glslink等出现在描述中),则这将向编号列表添加页码。如果这种情况发生在之后,\glsaddallunused则会导致编号列表\glsignore{第1页},第2页这会导致出现错误的逗号。因此,最好始终将其放在\glsaddallunused紧接于 之前的最末尾\end{document}

\documentclass{article}

\usepackage{amsfonts}
\newcommand*{\Z}{\mathbb{Z}}
\newcommand*{\Q}{\mathbb{Q}}

\usepackage{lipsum} % to have some dummy text, and therefore larger page numbers
\usepackage[colorlinks]{hyperref}
\usepackage{glossaries}
\usepackage{glossary-longragged}

\glsdisablehyper %Entfernt links von den Symbolen


\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}

\newglossarystyle{tabx3col}{%
 % put the glossary in a longtable environment:
 \renewenvironment{theglossary}%
  {\renewcommand{\arraystretch}{1.5}
  \begin{longtable}{@{}p{0.2\textwidth}@{}p{0.7\textwidth}@{}>{\raggedleft}p{0.1\textwidth}@{}}}%
  {\end{longtable}}%
 % Set the table's header:
 \renewcommand*{\glossaryheader}{}%
 % No heading between groups:
  \renewcommand*{\glsgroupheading}[1]{}%
 % Main (level 0) entries displayed in a row:
  \renewcommand*{\glossentry}[2]{%
    \glstarget{##1}{\glossentryname{##1}}% Name
    & \glossentrydesc{##1}% Description
    & ##2% Page list
    \tabularnewline% end of row
  }%
  % make sub-entries the same 
  \renewcommand*{\subglossentry}[3]{%
    \glossentry{##2}{##3}%
  }%
  % no group separator
  \renewcommand*{\glsgroupskip}{}%
}

\newglossaryentry{integers}{name=\ensuremath{\Z},
  description={the ring of integers}, sort=Z}

\newglossaryentry{rationals}{name=\ensuremath{\Q},
  description={the field of rational numbers}, sort=Q, nonumberlist}

\newglossaryentry{vector-space}{name=\ensuremath{V},
  description={a vector space}, sort=V}

\makeglossaries

\begin{document}
A vector space \gls{vector-space} \ldots
\lipsum[1-10]

\printglossary[style=tabx3col]
\glsaddallunused
\end{document}

或者

\AtEndDocument{\glsaddallunused}

相关内容