我有幾個以類似方式定義的函數,稍後將按名稱使用它們基礎+參數。
我沒有找到\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_...
名稱系列中。