答案1
假设“字符”表示“输入中的单个字符标记”(因此 pdftex 仅使用 ASCII,而 xetex 或 luatex 使用 Unicode 输入),那么
\documentclass{article}
\usepackage{xcolor}
\begin{document}
\makeatletter
\def\ColorNthChar#1#2{\xColorNthChar{#1}#2\@empty}
\def\xColorNthChar#1#2{\ifnum\ifx\@empty#21\else#1\fi=1 \textcolor{red}{#2}\expandafter\@gobbletwo
\else#2\fi\xColorNthChar{\numexpr#1-1\relax}}
\makeatother
% example of use
\ColorNthChar{3}{classification} \ColorNthChar{23}{examination} \ColorNthChar{8}{examination}
\end{document}
更新版本检查单词是否太短。
答案2
一个简单的实现expl3
:
\documentclass{article}
\usepackage{xparse,xcolor}
\ExplSyntaxOn
\NewDocumentCommand{\colornth}{O{red}mm}
{% #1 = color to use, #2 = position, #3 = word
% deliver all characters before the chosen position
\tl_range:nnn { #3 } { 1 } { #2 - 1 }
% deliver the character in the chosen position with the desired color
\textcolor{#1}{ \tl_item:nn { #3 } { #2 } }
% deliver all characters after the chosen position
\tl_range:nnn { #3 } { #2 + 1 } { -1 }
}
\ExplSyntaxOff
\begin{document}
\colornth{3}{examination}
\colornth[blue]{-3}{examination}
\end{document}
对于负数,则从末尾开始计数。
只是为了好玩,如何为几个字符涂上不同的颜色。
\documentclass{article}
\usepackage{xparse,xcolor}
\ExplSyntaxOn
\NewDocumentCommand{\colornth}{O{red}mm}
{% #1 = color to use, #2 = number, #3 = word
\tl_range:nnn { #3 } { 1 } { #2 - 1 }
\textcolor{#1}{ \tl_item:nn { #3 } { #2 } }
\tl_range:nnn { #3 } { #2 + 1 } { -1 }
}
\NewDocumentCommand{\colorsome}{mm}
{% #1 = list of chars to color, #2 = word
% split the given token list
\seq_set_split:Nnn \l_tmpa_seq { } { #2 }
% with \seq_indexed_map_inline:Nn we have ##1=item number, ##2=item
\seq_indexed_map_inline:Nn \l_tmpa_seq
{
\textcolor{ \int_case:nnF { ##1 } { #1 } { . } }{ ##2 }
}
}
\ExplSyntaxOff
\begin{document}
\colornth{3}{examination}
\colornth[blue]{-3}{examination}
\colorsome{{3}{red}{6}{blue!75!red}}{examination}
\end{document}
的第一个参数应该\colorsome
是成对的列表{number}{color}
;由于是\int_case:nnF
完全可扩展的,最后我们将得到所选位置的颜色,或者.
表示当前颜色的颜色。
答案3
\documentclass{article}
\usepackage{xcolor,xparse}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand\ColorNthChar {mm}
{ \int_zero:N\l_tmpa_int
\tl_map_inline:nn
{
#2
}
{
\int_incr:N\l_tmpa_int
\int_compare:nNnTF {\l_tmpa_int}={#1}
{
\textcolor{red}{##1}
}
{
##1
}
}
}
\ExplSyntaxOff
% example of use
% example of use
\ColorNthChar{3}{examination}
\ColorNthChar{23}{examination}
\ColorNthChar{8}{examination}
\end{document}
答案4
虽然有点晚了,但这里有一个基于 LuaLaTeX 的解决方案。该解决方案设置为使用非 ASCII 编码字符,例如öäüßÖÄÜ
。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{xcolor}
%% set up the Lua function that does the actual work:
\directlua{
function color_nth_char ( n , s )
local t
t = unicode.utf8.sub(s,1,n-1) ..
"\string\\textcolor{red}{" .. unicode.utf8.sub(s,n,n) .. "}" ..
unicode.utf8.sub(s,n+1)
tex.sprint ( t )
end
}
%% set up a LaTeX utility macro that invokes the Lua function:
\newcommand\ColorNthChar[2]{\directlua{color_nth_char(#1,"#2")}}
\begin{document}
\ColorNthChar{3}{examination}
\ColorNthChar{4}{öäüßÖÄÜ}
\end{document}