这类似于更改大写字母的颜色下面的 MWE 是根据 egreg 的答案建模的。它可以正常工作,直到正确更改输入字符串中的第一个字符。我现在要做的是传递第二个参数,指示要更改字符串的哪个字符,即\capme{AVXxx}
我希望能够写入例如,\capme{AVXxx}{V}
并且只有“V”的颜色会发生变化。初始字符串最多有8 ASCII字母,它将始终包含一个与第二个参数匹配的字母(因此,在该示例中,它的唯一有效值是 A、V 或 X 之一)。
我尝试将第一个参数传递给字符串“s”,将第二个参数传递给字符串“l”,但即使将“l”硬编码为“V”也不起作用。
梅威瑟:
\documentclass{article}
\usepackage{xcolor}
\usepackage{luacode}
\begin{luacode*}
function wrap(s, l)
l="[%uV]"
s=" "..s -- The first letter may also change
s=unicode.utf8.gsub(s, "([%s{])("..l..")", "%1\\colorlead{%2}")
s=unicode.utf8.sub(s,2) -- Delete leading space
tex.print(s)
end -- function wrap
\end{luacode*}
\def\capme#1{\directlua{wrap([[#1]])}}
\begin{document}
\def\colorlead#1{{\color{red}#1}}
\capme{AVXxx}
\end{document}
答案1
可能你根本不需要 Lua。以下代码只是对第一个参数字符进行递归,并对与第二个参数匹配的字符进行着色。此外,我还添加了一个简单的基于 Lua 的命令。
\documentclass{article}
\usepackage{ifthen}
\usepackage{xcolor}
\usepackage{luacode}
\begin{luacode*}
function wrap(s, l)
s=unicode.utf8.gsub(s, l, "\\colorlead{%1}")
tex.print(s)
end
\end{luacode*}
\def\luacapme#1#2{\directlua{wrap([[#1]],[[#2]])}}
\makeatletter
\def\capme#1#2{\@capme{#2}#1\relax}
\def\@capme#1#2{%
\ifthenelse{\equal{\relax}{#2}}{%
\let\next\relax
}{%
\def\next{\@capme{#1}}%
\ifthenelse{\equal{#2}{#1}}{%
\colorlead{#2}%
}{%
#2%
}}\next
}
\makeatother
\def\colorlead#1{{\color{red}#1}}
\begin{document}
\luacapme{AVXxx}{A}
\luacapme{AVXxx}{V}
\luacapme{AVXxx}{x}
\end{document}
结果如下:
答案2
即使没有lua
;但是,当颜色发生变化时,它会破坏自然的字母间字距调整。
它的工作原理是,每次调用时创建一个新版本的宏\capmeaux
,该宏将自身设置为#2
以分隔符进行解析。因此,\capme{AVXxx}{A}
创建定义
\def\capmeaux#1A#2\relax{#1\textcolor{\colorlead}{A}#2}
然后继续调用它\capmeaux AVXxx\relax
妇女权利委员会:
\documentclass{article}
\usepackage{xcolor}
\newcommand\colorlead{red}
\newcommand\capme[2]{%
\def\capmeaux##1#2##2\relax{##1\textcolor{\colorlead}{#2}##2}\capmeaux#1\relax}
\begin{document}
\capme{AVXxx}{A}
\capme{AVXxx}{V}
\capme{AVXxx}{X}
\end{document}