我是新来的,我有一个关于定义词汇表样式的问题。
我想拥有:
- 包含 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}