Latex3 按名稱使用函數

Latex3 按名稱使用函數

我有幾個以類似方式定義的函數,稍後將按名稱使用它們基礎+參數

我沒有找到\cs_use:c,但是有\use:c\cs_if_exist_use:c。這是做這樣的事情的正確方法還是我應該使用其他類似的方法\str_case:nn

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

答案1

這取決於當組合函數不存在時你想要做什麼。

該功能\cs_if_exist_use:c本質上與 相同\use:c:它們是 的包裝器\csname...\endcsname。然而,前者會進行檢查,而後者則不會。

那到底是什麼原因\cs_if_exist_use:c呢?這是該系列的一部分

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

如果你這樣做

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

你得到

*abc* +abc+ abc

但您可能希望收到第三種情況的警告,或者可能不會輸出任何內容。和

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

輸出將是

*abc* +abc+

因為\my_test_c:n不存在,所以 TeX 被指示放入\use_none:n輸入流,這會吞噬以下n參數。您可以在前面添加合適的警告或錯誤訊息\use_none:n

答案2

\use:c是來自 expl3 的早期版本,它正是為了這個任務(在您知道您的名字有效的情況下無需任何檢查)。可以說,它可以被賦予名稱\cs_use:c作為別名,但它同樣可以很好地用於標記列表變量,因此它被放入\use_...名稱系列中。

相關內容