对于某些字符序列,我想更改所有字符的大小写以匹配第一个字符的大小写。例如,aBCD → abcd
和Abcd → ABCD
。
我天真地尝试在 LaTeX3 中执行此操作,但没有成功:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\regex_const:Nn \capitals {[A-Z]}
\cs_new:Npn \change_case:n #1 {
\tl_head:n {#1}
\regex_match:NnTF \capitals {\tl_head:n {#1}}
{\tl_use:N \tl_upper_case:n {\tl_tail:n {#1}}}
{\tl_use:N \tl_lower_case:n {\tl_tail:n {#1}}}
}
\begin{document}
\change_case:n {aBcD}~ \change_case:n {AbcD}
\end{document}
这给出了输出,aBCD ABCD
而不是预期的输出abcd ABCD
。
看来我在这里肯定做错了什么事情。
答案1
您需要在执行正则表达式之前扩展参数,否则它只是按原样查看它,并且\tl_head:n
不在您的大写字母列表中。
[如果这个解释太幼稚,请纠正我。]
请阅读 expl3 的命名指南。尽管即使违反这些指南,您的代码也能正常工作,但有充分的理由不这样做。从本质上讲,据我了解,该语法旨在避免困扰 2e 的冲突,并提高代码的一致性和透明度。
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\regex_const:Nn \c_kevin_capitals_regex {[A-Z]}
\cs_new_protected:Npn \keven_change_case:n #1 {
\tl_head:n {#1}
\regex_match:NxTF \c_kevin_capitals_regex {\tl_head:n {#1}}
{\text_uppercase:n {\tl_tail:n {#1}}}
{\text_lowercase:n {\tl_tail:n {#1}}}
}
\cs_generate_variant:Nn \regex_match:NnTF {NxTF}
\ExplSyntaxOff
\begin{document}
\ExplSyntaxOn
\keven_change_case:n {aBcD}~ \keven_change_case:n {AbcD}
\ExplSyntaxOff
\end{document}