我怎样才能让词汇表的第一次使用显示完整的描述?

我怎样才能让词汇表的第一次使用显示完整的描述?

我正在使用带有显示多个首字母缩略词和符号列表选项的glossaries软件包。使用会使任何首字母缩略词的下一个用法与完整描述一起出现,但符号不会出现这种情况。我无法将首字母缩略词格式用于其他词汇表,因为它们包含值和单位。acronym\glsresetall

我怎样才能使词汇表的第一次使用提供完整的格式,就像首字母缩略词的第一次使用一样?

梅威瑟:

\documentclass{report}
\usepackage{siunitx}
\usepackage[nomain, acronym, section=section]{glossaries}              % use glossaries-package

\setlength{\glsdescwidth}{15cm}

\newglossary[slg]{symbolslist}{syi}{syg}{Symbolslist} % create add. symbolslist


\glsaddkey{symbolvalue}{\glsentrytext{\glslabel}}{\glsentrysymbolvalue}{\GLsentrysymbolvalue}{\glssymbolvalue}{\Glssymbolvalue}{\GLSsymbolvalue}
\glssetnoexpandfield{symbolvalue}

\glsaddkey{unit}{\glsentrytext{\glslabel}}{\glsentryunit}{\GLsentryunit}{\glsunit}{\Glsunit}{\GLSunit}
\glssetnoexpandfield{unit}

\makeglossaries                                   % activate glossaries-package

\newglossaryentry{lightspeed}{
  name=\ensuremath{c},
  description={speed of light},
  symbolvalue={299792432},
  unit={\si{\meter/\second}},
  type=symbolslist
}

\newacronym[longplural={Frames per Second}]{fps}{FPS}{Frame per Second}

\newglossarystyle{mylist}{%
% put the glossary in the itemize environment:
\renewenvironment{theglossary}{\setlength{\LTleft}{0pt}\begin{longtable}{l>{\raggedright}p{.4\textwidth}>{\raggedleft}p{0.3\textwidth}r}}{\end{longtable}}%
% have nothing after \begin{theglossary}:
\renewcommand*{\glossaryheader}{%  Change the table header
   Sign &  Description & Value & Unit \\
  \endhead}
% have nothing between glossary groups:
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glsgroupskip}{}%
% set how each entry should appear:
\renewcommand*{\glossentry}[2]{%  Change the displayed items
  \glstarget{##1}{\glossentryname{##1}} %
  & \glossentrydesc{##1}% Description
  & \glssymbolvalue{##1}
  & \glsunit{##1}%
  \tabularnewline
}
}

\begin{document}

\glsaddall
\printglossary[type=symbolslist,style=mylist]   % list of symbols
\printglossary[type=\acronymtype] % prints just the list of acronyms

\glsresetall

Now the first use of the acronym gives \gls{fps}

But the first use of the symbol gives \gls{lightspeed}, whereas I want it to give \glsdesc{lightspeed} (\glsname{lightspeed})

\end{document}

结果:

结果

答案1

的基本行为\gls是在第一次使用时显示密钥的值,并在后续使用时显示密钥first的值。如果密钥未明确设置,则假定它与密钥相同。如果密钥未设置,则假定它与密钥相同。texttextnamefirsttext

因此,

\newglossaryentry{lightspeed}{
  name=\ensuremath{c},
  description={speed of light},
  symbolvalue={299792432},
  unit={\si{\meter/\second}},
  type=symbolslist
}

这里有一个隐含的text={\ensuremath{c}}first={\ensuremath{c}},这就是为什么第一次使用时只显示符号。

\newacronym基础glossaries包中原来不使用的那个\setacronymstyle会自动将first键设置为长格式,后面跟着括号中的缩写,并将键text设置为缩写形式,因此

\newacronym[longplural={Frames per Second}]{fps}{FPS}{Frame per Second}

基本上是做

\newglossaryentry{fps}{
  name={fps},
  description={Frame per Second},
  first={Frame per Second (FPS)},
  firstplural={Frames per Second (FPSs)},
  text={FPS},
  plural={FPSs}
}

这就是为什么第一次使用时会显示描述。

(这是处理缩写的一种相当简单的方法,不允许有太多的风格灵活性,因此\newacronymstyle改变了行为方式\gls,使得使用 定义的条目\newacronym与直接用 定义的条目受到不同的处理\newglossaryentry。)

一种可能的解决方案是定义一个符号命令,该命令的first键设置方式与原始符号的键设置方式大致相同\newacronym。这有助于保持所有符号的一致样式。

例如:

\documentclass{report}
\usepackage{siunitx}
\usepackage[nomain, acronym, section=section]{glossaries}              % use glossaries-package

\setlength{\glsdescwidth}{15cm}

\newglossary[slg]{symbolslist}{syi}{syg}{Symbolslist} % create add. symbolslist


\glsaddkey{symbolvalue}{\glsentrytext{\glslabel}}{\glsentrysymbolvalue}{\GLsentrysymbolvalue}{\glssymbolvalue}{\Glssymbolvalue}{\GLSsymbolvalue}
\glssetnoexpandfield{symbolvalue}

\glsaddkey{unit}{\glsentrytext{\glslabel}}{\glsentryunit}{\GLsentryunit}{\glsunit}{\Glsunit}{\GLSunit}
\glssetnoexpandfield{unit}

\makeglossaries                                   % activate glossaries-package

% \newsymbol[options]{label}{symbol}{unit}{symbolvalue}{description}
\newcommand*{\newsymbol}[6][]{%
  \newglossaryentry{#2}{name={#3},% symbol
   first={#6 (#3)},% description (symbol)
   symbolvalue={#5},
   unit={#4},
   type={symbolslist},
   description={#6},#1}%
}

\newsymbol{lightspeed}{\ensuremath{c}}{\si{\meter/\second}}{299792432}
{speed of light}

\newacronym[longplural={Frames per Second}]{fps}{FPS}{Frame per Second}

\newglossarystyle{mylist}{%
% put the glossary in the itemize environment:
\renewenvironment{theglossary}{\setlength{\LTleft}{0pt}\begin{longtable}{l>{\raggedright}p{.4\textwidth}>{\raggedleft}p{0.3\textwidth}r}}{\end{longtable}}%
% have nothing after \begin{theglossary}:
\renewcommand*{\glossaryheader}{%  Change the table header
   Sign &  Description & Value & Unit \\
  \endhead}
% have nothing between glossary groups:
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glsgroupskip}{}%
% set how each entry should appear:
\renewcommand*{\glossentry}[2]{%  Change the displayed items
  \glstarget{##1}{\glossentryname{##1}} %
  & \glossentrydesc{##1}% Description
  & \glssymbolvalue{##1}
  & \glsunit{##1}%
  \tabularnewline
}
}

\begin{document}

\glsaddall
\printglossary[type=symbolslist,style=mylist]   % list of symbols
\printglossary[type=\acronymtype] % prints just the list of acronyms

\glsresetall

Now the first use of the acronym gives \gls{fps}

First use of \gls{lightspeed}.

Next use of \gls{lightspeed}.
\end{document}

得出的结果为:

文件图像

您可能还想考虑覆盖默认sort值,因为makeindex无法识别 LaTeX 标记,因此会看到\ensuremath{c}字符序列\ e n s u r e m a t h { c }

根据其他符号可能是什么,有几种方法。如果它们在数学模式下大多只是拉丁字符,那么你可以这样做:

\newcommand*{\newsymbol}[6][]{%
  \newglossaryentry{#2}{name={$#3$},% symbol
   sort={#3},
   first={#6 ($#3$)},% description (symbol)
   text={\ensuremath{#3}},
   symbolvalue={#5},
   unit={#4},
   type={symbolslist},
   description={#6},#1}%
}

\newsymbol{lightspeed}{c}{\si{\meter/\second}}{299792432} {speed of light}

在这种情况下,排序值现在只是c

或者,如果它们都是常量,您可以按符号值排序:

\newcommand*{\newsymbol}[6][]{%
  \newglossaryentry{#2}{name={$#3$},% symbol
   sort={#5},
   first={#6 ($#3$)},% description (symbol)
   text={\ensuremath{#3}},
   symbolvalue={#5},
   unit={#4},
   type={symbolslist},
   description={#6},#1}%
}

\newsymbol{lightspeed}{c}{\si{\meter/\second}}{299792432} {speed of light}

在这种情况下,该sort值为 299792432,它makeindex被识别为数字而不是字符串。

相关内容