我正在尝试使用 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}
得出的结果为:
词汇表和正文内容如下:
使用旧版本的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}
新方法更好,因为它可以更轻松地切换词汇表样式。