这是我发到的原始消息的转发压缩文本.tex8 月份,这个问题还没有得到答复。很抱歉再次发布,但我想让更多读者知道。
我在 StackExchange 上找到了几个类似的问题(以及有用的答案),但它们更侧重于如何处理德语的各种情况。这不是我真正的问题,因为针对此问题的建议解决方法已经足够了。它们主要结合了\glslink
和的使用\glsdisp
。
以下是我原文的内容。
我想使用词汇表包来处理包含许多英语缩写的德语文档。为了更好地理解,我们来看一个简单的例子:
- 缩写:PSK
- 英文长文:Phase Shift Keying
- 德语长:Phasenumtastung
在大多数情况下,德语中没有对应的缩写,因此我想在文档中使用英文缩写。首次使用时,插入的文本应如下所示
相移键控 (PSK)
进一步使用时,仅
相移键控
应使用。
最后,在首字母缩略词列表中,它应如下所示:
PSK - Phasenumtastung(相移键控)
我尝试通过更新并遵循用户文档来设置一些自定义内容
\CustomAcronymFields
。我使用的是当前版本的词汇表 3.01 \SetCustomDisplayStyle
。\glossaryentryfield
我的方法基本上是在定义时将字符串放入", Phase Shift Keying"
描述字段\newacronym
,然后将其与自定义的\defglsdisplayfirst
和一起使用\glossaryentryfield
。
这是为了演示它看起来应该是什么样的:
% compile this with
% pdflatex example.tex
% makeindex -s "example.ist" -t "example.alg" -o "example.acr" "example.acn"
% pdflatex example.tex
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[acronym,nomain,sanitize={description=false,symbol=false}]{glossaries}
\makeglossaries
%% Desired style:
% first: "German long (acronym[, English long])"
% following: "acronym"
\renewcommand*{\CustomAcronymFields}{%
name={\the\glsshorttok},%
symbol={\the\glslongtok},%
text={\the\glsshorttok},%
plural={\the\glsshorttok\noexpand\acrpluralsuffix}%
}
\renewcommand*{\SetCustomDisplayStyle}[1]{%
% ##1 corresponds to the 'first' key
% ##2 corresponds to the 'description' key
% ##3 corresponds to the 'symbol' key
% ##4 is the inserted text given by the final optional argument to
% commands like \gls
% The short form can be obtained via \glsentryshort{\glslabel}
% The plural short form can be obtained via
%\glsentryshortpl{\glslabel}
% The long form can be obtained via \glsentrylong{\glslabel}
% The plural long form can be obtained via
%\glsentrylongpl{\glslabel}
\defglsdisplayfirst[#1]{##3 (##1##4##2##4)}%
% ##1 corresponds to the 'text' key
% the rest as above
\defglsdisplay[#1]{##1##4}%
}
\SetCustomStyle
% start the glossary entries with capitals
\newglossarystyle{superuc}{%
\glossarystyle{super}%
\renewcommand*\glossaryentryfield[5]{%
\glstarget{##1}{##2} & \makefirstuc{##4}##3\glspostdescription\space##5\\
}
}
%% acronym definitions
% italic typeset foreign language terms
\newcommand{\foreignlang}[1]{\emph{#1}}
% define acronym with both German and English long
\newcommand{\newacropair}[4]{\newacronym[description={, \foreignlang{#4}}]{#1}{#2}{#3}}
% define acronym with only German long
\newcommand{\newacrogerman}[3]{\newacronym[description={}]{#1}{#2}{#3}}
% define acronym with only English long
\newcommand{\newacroenglish}[3]{\newacronym[description={}]{#1}{#2}{\foreignlang{#3}}}
% sample acronyms
% English acronym along with its common German counterpart
\newacropair{acr:adc}{ADC}{Analog-Digital-Umsetzer}{Analog to Digital Converter}
% English acronym without a common German counterpart
\newacroenglish{acr:dect}{DECT}{Digital Enhanced Cordless Telecommunications}
% German acronym
\newacrogerman{acr:din}{DIN}{Deutsches Institut fuer Normung}
% Alternative first - to be used if the first use is not nominative singular.
% Problem: I do not find a way to use glossaries' integrated 'first use' flag.
% This macro is my current dirty implementation. It always displays the full form
% and unsets the 'first use' flag afterwards. Bad things happen if at a later point
% it time, I decide to mention the same acronym earlier. I'll be using \glsalt again
% and end up in a double definition of the acronym, which I would like to avoid.
\newcommand{\glsalt}[2]{\glslink{#1}{#2 (\acrshort*{#1}\glsdesc*{#1})}\glsunset{#1}}
\begin{document}
\section{Problems}
% For the first mention, I'll be using \glsalt, since I need to display the
% German text in genitive.
Die Aufloesung des \glsalt{acr:adc}{Analog-Digital-Umsetzers} beeinflusst\dots
% In the example below, I would need a plural form. That means an 's' would
% have to be attached to both the English acronym as well as the English long form.
% I have no clue how to implement that cleanly, due to my changes in
% \SetCustomDisplayStyle in the preamble.
Die Aufloesung der \glsalt{acr:adc}{Analog-Digital-Umsetzer} beeinflusst\dots
\section{Normal Cases}
\glsreset{acr:adc}
% These are only to show how it should look like for the 'normal' cases.
\gls{acr:adc} -- \gls{acr:adc}
\gls{acr:dect} -- \gls{acr:dect}
\gls{acr:din} -- \gls{acr:din}
\printglossary[type=\acronymtype,style=superuc,nonumberlist=false]
\end{document}
这对我来说很管用,除非第一次出现时我不必使用复数形式。从那时起,据我所知,词汇表背后的概念实际上不允许我进行调整。
我理解的主要原因是,当通过 定义新的缩写词时\newacronym
,除了标签之外,在 中只能传递和访问一种短格式和一种长格式\CustomAcronymFields
。这两个可以通过 和 访问\glsshorttok
,并将\glslongtok
它们存储在用户定义的键下,例如name
、symbol
、text
等。特别是description
键本身在此阶段无法访问。
从概念角度来看,如果可以
\newacronym
分别传递所有三种形式(短格式、英语长格式、德语长格式),然后以自定义方式连接起来,最终用相应的键(包括
firstplural
和)存储,将会很有帮助longplural
。请注意,对于我的示例,我例如必须在短格式的复数形式以及英语长格式后附加一个“s”,并在大多数情况下为德语长格式提供用户定义的复数形式。
目前,我唯一的问题是,您是否认为我的问题仍可以通过词汇表目前提供的内容来解决。如果不能,尝试重新定义几个命令是否有意义?我的印象是 eg\glsentryfull
必须重新定义。然而,我担心的一个主要问题是,这些命令中的大多数只接受一组键,例如,在 的情况下,只接受short
and long
(not description
) \glsentryfull
。
或者是否有另一个不需要修改就可以完成我的任务的包?
答案1
最简单的方法是使用glossaries-extra
包。翻译存储在user1
密钥中。long-short-user
缩写样式旨在在首次使用时在括号中包含附加信息。默认情况下,它会从字段中获取信息user1
。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[colorlinks]{hyperref}
\usepackage[acronym,
nomain,% don't create "main" glossary
postdot% put a period after the description
]{glossaries-extra}
\makeglossaries
% \glscurrentfieldvalue only works with glossaries v4.23 (and above)
\renewcommand{\glsxtrpostdescacronym}{%
\ifglshasfield{\glsxtruserfield}{\glscurrententrylabel}%
{ (\glscurrentfieldvalue)}%
{}%
}
\setabbreviationstyle[acronym]{long-short-user}
\newacronym[user1=Phase Shift Keying]{psk}{PSK}{Phasenumtastung}
\newacronym{aa}{AA}{Another Acronym}
\begin{document}
First use: \gls{psk}. Subsequent use: \gls{psk}.
First use: \gls{aa}. Subsequent use: \gls{aa}.
\printglossaries
\end{document}
描述后挂钩 (\glsxtrpostdesc
类别) 在词汇表中的描述后附加信息。这是一种方便的方法来进行细微调整,而无需定义新的词汇表样式。
\newabbreviation
如果您更喜欢使用\newacronym
,则需要重新定义 ,\glsxtrpostdescabbreviation
而不是 ,\glsxtrpostdescacronym
并使用 ,\setabbreviationstyle{long-short-user}
而不是\setabbreviationstyle[acronym]{long-short-user}
。 (\newacronym
隐式设置category=acronym
和\newabbreviation
隐式设置category=abbreviation
。)
如果你只想使用基础glossaries
包,那就稍微复杂一些。翻译仍然在字段中提供user1
:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
% define an acronym style for the acronyms with a translation:
\newacronymstyle{acronymslang}%
{%
\GlsUseAcrEntryDispStyle{long-short}%
}
{%
\GlsUseAcrStyleDefs{short-long}%
\renewcommand*{\genacrfullformat}[2]{%
\glsentrylong{##1}##2\space
(\protect\firstacronymfont{\glsentryshort{##1}}%
\ifglshasfield{useri}{##1}%
{, \glsentryuseri{##1}}{})%
}%
\renewcommand*{\Genacrfullformat}[2]{%
\Glsentrylong{##1}##2\space
(\protect\firstacronymfont{\glsentryshort{##1}}%
\ifglshasfield{useri}{##1}%
{, \glsentryuseri{##1}}{})%
}%
\renewcommand*{\genplacrfullformat}[2]{%
\glsentrylongpl{##1}##2\space
(\protect\firstacronymfont{\glsentryshortpl{##1}}%
\ifglshasfield{useri}{##1}%
{, \glsentryuseri{##1}}{})%
}%
\renewcommand*{\Genplacrfullformat}[2]{%
\Glsentrylongpl{##1}##2\space
(\protect\firstacronymfont{\glsentryshortpl{##1}}%
\ifglshasfield{useri}{##1}%
{, \glsentryuseri{##1}}{})%
}%
}
\setacronymstyle{acronymslang}
\newacronym[user1=Phase Shift Keying]{psk}{PSK}{Phasenumtastung}
\newacronym{aa}{AA}{Another Acronym}
% glossary style for acronyms with a translation
\newglossarystyle{acronymslang}
{%
\setglossarystyle{long}%
\renewcommand*{\glsgroupskip}{}%
\renewcommand{\glossentry}[2]{%
\glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
\glossentrydesc{##1}\glspostdescription
\ifglshasfield{useri}{##1}{ (\glsentryuseri{##1})}{}%
\space ##2\tabularnewline
}%
}
\setglossarystyle{acronymslang}
\begin{document}
First use: \gls{psk}. Subsequent use: \gls{psk}.
First use: \gls{aa}. Subsequent use: \gls{aa}.
\printglossaries
\end{document}
这不具备后描述钩子的优点,因此需要自定义词汇表样式。这两种方法之间的区别可以从通过或postdot
(postpunc=dot
仅glossaries-extra
)或nopostdot=false
包选项在描述后插入句号的位置看出。使用glossaries-extra
后描述钩子,终止标点符号位于钩子之后。
我最初的答案使用了旧版本,glossaries
并且必须使用内部命令,这是不可取的。最好更新到较新的版本并使用上述方法之一。没有自定义词汇表样式,因为它使用 hack 将内容附加user1
到description
字段。
\documentclass{article}
\usepackage{glossaries}
\usepackage{etoolbox}
\newtoks\customtok
\renewcommand*{\newacronymhook}{%
\edef\dosetkeys{\noexpand\setkeys{glossentry}{user1={},\the\glskeylisttok}}%
\dosetkeys
\ifcsempty{@glo@useri}%
{%
\expandafter\customtok\expandafter{\the\glsshorttok}%
}%
{%
\edef\custom{\the\glsshorttok, \csexpandonce{@glo@useri}}%
\expandafter\customtok\expandafter{\custom}%
}%
}
\newcommand*{\custompostdesc}[1]{%
\ifcsempty{glo@#1@useri}{}{ (\glsentryuseri{#1})}%
}
\renewcommand*{\CustomAcronymFields}{%
user1={},%
name={\the\glsshorttok},%
description={\the\glslongtok\noexpand\custompostdesc{\the\glslabeltok}},%
first={\the\glslongtok\space(\the\customtok)},%
firstplural={\the\glslongtok\noexpand\acrpluralsuffix
\space (\the\customtok)}%
text={\the\glsshorttok},%
plural={\the\glsshorttok\noexpand\acrpluralsuffix}%
}
\SetCustomStyle
\makeglossaries
\newacronym[user1=Phase Shift Keying]{psk}{PSK}{Phasenumtastung}
\newacronym{aa}{AA}{Another Acronym}
\begin{document}
First use: \gls{psk}. Subsequent use: \gls{psk}.
First use: \gls{aa}. Subsequent use: \gls{aa}.
\printglossaries
\end{document}