Solución:
Puede hacerlo con una expresión regular, si tiene la cadena de entrada como argumento.
documentclassarticle
usepackagexparse
%usepackagel3regex % only with expl3 before June 2017
usepackagexcolor
ExplSyntaxOn
NewDocumentCommandcolorcap Oblue m
sheljohn_colorcap:nn #1 #2
tl_new:N l__sheljohn_colorcap_input_tl
cs_new_protected:Npn sheljohn_colorcap:nn #1 #2
% store the string in a variable for usage with regex_replace_all:nnN
tl_set:Nn l__sheljohn_colorcap_input_tl #2
regex_replace_all:nnN
([A-Z]+) % search a capital letter (or more)
ctextcolorcB#1cE\cB\1cE % replace the match with textcolor#1
l__sheljohn_colorcap_input_tl
tl_use:N l__sheljohn_colorcap_input_tl
ExplSyntaxOff
begindocument
colorcapOnce Upon a Time
colorcap[red]Once Upon a Time
enddocument
Nota
La sintaxis de la cadena de reemplazo es un poco complicada, pero no difícil:
ctextcolor
significa “la secuencia de controltextcolor
“cB
significa “una abrazadera de apertura con su función normal de BGrupo inicialcE
significa “una llave de cierre con su función normal de miNd grupo
Por lo tanto, el texto de reemplazo se puede leer como
textcolor#1
dónde #1
es el argumento opcional para colorcap
.
Una versión que también admite acentos, siempre que se ingresen de la manera “clásica” con una macro.
documentclassarticle
usepackagexparse
usepackagexcolor
ExplSyntaxOn
NewDocumentCommandcolorcap Oblue m
sheljohn_colorcap:nn #1 #2
tl_new:N l__sheljohn_colorcap_input_tl
cs_new_protected:Npn sheljohn_colorcap:nn #1 #2
% store the string in a variable
tl_set:Nn l__sheljohn_colorcap_input_tl #2
regex_replace_all:nnN
% search a capital letter (or more)
([A-Z]+
% replace the match with textcolor#1
ctextcolorcB#1cE\cB\1cE
l__sheljohn_colorcap_input_tl
tl_use:N l__sheljohn_colorcap_input_tl
ExplSyntaxOff
begindocument
colorcap`Once rUpon a Time
colorcap[red]Once Upon a Time
enddocument
Aquí cC.
coincide con cualquier secuencia de control, ?
cero o una llave abierta, ?
cero o una llave cerrada, por lo que ambos `O
y rU
se capturan las entradas.
Esta solución muestra un enfoque de carácter activo, que (aunque pesado en la configuración) permitirá que uno tenga la letra mayúscula coloreada automáticamente. Pero debido a que las letras activas tenderán a romper las macros, proporciono los medios para desactivarlas. Esta solución revisada proporciona las siguientes macros:
capcoloron[color]
convierte todas las letras mayúsculas a este color (rojo predeterminado)
capcoloroff
desactiva los caracteres activos y restaura las definiciones originales de letras mayúsculas
coloronlettercolor
convierte solo esto [inactive] letra activa y la establece en el color especificado
coloroffletter
apaga solo este carácter activo y restaura su definición original.
La única peculiaridad es que para cambiar el color de una letra mayúscula determinada que ya está activa, primero se debe apagar el color y luego volver a encenderlo. Aquí está mi MWE:
documentclassarticle
usepackagexcolor
usepackagestringstrings
letsva Aletsvb Bletsvc Cletsvd Dletsve Eletsvf Fletsvg G
letsvh Hletsvi Iletsvj Jletsvk Kletsvl Lletsvm Mletsvn N
letsvo Oletsvp Pletsvq Qletsvr Rletsvs Sletsvt Tletsvu U
letsvv Vletsvw Wletsvx Xletsvy Yletsvz Z
catcode`A=activecatcode`B=activecatcode`C=activecatcode`D=active
catcode`E=activecatcode`F=activecatcode`G=activecatcode`H=active
catcode`I=activecatcode`J=activecatcode`K=activecatcode`L=active
catcode`M=activecatcode`N=activecatcode`O=activecatcode`P=active
catcode`Q=activecatcode`R=activecatcode`S=activecatcode`T=active
catcode`U=activecatcode`V=activecatcode`W=activecatcode`X=active
catcode`Y=activecatcode`Z=active
newcommandcolorcapon[1][red]%
catcode`A=activedef Atextcolor#1sva%
catcode`B=activedef Btextcolor#1svb%
catcode`C=activedef Ctextcolor#1svc%
catcode`D=activedef Dtextcolor#1svd%
catcode`E=activedef Etextcolor#1sve%
catcode`F=activedef Ftextcolor#1svf%
catcode`G=activedef Gtextcolor#1svg%
catcode`H=activedef Htextcolor#1svh%
catcode`I=activedef Itextcolor#1svi%
catcode`J=activedef Jtextcolor#1svj%
catcode`K=activedef Ktextcolor#1svk%
catcode`L=activedef Ltextcolor#1svl%
catcode`M=activedef Mtextcolor#1svm%
catcode`N=activedef Ntextcolor#1svn%
catcode`O=activedef Otextcolor#1svo%
catcode`P=activedef Ptextcolor#1svp%
catcode`Q=activedef Qtextcolor#1svq%
catcode`R=activedef Rtextcolor#1svr%
catcode`S=activedef Stextcolor#1svs%
catcode`T=activedef Ttextcolor#1svt%
catcode`U=activedef Utextcolor#1svu%
catcode`V=activedef Vtextcolor#1svv%
catcode`W=activedef Wtextcolor#1svw%
catcode`X=activedef Xtextcolor#1svx%
catcode`Y=activedef Ytextcolor#1svy%
catcode`Z=activedef Ztextcolor#1svz%
defcolorcapoff%
catcode`A=11let Asva%
catcode`B=11let Bsvb%
catcode`C=11let Csvc%
catcode`D=11let Dsvd%
catcode`E=11let Esve%
catcode`F=11let Fsvf%
catcode`G=11let Gsvg%
catcode`H=11let Hsvh%
catcode`I=11let Isvi%
catcode`J=11let Jsvj%
catcode`K=11let Ksvk%
catcode`L=11let Lsvl%
catcode`M=11let Msvm%
catcode`N=11let Nsvn%
catcode`O=11let Osvo%
catcode`P=11let Psvp%
catcode`Q=11let Qsvq%
catcode`R=11let Rsvr%
catcode`S=11let Ssvs%
catcode`T=11let Tsvt%
catcode`U=11let Usvu%
catcode`V=11let Vsvv%
catcode`W=11let Wsvw%
catcode`X=11let Xsvx%
catcode`Y=11let Ysvy%
catcode`Z=11let Zsvz%
newcommandcoloron[2]%
ifsva#1catcode`A=activedef Atextcolor#2svaelse%
ifsvb#1catcode`B=activedef Btextcolor#2svbelse%
ifsvc#1catcode`C=activedef Ctextcolor#2svcelse%
ifsvd#1catcode`D=activedef Dtextcolor#2svdelse%
ifsve#1catcode`E=activedef Etextcolor#2sveelse%
ifsvf#1catcode`F=activedef Ftextcolor#2svfelse%
ifsvg#1catcode`G=activedef Gtextcolor#2svgelse%
ifsvh#1catcode`H=activedef Htextcolor#2svhelse%
ifsvi#1catcode`I=activedef Itextcolor#2svielse%
ifsvj#1catcode`J=activedef Jtextcolor#2svjelse%
ifsvk#1catcode`K=activedef Ktextcolor#2svkelse%
ifsvl#1catcode`L=activedef Ltextcolor#2svlelse%
ifsvm#1catcode`M=activedef Mtextcolor#2svmelse%
ifsvn#1catcode`N=activedef Ntextcolor#2svnelse%
ifsvo#1catcode`O=activedef Otextcolor#2svoelse%
ifsvp#1catcode`P=activedef Ptextcolor#2svpelse%
ifsvq#1catcode`Q=activedef Qtextcolor#2svqelse%
ifsvr#1catcode`R=activedef Rtextcolor#2svrelse%
ifsvs#1catcode`S=activedef Stextcolor#2svselse%
ifsvt#1catcode`T=activedef Ttextcolor#2svtelse%
ifsvu#1catcode`U=activedef Utextcolor#2svuelse%
ifsvv#1catcode`V=activedef Vtextcolor#2svvelse%
ifsvw#1catcode`W=activedef Wtextcolor#2svwelse%
ifsvx#1catcode`X=activedef Xtextcolor#2svxelse%
ifsvy#1catcode`Y=activedef Ytextcolor#2svyelse%
ifsvz#1catcode`Z=activedef Ztextcolor#2svzelse%
fifififififififififififififififififififififififififi%
newcommandcoloroff[1]catcode`#1=11%
edeftmpdetokenize#1%
caselower[q]tmp%
expandafterletexpandafter#1csname svthestringendcsname%
catcode`A=11catcode`B=11catcode`C=11catcode`D=11catcode`E=11
catcode`F=11catcode`G=11catcode`H=11catcode`I=11catcode`J=11
catcode`K=11catcode`L=11catcode`M=11catcode`N=11catcode`O=11
catcode`P=11catcode`Q=11catcode`R=11catcode`S=11catcode`T=11
catcode`U=11catcode`V=11catcode`W=11catcode`X=11catcode`Y=11
catcode`Z=11
parskip 1em
begindocument
colorcapon[cyan]
verb|colorcapon[color]| will change all caps to the specified color\
A Test of The Active Method (verb|Even in Verbatim|)
colorcapoff
verb|colorcapoff| will restore all things to the original LaTeX setting\
A Test of The Active Method
coloronMbluecoloronAredcoloronTorange
verb|coloronlettercolor| will turn an inactive letter active with the
specified color, done here to letters ``M'', ``A'', and ``T'':\
A Test of The Active Method
coloroffA
verb|coloroffletter| will restore that letter to the original LaTeX
setting, here done to the letter ``A'':\
A Test of The Active Method
To change The color an already active letter, one must first turn the color off
and then set the color anew, as done here to the letter ``T'':\
coloroffTcoloronTgreen
A Test of The Active Method
enddocument
SOLUCIÓN ORIGINAL:
Esto muestra lo tradicional y peligroso enfoque de carácter activo. El enfoque activo requiere una buena cantidad de código de “configuración”, pero luego cambiará automáticamente los colores de las letras mayúsculas cuando se use.
Porque es peligroso, Proporciono los medios para entrar y salir del enfoque activo con colorcapon
y colorcapoff
. Solo configuré 3 letras … pero las otras 23 siguen de manera similar.
documentclassarticle
usepackagexcolor
begindocument
TRADITIONAL APPROACH:
textcolorredA letter can have its color textcolorblue!60Changed
with the textcolorcyan!80Use of verb|textcolor|.vspace2em
ACTIVE CHARACTER APPROACH
letsva A
letsvc C
letsvu U
catcode`A=active
catcode`C=active
catcode`U=active
defcolorcapon%
catcode`A=activedef Atextcolorredsva%
catcode`C=activedef Ctextcolorblue!60svc%
catcode`U=activedef Utextcolorcyan!80svu%
defcolorcapoff%
catcode`A=11let Asva%
catcode`C=11let Csvc%
catcode`U=11let Usvu%
catcode`A=11
catcode`C=11
catcode`U=11
colorcapon
A letter can have its color Changed with the Use of\
verb|textcolor. Wow. And I can Use it in verbatim|.vspace2emcolorcapoff
RESTORED TO ORIGINAL
A letter can have its color Changed with the Use of verb|textcolor|.
enddocument
Este es un fragmento programado en LuaLaTeX, un nuevo comando capme
toma el argumento, usa Lua y convierte los caracteres preseleccionados a través de expresiones regulares y unicode.utf8.gsub
función a un nuevo comando colorme
. Traté de implementar el cambio de palabras comunes, así como marcar una (palabras precedidas por un {
carta, p. ej. textitŇouma
). He ampliado una serie común de letras mayúsculas (de la A a la Z) con algunas letras con signos diacríticos para demostrar su característica adicional.
He encontrado una manera de desobedecer noexpand
comando que usé con frecuencia en mis ejemplos anteriores de LuaTeX. Estoy ampliando los comandos individuales en un grupo local, en este ejemplo es el textit
mando. Sin embargo, necesitaría ejemplos y datos más complejos si esta es la forma correcta de ahorrar tiempo de escritura.
Corremos lualatex mal-capitalization.tex
, Adjunto el archivo y una vista previa del resultado.
% lualatex mal-capitalization.tex
documentclass[a4paper]article
%usepackagefontspec % It also loads Latin Modern.
%usepackageluacode
usepackageluatextra % a recommended way of loading luacode (and fontspec) package
pagestyleempty
usepackagexcolor
begindocument
beginluacode*
selection="[%uČĎŇŘŠŤŽ]" -- the characters we consider to be coloured
function capme(text)
text=" "..text -- the first letter of a string is also considered for change
text=unicode.utf8.gsub(text, "([%s{])("..selection..")", "%1\colorme%2")
text=unicode.utf8.sub(text,2) -- delete that extra space
print(text) -- a new text written to the terminal
tex.print(text) -- deliver the result back to TeX
end -- function capme
endluacode*
defcapme#1%
% We neither need noexpandtextit nor noexpand#1 and \textit.
begingroup % Let's redefining begin!
letoldtextit=textit
deftextit##1noexpandoldtextit##1
directluacapme([[#1]])
endgroup % textit returns to its common definition.
defcolorme#1colorredbfseries#1
% A small demonstration of using it.
Hello World! capmeHello Capitalized WORLD!
Several words with diacritics: capmeČenich. textitŇouma.
Ďagilev. Šiška. Živočich. I'm back in textitcommon text.
enddocument
Recuerda comunicar este escrito si te fue de ayuda.