例如,SoMeThInGlIkEtHiS
如何才能实现这一点?我正在写一篇模因论文,这很重要……
答案1
包装内容稍微简短一些xstring
:
\documentclass{article}
\usepackage{xstring}
\newif\ifupper\uppertrue
\newcommand{\mixedcase}[1]{%
\StrSplit{#1}{1}{\currentchr}{\tailchr}%
\ifupper\MakeUppercase{\currentchr}\upperfalse\else\MakeLowercase{\currentchr}\uppertrue\fi%
\IfStrEq{\tailchr}{}{\uppertrue}{\mixedcase{\tailchr}}%
}
\begin{document}
\mixedcase{something like this}
\end{document}
输出相同安德鲁斯的回答。
解释:在第一个字符处拆分字符串,根据切换按钮(\ifupper
)将该字符变为大写或小写,切换切换按钮,检查字符串中是否还有剩余字符(拆分的第二部分不为空),如果是,则递归调用该命令,如果没有,则重置切换按钮进行下一次操作并停止。
答案2
LaTeX3 版本,改编自 egreg 的答案这里:
\documentclass{article}
\usepackage{xparse}
\usepackage{expl3}
\ExplSyntaxOn
\NewDocumentCommand{\markletters}{m}
{
\int_zero:N \l_tmpa_int
\tl_set:Nn \l_tmpa_tl { #1 }
% replace spaces with something different
\tl_replace_all:Nnn \l_tmpa_tl { ~ } { \c_space_tl }
\tl_map_inline:Nn \l_tmpa_tl
{
\tl_if_blank:eTF { ##1 }
{ ~ } % don't advance the counter and issue a space
{
\int_if_odd:nTF { \l_tmpa_int } { \tex_lowercase:D } { \tex_uppercase:D } { ##1 }
\int_incr:N \l_tmpa_int
}
}
}
\prg_generate_conditional_variant:Nnn \tl_if_blank:n { e } { T,F,TF,p }
\ExplSyntaxOff
\begin{document}
\markletters{something like this}
\end{document}
答案3
以下是使用正则表达式的略有不同的 LaTeX3 实现。空格字符被视为字母,因此两行
\CaPiTaLiSe{Something like this}
\CaPiTaLiSe{Somethinglikethis}
产生略有不同的大小写:
以下是代码:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_evan_letters_seq
\cs_new_protected_nopar:Nn \evan_make_upper:n {
\str_uppercase:n {#1}
\cs_set_eq:NN \evan_capitalise:n \evan_make_lower:n
}
\cs_new_protected_nopar:Nn \evan_make_lower:n {
\str_lowercase:n {#1}
\cs_set_eq:NN \evan_capitalise:n \evan_make_upper:n
}
\NewDocumentCommand\CaPiTaLiSe{m}{
\regex_split:nnN {} {#1} \l_evan_letters_seq
\cs_set_eq:NN \evan_capitalise:n \evan_make_upper:n
\seq_map_inline:Nn \l_evan_letters_seq {\evan_capitalise:n {##1} }
}
\ExplSyntaxOff
\begin{document}
\CaPiTaLiSe{Something like this}
\CaPiTaLiSe{Somethinglikethis}
\end{document}
\evan_capitalise:n
我有一个在选择大写和小写之间切换的虚拟宏,而不是增加计数器。