根据第一个字符的大小写输入大写或小写

根据第一个字符的大小写输入大写或小写

对于某些字符序列,我想更改所有字符的大小写以匹配第一个字符的大小写。例如,aBCD → abcdAbcd → 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}

ABCD/ABCD

相关内容