我试图理解如何抽象expl3
代码抽象为“函数”。
到目前为止,我有一个有效的宏来检测标记是否是大写字母:
\ExplSyntaxOn
\DeclareDocumentCommand\iscapital{m} {
\str_if_eq:eeTF {#1} {\tl_upper_case:n { #1 }} { T }{ F }
}
\ExplSyntaxOff
a: \iscapital{a}
A: \iscapital{A}
我尝试用两种方式来抽象这一点:
方法 1:
\ExplSyntaxOn
\DeclareDocumentCommand\iscapital{m} {
\bool_if:nTF { \__iscapital:n {#1} }{ T }{ F }
}
\cs_new_protected:Nn \__iscapital:n {
\str_if_eq:eeTF {#1} {\tl_upper_case:n { #1 }} {\c_true_bool}{\c_false_bool}
}
\ExplSyntaxOff
方法 2:
\ExplSyntaxOn
\DeclareDocumentCommand\iscapital{m} {
\bool_if:nTF { \__iscapital:n {#1} }{ T }{ F }
}
\cs_new_protected:Nn \__iscapital:n {
\tl_set:Nn \l_tmpa_tl {#1}
\tl_set:Nn \l_tmpb_tl { \tl_upper_case:n { #1 } }
\str_if_eq:eeTF \l_tmpa_tl \l_tmpb_tl { \c_true_bool }{ \c_false_bool }
}
\ExplSyntaxOff
方法 1 有效,但方法 2 出错。这是为什么?有没有办法制作一个像方法 2 那样的“函数”,在评估之前完成大量工作\c_*_bool
?
答案1
您似乎想要完全可扩展的功能,所以不行\tl_set:Nn
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\iscapitalTF}{mmm}
{
\siefken_if_capital:eTF { \tl_head:n { #1 } } { #2 } { #3 }
}
\prg_new_conditional:Nnn \siefken_if_capital:n { p,T,F,TF }
{
\str_if_eq:eeTF { \str_uppercase:n { #1 } } { #1 }
{
\prg_return_true:
}
{
\prg_return_false:
}
}
\prg_generate_conditional_variant:Nnn \siefken_if_capital:n { e } { p,T,F,TF }
\ExplSyntaxOff
\begin{document}
a: \iscapitalTF{a}{T}{F}
A: \iscapitalTF{A}{T}{F}
abc: \iscapitalTF{abc}{T}{F}
Abc: \iscapitalTF{Abc}{T}{F}
\end{document}