我想建立一个命令\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]%
}%
}%
}