在德语中,复合词必须使用连字符连接。我有一些不包含连字符的英文缩写,例如“Machine Learning”。如果我将它们与德语文本中的另一个单词组合,则必须添加连字符,例如 Machine-Learning-Modell(英文:机器学习模型)。
我正在使用glossaries-extra
首字母缩略词包。通过写入,\acl{ML}-Modell
它会产生“Machine Learning-Modell”。在这种情况下,我如何强制它用连字符替换空格?当然,我可以用纯文本编写它,但我希望在我的首字母缩略词列表中列出该事件。
有没有办法一次性覆盖长文本?或者,如果首字母缩略词后面的字符是连字符,有人有自动化解决方案吗?
答案1
\
如果在定义中使用空格,则可以将其局部定义为-
如果后面有连字符。我\futurelet
在这里使用 not \@ifnextchar
,这样它就不会跳过空格。
\documentclass{article}
\newcommand\acl[1]{Machine\ Learning} % glossaries package, simplified:-)
\NewCommandCopy\oldacl\acl
\begin{document}
\makeatletter
\renewcommand{\acl}[1]{\@ifnextchar-{{\let\ -\oldacl{#1}}}{\oldacl{#1}}}
\makeatother
aaa \acl{ml} bbb \acl{ml}-foo ccc
\makeatletter
\RenewDocumentCommand\acl{m}{\def\aclnext{\oldacl{#1}}\futurelet\acltmp\aclinner}
\newcommand\aclinner{{\ifx\acltmp-\let\ -\fi\aclnext}}
\makeatother
aaa \acl{ml} bbb \acl{ml}-foo ccc
\end{document}
答案2
根据@david-carlisle的评论,以下对我有用:
\makeatletter
\NewCommandCopy\oldacl\acl
\renewcommand{\acl}[1]{\@ifnextchar-{{\let\ -\oldacl{#1}}}{\oldacl{#1}}}
\makeatother
不要忘记\
在定义中使用(例如Machine\ Learning
)。
\acl{ML}-Modell
现在生成“Machine-Learning-Modell”,同时\acl{ML}
仍然编译为“Machine Learning”。
答案3
您可以通过内部使用替换空格的命令来避免首字母缩略词定义中的特殊指令。
\documentclass{article}
\usepackage[shortcuts=ac]{glossaries-extra}
\ExplSyntaxOn
\NewDocumentCommand{\hnewacronym}{mmm}
{
\tl_set:Nn \l_tmpa_tl { #3 }
\tl_replace_all:Nnn \l_tmpa_tl { ~ } { \SPACEORHYPHEN }
\exp_args:NnnV \newacronym {#1} {#2} \l_tmpa_tl
}
\NewCommandCopy{\originalacl}{\acl}
\RenewDocumentCommand{\acl}{m}
{
\peek_charcode:NTF -
{
\hutter_acl:nn { 1 } { #1 }
}
{
\hutter_acl:nn { 0 } { #1 }
}
}
\cs_new_protected:Nn \hutter_acl:nn
{
\group_begin:
\cs_set:Npe \SPACEORHYPHEN { \int_if_odd:nTF { #1 } { - } { ~ } }
\originalacl{#2}
\group_end:
}
% Initialize
\cs_new_protected:Npn \SPACEORHYPHEN { ~ }
\ExplSyntaxOff
\hnewacronym{ML}{ML}{Machine Learning}
\begin{document}
We describe a \acl{ML}-Model
\acl{ML} is interesting
\end{document}
如果全部你的首字母缩略词应该遵循规则,你可以用以下方式替换第一个定义
\NewCommandCopy{\originalnewacronym}{\newacronym}
\RenewDocumentCommand{\newacronym}{mmm}
{
\tl_set:Nn \l_tmpa_tl { #3 }
\tl_replace_all:Nnn \l_tmpa_tl { ~ } { \SPACEORHYPHEN }
\exp_args:NnnV \originalnewacronym {#1} {#2} \l_tmpa_tl
}
因此您可以直接使用\newacronym
。