Latx3 isme göre işlev kullanın

Aug 31 2020

Benzer şekilde tanımlanmış birkaç fonksiyonum var ve daha sonra base + argüman adıyla kullanılacaklar .

Bulamıyorum \cs_use:cama \use:cve var \cs_if_exist_use:c. Böyle bir şeyi yapmanın doğru yolu bu \str_case:nnmu yoksa başka bir şey mi kullanmalıyım ?

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Nn \my_test_a:n
  {
    *#1*
  }
\cs_new_protected:Nn \my_test_b:n
  {
    +#1+
  }
\NewDocumentCommand { \test } { m m }
  {
    \cs_if_exist_use:c { my_test_#1:n } { #2 }
  }
\ExplSyntaxOff

\begin{document}
\test{a}{abc}
\test{b}{abc}
\end{document}

Yanıtlar

9 egreg Aug 31 2020 at 15:45

Oluşturulan işlev olmadığında ne yapmak istediğinize bağlıdır.

İşlev \cs_if_exist_use:ctemelde \use:cşununla aynıdır : etrafı sararlar \csname...\endcsname. İlki, ancak ikincisinin olmadığını kontrol eder.

O halde sebebi nedir \cs_if_exist_use:c? Serinin bir parçası

\cs_if_exist_use:c \cs_if_exist_use:cT \cs_if_exist_use:cF \cs_if_exist_use:cTF

Yaparsan

\test{a}{abc}
\test{b}{abc}
\test{c}{abc}

sen alırsın

* abc * + abc + abc

ama muhtemelen üçüncü durum hakkında uyarılmak veya belki hiçbir şey çıktılamak istemezsiniz. İle

\NewDocumentCommand { \test } { m m }
  {
    \cs_if_exist_use:cF { my_test_#1:n } { \use_none:n } { #2 }
  }

çıktı olurdu

* abc * + abc +

çünkü \my_test_c:nmevcut olmadığından \use_none:n, TeX'e aşağıdaki nargümanı yutan giriş akışını koyması talimatı verilir . Önüne uygun bir uyarı veya hata mesajı ekleyebilirsiniz \use_none:n.

5 FrankMittelbach Aug 31 2020 at 18:05

\use:cExpl3 çok erken güne aittir ve (eğer adı geçerli olduğunu biliyoruz durumlarda herhangi çeki olmayan) bu görev için tam olarak bu. Muhtemelen ad \cs_use:cbir takma ad olarak verilmiş olabilir, ancak simge listesi değişkenleri için eşit derecede kullanılabilir ve bu nedenle \use_...ad ailesine konulmuştur .