例子

例子

使用 glossaries-extra 包,可以定义使用的术语及其缩写,以便在文档中方便一致地使用。但是处理句子中的词形变化变得出乎意料地困难,因为我用德语写作,复数形式不够用。一个简单的解决方案是使用\glslink\glsdisp显示自定义文本,但这有几个缺点,如下例所示。我对 LaTeX 黑客的理解不足以掌握词汇表包的内部结构,我无法估计创建自定义命令来处理这个问题是否可行。

例子

要编译此代码,请按顺序执行pdflatex test、 、bib2gls --record-count test。此外,为了说明为什么不够充分,示例仅显示缩写,而术语至少使用两次。pdflatex test\gsldisp

文件test.tex

\documentclass{article}
\usepackage{xcolor}
\usepackage{hyperref}
\hypersetup{linkbordercolor=blue!30!white}

\usepackage[record,abbreviations,nomain]{glossaries-extra}
\setabbreviationstyle[abbreviation]{long-short-desc}
\glssetcategoryattribute{abbreviation}{nohyperfirst}{true}
\renewcommand{\glsfirstlongdefaultfont}[1]{\emph{#1}}
\GlsXtrLoadResources[src={glossary},selection=all]
\GlsXtrEnableEntryCounting{abbreviation}{1}
% Show only terms that are used more than once:
\renewcommand{\printunsrtglossaryhandler}[1]{%
  \ifthenelse{\GlsXtrTotalRecordCount{#1}>1}%
  {\glsxtrunsrtdo{#1}}%
  {}%
}
\begin{document}
% Good; No abbreviation shown:
The first mention with a different inflection ``des \glsdisp{Vektorraum}{Vektorraums}''.

% Bad; Should show choose abbreviation here and italicize the long part:
The first mention with a different inflection ``des \glsdisp{Körper}{Körpers}''.
And here the second use ``der \gls{Körper}''.

The first mention of ``der \gls{Vektor}''.
% Bad; Should choose abbreviation here:
And here with a different inflection ``des \glsdisp{Vektor}{Vektors}''.

\printunsrtglossary[type=\acronymtype,title=Abkürzungen]
\end{document}

文件glossary.bib

@abbreviation{Vektorraum,
short={VR},
long={Vektorraum},
description={Menge von Vektoren mit Vektoraddition und Skalarmultiplikation über einen Körper.},
}
@abbreviation{Vektor,
short={VEC},
long={Vektor},
description={Ein Vektor ist ein Element eines Vektorraums.},
}
@abbreviation{Körper,
short={K},
long={Körper},
description={Zwei kompatible zweistellige Verknüfungen über eine gemeinsame Menge.},
}

问题

考虑到要求,是否可以gls轻松创建一个类似的命令来处理上述所有情况,同时还尊重所选择的缩写样式并以类似方式处理常规词汇表术语?

现有解决方案

有人发布了类似的问题这里但寻求的解决方案是指定用法上的词形变化,而我想gls用替换文本来调用long用法上的缩写部分,以使其更加实用。

即使没有解决方案,也提前致谢。

编辑:工作示例

通过 Nicola Talbot 给出的代码示例,以下内容满足了所有要求(至少,我能看到):

\documentclass{article}
\usepackage{xcolor}
\usepackage{hyperref}
\hypersetup{linkbordercolor=blue!30!white}

\usepackage[record,abbreviations,nomain]{glossaries-extra}
\setabbreviationstyle[abbreviation]{long-postshort-user-desc}
\glssetcategoryattribute{abbreviation}{nohyperfirst}{true}
\renewcommand{\glsfirstlonguserfont}[1]{\emph{#1}}
\GlsXtrLoadResources[src={glossary},selection=all]
\GlsXtrEnableEntryCounting{abbreviation}{1}
% Show only terms that are used more than once:
\renewcommand{\printunsrtglossaryhandler}[1]{%
  \ifthenelse{\GlsXtrTotalRecordCount{#1}>1}%
  {\glsxtrunsrtdo{#1}}%
  {}%
}

\newcommand{\disp}[3][]{%
  \ifglsentryexists{#2}%
  {\glsifregular{#2}%
    {\glsdisp[#1]{#2}{#3}}%
    {\ifglshasshort{#2}%
      {\glsxtrifcounttrigger{#2}%
        {\glsifattribute{#2}{nohyperfirst}{true}%
          {\glslink[hyper=false,#1]{#2}{#3}}%
          {\glslink[#1]{#2}{#3}}%
          \glsunset{#2} }%
        {\ifglsused{#2}%
          {\gls[#1]{#2}}%
          {\glsdisp[textformat=glsfirstlongfont,#1]{#2}{#3}} } }%
      {\glsdisp[#1]{#2}{#3}} } }%
  {\glsdisp[#1]{#2}{3}}%
}

\begin{document}
% The following assertions show the required behavour:
\begin{figure}
\begin{tabular}{cc}
  \disp{Vektorraum}{Vektorraums} & Vektorraums \\ % <- Without link
  \disp{Vektor}{Vektors} & \emph{Vektors} (VEC) \\ % <- Without link
  \disp{Vektor}{Vektors} & VEC \\ % <- With link
\end{tabular}
\end{figure}
\printunsrtglossary[type=\acronymtype,title=Abkürzungen]
\end{document}

示例输出

测试过程中出现的一些问题:

  • 由于某种原因,将样式从 更改long-postshort-user-desclong-postshort-user会产生副作用,即从打印的词汇表列表中删除长格式。
  • 使用\gls类似的命令的$\text{...\gls{Vektor}...}$行为很奇怪,因为每次使用在使用计数器中都被算作 4 次出现(\glsentryprevcount是 4 倍高)。

否则,这似乎是一个绝妙的解决方案。

答案1

有两个命令允许您显示由特定类别的缩写格式命令封装的自定义文本:

  • \glsuseabbrvfont{文本}{类别}
  • \glsuselongfont{文本}{类别}

然而,这些使用随后的(非首次使用)格式化命令。在您的示例中,您仅将首次使用的长格式化命令设置为\emph

简单示例:

\documentclass{article}

\usepackage{glossaries-extra}

\setabbreviationstyle[abbreviation]{long-short-desc}
\renewcommand{\glsfirstlongdefaultfont}[1]{\emph{#1}}

\newabbreviation[description={Ein Vektor ist ein Element eines Vektorraums.}]{Vektor}{VEC}{Vektor}

\begin{document}
First: \gls{Vektor}.

Explicit long: \glsxtrlong{Vektor}.

\glsuselongfont{Vektors}{abbreviation}.
\end{document}

在这种情况下,只有第一次使用时才会\gls以强调字体显示长格式:

第一名:矢量(VEC)。明确长:矢量。矢量。

如果还需要强调不首先使用,那么您需要重新定义\glslongdefaultfont而不是\glsfirstlongdefaultfont

\renewcommand{\glslongdefaultfont}[1]{\emph{#1}}

这非常复杂,使用\glsuselongfont只是封装给定的文本,因此它不会查询第一次使用标志或索引。

使用glossaries-extra包,、、、、\gls和都\glspl使用命令来格式化链接文本。基础包也这样做,但包进行了修改以考虑缩写处理:\Gls\Glspl\glsdisp\glslink\glsentryfmtglossariesglossaries-extra\glsentryfmt

\renewcommand*{\glsentryfmt}{%
  \ifglshasshort{\glslabel}{\glssetabbrvfmt{\glscategory{\glslabel}}}{}%
  \glsifregular{\glslabel}%
  {\glsxtrregularfont{\glsgenentryfmt}}%
  {%
    \ifglshasshort{\glslabel}%
    {\glsxtrabbreviationfont{\glsxtrgenabbrvfmt}}%
    {\glsxtrregularfont{\glsgenentryfmt}}%
  }%
}

它首先检查条目(其标签可以通过 访问\glslabel)是否设置了short字段。如果设置了,则切换到与该条目类别关联的格式化命令(\glssetabbrvfmt{\glscategory{\glslabel}})。

然后,它会测试条目是否已regular针对其类别设置了属性。有些缩写样式会设置此属性,因为它们的设计目的与常规条目类似(例如short-nolonglong-noshort)。因此,即使short设置了字段,如果regular设置了属性,也会使用“常规”通用格式命令(\glsxtrregularfont{\glsgenentryfmt})。

如果条目没有regular设置属性但设置了字段short,则使用缩写格式(\glsxtrabbreviationfont{\glsxtrgenabbrvfmt})。

实际的格式有点复杂,因为它需要知道这是否是第一次使用,是否需要更改大小写(,,,\Gls)或复数(,,),或者是否提供了自定义文本(或)。\GLS\Glspl\GLSpl\glspl\Glspl\GLSpl\glsdisp\glslink

对于\glsdisp\glslink,仅显示自定义文本。在其他情况下,它使用缩写样式设置的命令之一:

  • \glsxtrsubsequentplfmt:后续使用,复数,不改变大小写。
  • \Glsxtrsubsequentplfmt:后续使用,复数,首字母转为大写。
  • \glsxtrsubsequentfmt:后续使用,单数,无大小写变化。
  • \Glsxtrsubsequentfmt:后续使用,单数,首字母转换为大写。
  • \glsxtrfullplformat:首次使用,复数,不改变大小写。
  • \Glsxtrfullplformat:首次使用,复数,首字母转为大写。
  • \glsxtrfullformat:首次使用,单数,无大小写变化。
  • \Glsxtrfullformat:首次使用,单数,首字母转换为大写。

这些命令都接受两个参数:标签 ( \glslabel) 和插入的材料 ( ),由etc\glsinsert的最后一个可选参数提供(\gls\gls[选项]{标签}[*插入*])。

缩写long-short-desc样式对首次使用命令进行了重新定义,如下所示(这些实际上是在继承的long-short样式中定义的):

  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshortpl{##1}}}%
  }%

(使用双井号##是因为这些重新定义是在样式定义命令内部执行的。)如果缩写样式没有明确设置后续使用格式化命令,则使用默认值:

\let\glsxtrsubsequentfmt\glsxtrdefaultsubsequentfmt
\let\glsxtrsubsequentplfmt\glsxtrdefaultsubsequentplfmt
\let\Glsxtrsubsequentfmt\Glsxtrdefaultsubsequentfmt
\let\Glsxtrsubsequentplfmt\Glsxtrdefaultsubsequentplfmt

long因此,对、short和字段longplural的引用shortplural都是在缩写样式中硬编码的。这是使大小写转换正常工作所必需的。(基础glossaries包中最初的首字母缩写处理使用了一个以长格式和短格式作为参数的命令,但这给某些样式带来了问题。后来它被另一个以标签为参数的命令所取代。)

一种可能性是重新定义\glsentryfmt以检查\glscustomtext条目是否是缩写。例如:

\documentclass{article}

\usepackage{glossaries-extra}

\setabbreviationstyle[abbreviation]{long-short-desc}
\renewcommand{\glslongdefaultfont}[1]{\emph{#1}}

\renewcommand*{\glsentryfmt}{%
  \ifglshasshort{\glslabel}{\glssetabbrvfmt{\glscategory{\glslabel}}}{}%
  \glsifregular{\glslabel}%
  {\glsxtrregularfont{\glsgenentryfmt}}%
  {%
    \ifglshasshort{\glslabel}%
    {%
      \ifdefempty\glscustomtext
      {%
         \glsxtrabbreviationfont{\glsxtrgenabbrvfmt}%
      }%
      {%
        \ifglsused{\glslabel}%
        {%
          \glsabbrvfont{\glscustomtext}% replace short with custom text
        }%
        {%
          \glsfirstlongfont{\glscustomtext}% replace long with custom text
          \glsxtrfullsep{\glslabel}% separator
          \glsxtrparen{\glsfirstabbrvfont{\glsaccessshort{\glslabel}}}% (short)
        }%
      }%
    }%
    {\glsxtrregularfont{\glsgenentryfmt}}%
  }%
}

\newabbreviation[description={Ein Vektor ist ein Element eines Vektorraums.}]{Vektor}{VEC}{Vektor}

\begin{document}
First: \gls{Vektor}. Next: \gls{Vektor}.

Reset\glsresetall.

First: \glsdisp{Vektor}{Vektors}. Next: \glsdisp{Vektor}{Vektors}.

\end{document}

第一个实例\glsdisp将长格式替换为提供的文本。 下一个实例将短格式替换为提供的文本。

第一名:矢量(VEC)。下一步:VEC。重置。 第一:矢量(VEC)。下一步:矢量。

您可以根据自己的需求进行更改。例如,在后续使用中,您可能希望忽略自定义文本,而只使用常规的简短格式:

\renewcommand*{\glsentryfmt}{%
  \ifglshasshort{\glslabel}{\glssetabbrvfmt{\glscategory{\glslabel}}}{}%
  \glsifregular{\glslabel}%
  {\glsxtrregularfont{\glsgenentryfmt}}%
  {%
    \ifglshasshort{\glslabel}%
    {%
      \ifdefempty\glscustomtext
      {%
         \glsxtrabbreviationfont{\glsxtrgenabbrvfmt}%
      }%
      {%
        \ifglsused{\glslabel}%
        {%
          \glsabbrvfont{\glsaccessshort{\glslabel}}% short
        }%
        {%
          \glsfirstlongfont{\glscustomtext}% replace long with custom text
          \glsxtrfullsep{\glslabel}% separator
          \glsxtrparen{\glsfirstabbrvfont{\glsaccessshort{\glslabel}}}% (short)
        }%
      }%
    }%
    {\glsxtrregularfont{\glsgenentryfmt}}%
  }%
}

另一种方法是使用long-postshort-user-desc而不是long-short-desc(或者如果您决定不添加描述,则使用 而不是)。“帖子”样式将完整表单的第一部分放在链接文本中,将第二部分放在帖子链接挂钩中。这意味着long-postshort-user和只会用提供的文本替换第一部分:long-short\glsdisp\glslink

\documentclass{article}

\usepackage{glossaries-extra}

\setabbreviationstyle[abbreviation]{long-postshort-user-desc}
\renewcommand{\glsfirstlonguserfont}[1]{\emph{#1}}

\newabbreviation[description={Ein Vektor ist ein Element eines Vektorraums.}]{Vektor}{VEC}{Vektor}

% syntax: \disp[options]{label}{text}
\newcommand{\disp}[3][]{%
 \GlsXtrIfUnusedOrUndefined
  {#2}%
  {\glsdisp[textformat=glsfirstlongfont,#1]{#2}{#3}}%
  {\glsdisp[#1]{#2}{#3}}%
}

\begin{document}
First: \gls{Vektor}. Next: \gls{Vektor}.

Reset\glsresetall.

First: \disp{Vektor}{Vektors}. Next: \disp{Vektor}{Vektors}.

\end{document}

(“用户”样式用于\glsfirstlonguserfont在首次使用时格式化长格式。)

您可能需要考虑定义一个快捷命令。例如:

\newcommand{\disp}[3][]{%
 \GlsXtrIfUnusedOrUndefined
  {#2}%
  {\glsdisp[textformat=glsfirstlongfont,#1]{#2}{#3}}%
  {\glsdisp[#1]{#2}{#3}}%
}

(由于您正在使用bib2gls,因此最好使用\GlsXtrIfUnusedOrUndefined而不是\ifglsused。) style-sensitive在 的开头\glsfirstlongfont由 设置,因此可以在这种上下文中使用它。\glssetabbrvfmt\glsentryfmt

结果是:

第一名:矢量(VEC)。下一步:VEC。重置。 第一:矢量(VEC)。下一步:矢量。

相关内容