我有一个很长的符号和缩写列表,我会在软件包glossaries
和makeglossaries
程序中使用它们。我用多种语言(更具体地说是葡萄牙语和英语)编写内容,我想知道是否可以用多种语言编写符号和缩写定义,以便它们可以以与文档相同的语言或我选择的语言显示在词汇表和缩写列表中。
这是我正在寻找的一个例子
\newglossaryentry{expectation}{type=symbols, name={\ensuremath{\mathbb{E}}}, sort=e, description-en={expectation}, description-pt={expectativa}}
\newacronym{mlp}{MLP}{en={Multi-Layer Perceptron}, pt={Perceptron Multi-Camadas}}
然后我可以选择以哪种语言打印列表,例如通过发出像\printglossaries[en]
或 这样的命令\printglossaries[pt]
。
是否有任何软件包或程序能够管理具有多种语言定义的符号和首字母缩略词?提前致谢。
答案1
没有像这样的内置功能glossaries
,但我们可以使用来修补babel
它\languagename
。
- 对于普通的多语言描述,我将其修补为
\gls@defglossaryentry
使用 的\@mygls@selectdesc
默认值description
。此宏将尝试加载当前语言的描述,如果没有,则发出警告。请注意,如果您description
在任何条目中明确设置,您将覆盖此设置,并且无论 是什么,设置的值都将显示\languagename
。 - 对于缩写/首字母缩略词,我认为这实际上没有什么意义,因为首字母缩略词只使用一种语言。但是,我们可以为缩写添加翻译,并显示它们(如果存在)(这里不需要修补内部命令)。对于显示部分,我们定义了一个自定义词汇表样式。
\documentclass[spanish]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{xparse}
\usepackage{csquotes}
\usepackage[
abbreviations,
shortcuts=abbreviations,
stylemods=longbooktabs,
nonumberlist,
]{glossaries-extra}
\makeglossaries
% Create a custom glossary style for abbreviations, printing a translation if present.
\newglossarystyle{custom-long-booktabs}{%
\setglossarystyle{long-booktabs}%
\renewcommand\glossentry[2]{%
\glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
\glossentrydesc{##1}%
\glsxtrifhasfield{translation-\languagename}{##1}{%
\ \small(\enquote{\csname glsentrytrans\languagename\endcsname{##1}})
}{}%
\glspostdescription\space ##2\tabularnewline
}%
}
\makeatletter
% a macro for selecting the description in the current language
\def\@mygls@selectdesc#1{%
\glsxtrifhasfield{description-\languagename}{#1}{%
\glscurrentfieldvalue
}{%
\GenericWarning{}{LaTeX Warning:
No description for `#1' in language `\languagename'}
}%
}
% replace the default value of description with \@mygls@selectdesc
\patchcmd\gls@defglossaryentry
{\let\@glo@desc\@glsnodesc}
{\def\@glo@desc{\@mygls@selectdesc{#1}}}
{}{}
% Add description keys for the different languages.
\NewDocumentCommand\add@glslangdesckey{m o}{%
\begingroup
\edef\@tempa{%
\endgroup
\noexpand\glsaddkey*{description-#1}%
{\IfValueT{#2}{\expandafter\noexpand\csname glsentrydesc#2\endcsname{\noexpand\glslabel}}}%
\expandafter\noexpand\csname glsentrydesc#1\endcsname
\expandafter\noexpand\csname Glsentrydesc#1\endcsname
\expandafter\noexpand\csname glsdesc#1\endcsname
\expandafter\noexpand\csname Glsdesc#1\endcsname
\expandafter\noexpand\csname GLSdesc#1\endcsname
}%
\@tempa
}
\add@glslangdesckey{english}
\add@glslangdesckey{german}
\add@glslangdesckey{ngerman}[german]
\add@glslangdesckey{spanish}
\add@glslangdesckey{french}
% Add translation keys for the different languages.
\NewDocumentCommand\add@glslangtranskey{m o}{%
\begingroup
\edef\@tempa{%
\endgroup
\noexpand\glsaddkey*{translation-#1}%
{\IfValueT{#2}{\expandafter\noexpand\csname glsentrytrans#2\endcsname{\noexpand\glslabel}}}%
\expandafter\noexpand\csname glsentrytrans#1\endcsname
\expandafter\noexpand\csname Glsentrytrans#1\endcsname
\expandafter\noexpand\csname glstrans#1\endcsname
\expandafter\noexpand\csname Glstrans#1\endcsname
\expandafter\noexpand\csname GLStrans#1\endcsname
}%
\@tempa
}
\add@glslangtranskey{english}
\add@glslangtranskey{german}
\add@glslangtranskey{ngerman}[german]
\add@glslangtranskey{spanish}
\add@glslangtranskey{french}
\makeatother
% Define some glossary entries.
\newglossaryentry{one}{
name=one,
symbol=1,
description-english={the number one},
description-german={die Zahl Eins},
description-spanish={el número uno},
description-french={le numéro un},
}
\newglossaryentry{two}{
name=two,
symbol=2,
description-english={the number two},
description-german={die Zahl Zwei},
description-spanish={el número dos},
description-french={le numéro deux},
}
\newglossaryentry{three}{
name=three,
symbol=3,
description-german={die Zahl Drei},
description-spanish={el número tres},
}
% Define some abbreviations/acronyms.
\newacronym[
translation-english={union of south american nations},
translation-german={Union südamerikanischer Nationen},
translation-french={union des nations sud-américaines},
]{unasur}{UNASUR}{Unión de Naciones Suramericanas}
\newacronym[
translation-german={Nordatlantikpakt-Organisation},
translation-spanish={organización del tratado del atlántico norte (OTAN)},
translation-french={organisation du traité de l'Atlantique nord (OTAN)},
]{nato}{NATO}{north atlantic treaty organization}
\newabbreviation[
translation-english={and so forth},
translation-german={und so weiter},
translation-spanish={y lo demás},
translation-french={et les autres choses manquent},
]{etc}{etc.}{et cetera}
\begin{document}\makeatletter
\verb|\languagename| is \texttt{\languagename}
\gls{one},
\gls{two},
\gls{three}
\as{unasur},
\as{nato},
\as{etc}
\printglossary[type=main, style=tree]
\printglossary[type=abbreviations, style=custom-long-booktabs]
\end{document}