使用词汇表包查找德语文档中的英文缩写

使用词汇表包查找德语文档中的英文缩写

这是我发到的原始消息的转发压缩文本.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它们存储在用户定义的键下,例如namesymboltext等。特别是description键本身在此阶段无法访问。

从概念角度来看,如果可以 \newacronym分别传递所有三种形式(短格式、英语长格式、德语长格式),然后以自定义方式连接起来,最终用相应的键(包括 firstplural和)存储,将会很有帮助longplural。请注意,对于我的示例,我例如必须在短格式的复数形式以及英语长格式后附加一个“s”,并在大多数情况下为德语长格式提供用户定义的复数形式。

目前,我唯一的问题是,您是否认为我的问题仍可以通过词汇表目前提供的内容来解决。如果不能,尝试重新定义几个命令是否有意义?我的印象是 eg\glsentryfull必须重新定义。然而,我担心的一个主要问题是,这些命令中的大多数只接受一组键,例如,在 的情况下,只接受shortand 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}

首次使用:Phasenumtastung(PSK,相移键控)。后续使用:PSK。首次使用:另一个缩写词(AA)。后续使用:AA。缩写词 AA 另一个缩写词。1 PSK Phasenumtastung(相移键控)。1

描述后挂钩 (\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}

文件图像

这不具备后描述钩子的优点,因此需要自定义词汇表样式。这两种方法之间的区别可以从通过或postdotpostpunc=dotglossaries-extra)或nopostdot=false包选项在描述后插入句号的位置看出。使用glossaries-extra后描述钩子,终止标点符号位于钩子之后。

我最初的答案使用了旧版本,glossaries并且必须使用内部命令,这是不可取的。最好更新到较新的版本并使用上述方法之一。没有自定义词汇表样式,因为它使用 hack 将内容附加user1description字段。

\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}

文件图像

相关内容