我可以使用 catcode 将文档中的所有大写字母替换为 吗\textsc{\myletter}
?
编辑:我想通过一个函数来实现这一点,例如:
\thisismystring{BLABLABLA}
,转换为 BL{\textsc{a}}BL{\textsc{a}}BL{\textsc{a}}。
答案1
与我的评论相反,该xstring
包\StrSubstitute
失败了
\usepackage{xstring}
\newcommand*{\replaceA}[1]{%
\StrSubstitute{#1}{A}{\textsc{a}}%
}
以下解决方案使用 TeX 宏。
代码
\documentclass{article}
\makeatletter
\newcommand*{\replace}[3]{%
\def\qrr@replace##1#2##2\@qrr@replace{##1\if\relax\detokenize{##2}\relax\else#3\qrr@replace##2\@qrr@replace\fi}%
\qrr@replace#1#2\@qrr@replace}
\newcommand*{\replaceA}[1]{\replace{#1}{A}{\textsc{a}}}
\makeatother
\begin{document}
\replaceA{alAbAmA}
\replaceA{BLABLABLA}
\replaceA{not one capital a}
\replace{ALABAMA}{ABA}{\textsc{aba}}
\end{document}
输出
答案2
很xstring
简单:
\documentclass{article}
\usepackage{xstring}
\newcommand{\replaceA}[1]{%
\begingroup\expandarg
\StrSubstitute{#1}{A}{\textsc{a}}%
\endgroup
}
\newcommand{\mystring}{BLABLA}
\begin{document}
\replaceA{BLABLA}
\replaceA{\mystring}
\end{document}
l3regex
使用LaTeX3 模块的实现
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\replaceA}{smo}
{
\IfNoValueTF{#3}
{
\IfBooleanTF{#1}
{ \repla_main:NV \l_tmpa_tl #2 }
{ \repla_main:Nn \l_tmpa_tl { #2 } }
\tl_use:N \l_tmpa_tl
}
{
\IfBooleanTF{#1}
{ \repla_main:NV #3 #2 }
{ \repla_main:Nn #3 { #2 } }
}
}
\cs_new_protected:Npn \repla_main:Nn #1 #2
{
\tl_set:Nn #1 { #2 }
\regex_replace_all:nnN { A } { \c{textsc}\cB\{a\cE\} } #1
}
\cs_generate_variant:Nn \repla_main:Nn { NV }
\ExplSyntaxOff
\newcommand{\mystring}{BLABLA}
\begin{document}
\replaceA{BLABLA}
\replaceA*{\mystring}
\replaceA{BLABLA}[\newstring]
\show\newstring
\replaceA*{\mystring}[\newstring]
\show\newstring
\end{document}
如果没有指定可选参数,则立即使用替换后获得的字符串,否则将其存储在指定的控制序列中。
*-variant 允许将宏作为参数传递。