Lualatex:更改特定字符的颜色

Lualatex:更改特定字符的颜色

这类似于更改大写字母的颜色下面的 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} 

在此处输入图片描述

相关内容