建立欧洲语言中缩写词的命令

建立欧洲语言中缩写词的命令

我想建立一个命令\contraction{<prep>}{<art>}来执行欧洲语言中的“冠词缩略词”。例如,我想

\contraction{de}{le}

用法语返回du。因此,在内部,它应该执行如下操作:

if #1 = prep1 and #2 = art1, return result1
if #1 = prep2 and #2 = art2, return result2
...

我无法想出一个简单而优雅的方法来实现这一点:重复类似的事情

\IfStrEq{<prep>}{#1}{%
        \IfStrEq{<art>}{#2}{%
            <result>%
        }{}%
    }{}%

这当然不是一个好方法。你有什么建议吗?


这样做的动机是为了帮助\cref正确解决收缩问题。例如,对于预定义的\crefname{theorem}{le théorème}{les théorème}\crefname{proposition}{la proposition}{les propositions},当写

On peut le déduire de \cref{thm1,thm2,prop3}.

(即“我们可以从...推断出这一点。“法语)

可以欺骗德莱斯定理 1 和 2 等命题3。

但正确的结果应该是:

可以欺骗设计定理 1 和 2 等德拉命题3。

因此,最好有一个新的命令\ccref[<prep>]{<labels>},并像

\ccref[de]{thm1,thm2,prop3}

为了得到

des théorèmes 1 et 2 et de la proposition 3.

为了这个目的,\contraction内部需要类似的东西。

答案1

编辑原始版本无法嵌套。这是 expl3 版本。

\NewExpandableDocumentCommand{\contraction}{mm}{%
    \str_case_e:nn { \languagename }
    {
        {french}{%
            \str_case_e:nnF {#1~#2} {%
                {à~le}      {au}%
                {à~la}      {à~la}%
                {à~l'}      {à~l'}%
                {à~les}     {aux}%
                {de~le}     {du}%
                {de~la}     {de~la}%
                {de~l'}     {de~l'}%
                {de~les}    {des}%
            }{#2}%
        }%
        {italian}{%
            \str_case_e:nnF {#1~#2} {%
                {a~il}      {al}%
                {a~lo}      {allo}%
                {a~l'}      {all'}%
                {a~la}      {alla}%
                {di~il}     {del}%
                {di~lo}     {dello}%
                {di~l'}     {dell'}%
                {di~la}     {della}%
                {da~il}     {dal}%
                {da~lo}     {dallo}%
                {da~l'}     {dall'}%
                {da~la}     {dalla}%
                {in~il}     {nel}%
                {in~lo}     {nello}%
                {in~l'}     {nell'}%
                {in~la}     {nella}%
                {su~il}     {sul}%
                {su~lo}     {sullo}%
                {su~l'}     {sull'}%
                {su~la}     {sulla}%
                {a~i}       {ai}%
                {a~gli}     {agli}%
                {a~le}      {alle}%
                {di~i}      {dei}%
                {di~gli}    {degli}%
                {di~le}     {delle}%
                {da~i}      {dai}%
                {da~gli}    {dagli}%
                {da~le}     {dalle}%
                {in~i}      {nei}%
                {in~gli}    {negli}%
                {in~le}     {nelle}%
                {su~i}      {sui}%
                {su~gli}    {sugli}%
                {su~le}     {sulle}%
            }{#2}%
        }%
        {portuguese}{%
            \str_case_e:nnF {#1~#2} {%
                {a~o}       {ao}%
                {a~a}       {à}%
                {a~os}      {aos}%
                {a~as}      {às}%
                {de~o}      {do}%
                {de~a}      {da}%
                {de~os}     {dos}%
                {de~as}     {das}%
                {em~o}      {no}%
                {em~a}      {na}%
                {em~os}     {nos}%
                {em~as}     {nas}%
            }{#2}%
        }%
        {brazilian}{%
            \str_case_e:nnF {#1~#2} {%
                {a~o}       {ao}%
                {a~a}       {à}%
                {a~os}      {aos}%
                {a~as}      {às}%
                {de~o}      {do}%
                {de~a}      {da}%
                {de~os}     {dos}%
                {de~as}     {das}%
                {em~o}      {no}%
                {em~a}      {na}%
                {em~os}     {nos}%
                {em~as}     {nas}%
            }{#2}%
        }%
        {spanish}{%
            \str_case_e:nnF {#1~#2} {%
                {a~el}      {al}%
                {de~el}     {del}%
            }{#2}%
        }%
    }%
}

原始帖子

最后我写了类似的东西,与@Davislor 在评论中描述的非常相似。由于我不熟悉这些语言,如果有任何错误,请告诉我。

\usepackage{xstring}

\newcommand{\contraction}[2]{%
    \IfStrEqCase{\languagename}{%
        {french}{%
            \IfStrEqCase{#1~#2}{%
                {à~le}      {au}%
                {à~la}      {à la}%
                {à~l'}      {à l'}%
                {à~les}     {aux}%
                {de~le}     {du}%
                {de~la}     {de la}%
                {de~l'}     {de l'}%
                {de~les}    {des}%
            }[#2]%
        }%
        {italian}{%
            \IfStrEqCase{#1~#2}{%
                {a~il}      {al}%
                {a~lo}      {allo}%
                {a~l'}      {all'}%
                {a~la}      {alla}%
                {di~il}     {del}%
                {di~lo}     {dello}%
                {di~l'}     {dell'}%
                {di~la}     {della}%
                {da~il}     {dal}%
                {da~lo}     {dallo}%
                {da~l'}     {dall'}%
                {da~la}     {dalla}%
                {in~il}     {nel}%
                {in~lo}     {nello}%
                {in~l'}     {nell'}%
                {in~la}     {nella}%
                {su~il}     {sul}%
                {su~lo}     {sullo}%
                {su~l'}     {sull'}%
                {su~la}     {sulla}%
                {a~i}       {ai}%
                {a~gli}     {agli}%
                {a~le}      {alle}%
                {di~i}      {dei}%
                {di~gli}    {degli}%
                {di~le}     {delle}%
                {da~i}      {dai}%
                {da~gli}    {dagli}%
                {da~le}     {dalle}%
                {in~i}      {nei}%
                {in~gli}    {negli}%
                {in~le}     {nelle}%
                {su~i}      {sui}%
                {su~gli}    {sugli}%
                {su~le}     {sulle}%
            }[#2]%
        }%
        {portuguese}{%
            \IfStrEqCase{#1~#2}{%
                {a~o}       {ao}%
                {a~a}       {à}%
                {a~os}      {aos}%
                {a~as}      {às}%
                {de~o}      {do}%
                {de~a}      {da}%
                {de~os}     {dos}%
                {de~as}     {das}%
                {em~o}      {no}%
                {em~a}      {na}%
                {em~os}     {nos}%
                {em~as}     {nas}%
            }[#2]%
        }%
        {brazilian}{%
            \IfStrEqCase{#1~#2}{%
                {a~o}       {ao}%
                {a~a}       {à}%
                {a~os}      {aos}%
                {a~as}      {às}%
                {de~o}      {do}%
                {de~a}      {da}%
                {de~os}     {dos}%
                {de~as}     {das}%
                {em~o}      {no}%
                {em~a}      {na}%
                {em~os}     {nos}%
                {em~as}     {nas}%
            }[#2]%
        }%
        {spanish}{%
            \IfStrEqCase{#1~#2}{%
                {a~el}      {al}%
                {de~el}     {del}%
            }[#2]%
        }%
    }%
}

相关内容