为什么 \setacronymstyle{long-short-desc} 会覆盖 \renewcommand*{\glsentryfmt}?

为什么 \setacronymstyle{long-short-desc} 会覆盖 \renewcommand*{\glsentryfmt}?

我目前正在写一篇包含扩展词汇表的论文。因此,我使用这个glossaries包。我希望词汇表条目的首次出现由条目名称前面的符号表示。直到最近对包进行一些更改,这可以通过以下代码实现:

\defglsdisplayfirst[\glsdefaulttype]{#1}

(在上述情况下,什么都不会改变,但最后一个括号的内容决定了第一个条目的出现,请参阅下面的扩展示例。)

现在,使用以下代码可以实现同样的事情:

\renewcommand*{\glsentryfmt}{%
    \ifglsused{\glslabel}{}{}
    \glsgenentryfmt
}

(在此示例中,第一个条目不会改变,但\ifglsused可以在第二个括号中插入任何内容,这些内容将位于插入的实际条目之前\glsgenentryfmt。)

我发现新方法更难,但它的解释是词汇表-用户.pdf在第 100 页底部,当然更加灵活。在摆弄了包并做了一些调整后,我发现更改首字母缩写词样式会使\renewcommand*{\glsentryfmt}(等等)变得无用,可以使用以下代码进行测试:

\documentclass{article}

\usepackage{MnSymbol}

\newcommand{\glmarker}{$\smalltriangleright$}

\usepackage{glossaries}
\makeglossaries

% overwriting the first appearance of a glossary entry
% in previous versions this was done with
%
%   \defglsdisplayfirst[\glsdefaulttype]{\glmarker\,#1}
%
% now, it is done with the following command (see glossaries-user.pdf, p. 100
% bottom)
\renewcommand*{\glsentryfmt}{%
    \ifglsused{\glslabel}{}{\glmarker\,}
    \glsgenentryfmt
}

\setglossarystyle{altlist}

% with setting the acronymstyle to 'long-short-desc' overwrites the adjustments
% for the first appearance of an gls entry (it does not matter whether
% \setacronymstyle is triggered before or after \renewcommand*{\glsentryfmt}

%\setacronymstyle{long-short-desc}

\newglossaryentry{example}{
    name={example},
    description={
        an example is an example
   }
}

\begin{document}

This is the first appearance of an entry in the glossary: \gls{example}. This
is the second appearance of an entry in the glossary: \gls{example}.

\printglossaries

\end{document}

不设置首字母缩略词样式会导致以下输出(这是我想要的,但显示的首字母缩略词却不是long-short-desc):

不设置新缩写样式的示例

但设置新的缩写样式会导致以下输出没有我想在条目首次出现之前添加的标记。定义条目首次出现的代码仍然有效!

设置新缩写样式的示例

我还尝试切换设置新缩写样式的外观并定义代码中第一个条目的新外观,但不幸的是,这并没有产生一个可行的示例。

这是故意的吗?我做错了什么?当我使用(现在)过时的变体来定义第一个条目的外观时,我没有遇到这个问题。

答案1

由于首字母缩略词的显示方式通常与一般条目不同,因此\setacronymstyle使用\defglsentryfmt[类型]{\GlsUseAcrEntryDispStyle{风格}}在哪里类型是词汇表的名称,风格是首字母缩略词样式。每个词汇表都采用此样式类型已被标识为首字母缩略词列表。由于您的main词汇表包含首字母缩略词和一般条目的混合,因此这会使首字母缩略词样式覆盖\glsentryfmt。这意味着如果您想要混合词汇表,您需要调整首字母缩略词显示样式,而不是重新定义\glsentryfmt

缩写long-short-desc样式定义如下:

\newacronymstyle{long-short-desc}%
{%
  \GlsUseAcrEntryDispStyle{long-short}%
}%
{%
  \GlsUseAcrStyleDefs{long-short}%
  \renewcommand*{\GenericAcronymFields}{}%
  \renewcommand*{\acronymsort}[2]{##2}%
  \renewcommand*{\acronymentry}[1]{%
    \glsentrylong{##1}\space (\acronymfont{\glsentryshort{##1}})}%
}

实际显示样式与long-short将显示样式设置为:

  \ifglshaslong{\glslabel}{\glsgenacfmt}{\glsgenentryfmt}%

这将检查条目是否为首字母缩略词(通过\ifglshaslong),如果是首字母缩略词,则将执行\glsgenacfmt,这是通用首字母缩略词格式,否则将执行\glsgenentryfmt,这是通用非首字母缩略词格式。因此,对于混合词汇表(如您的情况),您需要定义执行适当修改的类似样式。

例如:

\newacronymstyle{marker-long-short-desc}
{%
   \ifglsused{\glslabel}{}{\glmarker\,}
   \ifglshaslong{\glslabel}{\glsgenacfmt}{\glsgenentryfmt}%
}
{%
  \GlsUseAcrStyleDefs{long-short-desc}%
}

\setacronymstyle{marker-long-short-desc}

或者,如果您只想要非首字母缩略词条目的标记:

\newacronymstyle{marker-long-short-desc}
{%
   \ifglshaslong{\glslabel}%
   {\glsgenacfmt}%
   {\ifglsused{\glslabel}{}{\glmarker\,} \glsgenentryfmt}%
}
{%
  \GlsUseAcrStyleDefs{long-short-desc}%
}

\setacronymstyle{marker-long-short-desc}

以下是完整示例:

\documentclass{article}

\usepackage{MnSymbol}

\newcommand{\glmarker}{$\smalltriangleright$}

\usepackage{glossaries}
\makeglossaries

\setglossarystyle{altlist}

\newacronymstyle{marker-long-short-desc}
{%
   \ifglsused{\glslabel}{}{\glmarker\,}
   \ifglshaslong{\glslabel}{\glsgenacfmt}{\glsgenentryfmt}%
}
{%
  \GlsUseAcrStyleDefs{long-short-desc}%
}

\setacronymstyle{marker-long-short-desc}

\newglossaryentry{example}{
    name={example},
    description={
        an example is an example
   }
}

\begin{document}

This is the first appearance of an entry in the glossary:
\gls{example}. This
is the second appearance of an entry in the glossary: \gls{example}.

\printglossaries

\end{document}

得出的结果为:

生成的文档的图像

相关内容