词汇表-额外 - 创建新的首字母缩略词样式时出现问题

词汇表-额外 - 创建新的首字母缩略词样式时出现问题

我正在尝试使用 glossaries-extra 包和 bib2gls 工具创建一种新样式来在文本中显示我的首字母缩略词(因为我需要具有不同排序选项的其他列表)。

我需要创建一种新样式来在文本中显示它们,因为对于不属于我母语的首字母缩略词,必须在列表中以其原始的长格式显示,例如

快速傅立叶变换快速傅立叶变换

但在文本中,在第一次调用时,翻译的文本必须显示在括号外,而原文必须显示在括号内\gls{label},例如

... 快速傅里叶变换 (FFT,快速傅立叶变换)...

这样的缩写风格long-short-user几乎可以满足我的需要,只不过它会把关键词放在user1括号内。

因此,我尝试创建一种新的缩写样式(基于词汇表额外手册)和一个新的括号内容命令,\glsxtruserpareninverted例如

\documentclass{memoir}
\usepackage{ifluatex} % Verificação do compilador utilizado
\ifluatex
\usepackage{fontspec}
\else
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\fi

\usepackage[english]{babel}

\usepackage[record,style=long,nonumberlist,acronyms]{glossaries-extra}

\newcommand*{\glsxtruserpareninverted}[2]{%
    \glsxtrfullsep{#2}%
    \glsxtrparen
    {#1\ifglshasfield{\glsxtruserfield}{#2}{, \glsaccesslong{#2}}{}}
}

\newabbreviationstyle{user-short-long}
{%
    \renewcommand*{\CustomAbbreviationFields}{%
        name={\glsxtrlongshortname},
        sort={\the\glsshorttok},
        plural={\protect\glsabbrvuserfont{\the\glsshortpltok}},%
        first={\protect\glsfirstlongfont{\the\glslongtok}%
            \protect\glsxtrfullsep{\the\glslabeltok}%
            \glsxtrparen{\protect\glsfirstabbrvfont    {\the\glsshorttok}}},%
        firstplural={\protect\glsfirstlongfont{\the\glslongpltok}%
            \protect\glsxtrfullsep{\the\glslabeltok}%
            \glsxtrparen{\protect\glsfirstabbrvfont    {\the\glsshortpltok}}},%
        description={\protect\glsuserdescription{\the\glslongtok}%
            {\the\glslabeltok}}}%
    \renewcommand*{\GlsXtrPostNewAbbreviation}{%
        \glshasattribute{\the\glslabeltok}{regular}%
        {%
            \glssetattribute{\the\glslabeltok}{regular}{false}%
        }%
        {}%
    }%
}{%
    \renewcommand*{\abbrvpluralsuffix}{\glsxtrusersuffix}%
    \renewcommand*{\glsabbrvfont}[1]{\glsabbrvuserfont{##1}}%
    \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvuserfont{##1}}%
    \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
    \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
    \renewcommand*{\glsxtrfullformat}[2]{%
        \ifglshasfield{\glsxtruserfield}{##1}{
            \glsfirstlonguserfont{\glsentryuseri{##1}    \ifglsxtrinsertinside##2\fi}%
            \ifglsxtrinsertinside\else##2\fi
            \glsxtruserpareninverted{\glsabbrevuserfont    {\glsaccessshort{##1}}}{##1}%
        }
        % else
        {
            \glsfirstlonguserfont{\glsaccesslong{##1}    \ifglsxtrinsertinside##2\fi}%
            \ifglsxtrinsertinside\else##2\fi
            \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshort    {##1}}}{##1}%
        }
    }%
    \renewcommand*{\glsxtrfullplformat}[2]{%
        \glsfirstlonguserfont{\glsaccesslongpl{##1}    \ifglsxtrinsertinside##2\fi}%
        \ifglsxtrinsertinside\else##2\fi
        \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshortpl{##1}}}    {##1}%
    }%
    \renewcommand*{\Glsxtrfullformat}[2]{%
        \glsfirstlonguserfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
            \ifglsxtrinsertinside\else##2\fi
            \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshort    {##1}}}{##1}%
    }%
    \renewcommand*{\Glsxtrfullplformat}[2]{%
        \glsfirstlonguserfont{\Glsaccesslongpl{##1}    \ifglsxtrinsertinside##2\fi}%
        \ifglsxtrinsertinside\else##2\fi
        \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshortpl{##1}}}    {##1}%
    }%
}

\setabbreviationstyle[acronym]{user-short-long}

\GlsXtrLoadResources[
    src={Acronyms},
    sort={pt-BR},
    type={acronym},
]

\begin{document}
    \printunsrtglossary[type=acronym]
    \clearpage

    First time mentioning the \gls{sig:FFT} and the \gls{sig:DFT}.

    Now I'm mentioning \gls{sig:FFT} and \gls{sig:DFT} once again.
\end{document}

但它总是根据参数first中定义的键来格式化我的条目setup,即使regular属性设置为 false。

我对 LaTeX 没有太多经验,所以我不知道我的错误在哪里。

Acronyms.bib另外,代码中加载的文件内容是:

@acronym{sig:DFT,
    short={DFT},
    long={\textit{Discrete Fourier Transform}},
    user1={Transformada Discreta de Fourier}
}

@acronym{sig:FFT,
    short={FFT},
    long={\textit{Fast Fourier Transform}},
    user1={Transformada R\'{a}pida de Fourier}
}

答案1

我建议采用另一种方法,即使用自定义条目类型和字段。这样可以使其更加灵活,因此您可以.bib在不同的文档中使用同一个文件,并且使用不同的别名集,您可以根据特定文档要求获得不同的结果。为了进行比较,我还添加了一个巴西缩写:

@acronym{ABNT,
  short = {ABNT},
  long = {Associa\c{c}\~ao Brasileira de Normas T\'ecnicas}
}

@foreignabbreviation{sig:DFT,
  short = {DFT},
  foreignlong = {Discrete Fourier Transform},
  nativelong = {Transformada Discreta de Fourier}
}

@foreignabbreviation{sig:FFT,
  short = {FFT},
  foreignlong = {Fast Fourier Transform},
  nativelong = {Transformada R\'{a}pida de Fourier}
}

这里的目的是使bib2gls这些@foreignabbreviation条目看起来像是被写成这样:

@abbreviation{sig:FFT,
  short = {FFT},
  user1 = {Fast Fourier Transform},
  long = {Transformada R\'{a}pida de Fourier},
  category = {foreignabbreviation}
}

可以通过以下方式实现:

  entry-type-aliases={% make @foreignabbreviation act like @abbreviation
    foreignabbreviation=abbreviation
  },
  field-aliases={
    foreignlong=user1,
    nativelong=long
  },
  category={same as original entry}% requires bib2gls v1.4+

@acronym术语将category字段设置为acronym,因此可以使用以下方式设置其缩写样式:

\setabbreviationstyle[acronym]{long-short}

@foreignabbreviation条目将category字段设置为foreignabbreviation,因此可以使用以下方式设置:

\setabbreviationstyle[foreignabbreviation]{long-short-user}

这使得两种不同类型的缩写可以采用不同的格式。

英文术语在字段中user1,可以使用以下命令设置主文本使用的字体变化:

\renewcommand{\glsxtruserparen}[2]{%
 \glsxtrfullsep{#2}%
 \glsxtrparen
  {#1\ifglshasfield{\glsxtruserfield}{#2}{, \emph{\glscurrentfieldvalue}}{}}%
}

现在只处理词汇表中显示的英文长格式。最简单的方法是重新定义\glsuserdescription。这只在版本 1.30 中引入glossaries-extra,因此此方法不适用于旧版本:

\renewcommand{\glsuserdescription}[2]{%
 \ifglshasfield{\glsxtruserfield}{#2}{\emph{\glscurrentfieldvalue}}{#1}%
}

第一个参数是long值,第二个参数是标签,因此这将检查字段是否user1已设置,如果已设置,则使用该字段(因此long-short-user在这种情况下该样式也适用于 ABNT 术语)。

以下是完整文档:

\documentclass{memoir}

\usepackage{ifluatex}
\ifluatex
\usepackage{fontspec}
\else
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\fi

\usepackage[english]{babel}

\usepackage[record,style=long,nonumberlist,acronyms]{glossaries-extra}

\setabbreviationstyle[acronym]{long-short}
\setabbreviationstyle[foreignabbreviation]{long-short-user}

\renewcommand{\glsxtruserparen}[2]{%
 \glsxtrfullsep{#2}%
 \glsxtrparen
  {#1\ifglshasfield{\glsxtruserfield}{#2}{, \emph{\glscurrentfieldvalue}}{}}%
}
\renewcommand{\glsuserdescription}[2]{%
 \ifglshasfield{\glsxtruserfield}{#2}{\emph{\glscurrentfieldvalue}}{#1}%
}

\GlsXtrLoadResources[
  src  = {Acronyms},
  sort = {pt-BR},
  type = {acronym},
  entry-type-aliases={% make @foreignabbreviation act like @abbreviation
    foreignabbreviation=abbreviation
  },
  field-aliases={
    foreignlong=user1,
    nativelong=long
  },
  category={same as original entry}% requires bib2gls v1.4+
]

\begin{document}
    \printunsrtglossary[type=acronym]
    \clearpage

    First time mentioning the \gls{sig:FFT} and the \gls{sig:DFT}.
    And \gls{ABNT}.

    Now I'm mentioning \gls{sig:FFT} and \gls{sig:DFT} once again.
    And \gls{ABNT} again.

    Explicit long form: \glsxtrlong{sig:FFT}.
    Explicit full form: \glsxtrfull{sig:FFT}.
\end{document}

得出的结果为:

缩略词 ABNT 巴西标准技术协会 DFT 离散傅里叶变换 FFT 快速傅里叶变换

词汇表和正文内容如下:

第一次提到快速傅里叶变换(FFT,Fast Fourier Transform)和离散傅里叶变换(DFT,Discrete Fourier Transform)。以及巴西技术规范协会(ABNT)。现在我再次提到FFT和DFT。再次 ABNT。明确的长形式:傅里叶快速变换。明确全称:快速傅里叶变换(FFT,Fast Fourier Transform)。

使用旧版本的glossaries-extra,您可以调整词汇表样式来检查user1字段:

\newglossarystyle{longuser}{%
 \setglossarystyle{long}%
  \renewcommand{\glossentry}[2]{%
    \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
    \ifglshasfield{\glsxtruserfield}{##1}%
    {\emph{\glscurrentfieldvalue}}{\glossentrydesc{##1}}%
    \glspostdescription\space ##2\tabularnewline
  }%
}
\setglossarystyle{longuser}

新方法更好,因为它可以更轻松地切换词汇表样式。

相关内容