
¿Es posible y además constructivo hacer que LaTeX formatee automáticamente palabras específicas de una manera específica? Digamos, por ejemplo, que me gustaría tener cada aparición de la palabra "hola" en una fuente monoespaciada cian en negrita, mientras que el resto del documento permanece normal, sin serifa y negro.
¿Cómo puedo lograr eso sin tener que realizar una búsqueda y reemplazo para colocar "hola" en un comando personalizado cada vez antes de compilar el archivo .tex?
Respuesta1
Compila esto con XeLaTeX
\documentclass{article}
\usepackage{color,xesearch}
\SearchList*{redwords}{\textcolor{red}{#1}}{hello}
\begin{document}
This is hello and this is hellow.
\end{document}
Pero no lo uses. Si desea marcar especialmente una palabra, utilice una macro.
¿Por qué? Confiar en procedimientos automáticos siempre es arriesgado: si tengo la opción, prefiero el margen explícito. Otra razón es que xesearch
necesita muchos recursos y actualmente no recibe mantenimiento.
No hay nada similar para pdflatex
; Posiblemente se pueda hacer algo con LuaLaTeX. Lo intenté chickenize
pero no parece ofrecer la función.
Respuesta2
Un poco tarde para la fiesta, pero aquí tienes una solución basada en LuaLaTeX. Configura una función que escanea la entrada.antesTeX realiza cualquiera de sus procesos habituales; cualquier cadena de instancia hello
se reemplaza "sobre la marcha" con {\ttfamily\bfseries\color{cyan}hello}
, para ser procesada por LaTeX.
\documentclass{article}
\usepackage{fontspec}
\setmonofont{Courier New}[BoldFont="Courier New Bold"]
\usepackage{luacode,xcolor}
\begin{luacode}
function hello ( s )
return (string.gsub(s , "(hello)(%L)", "{\\ttfamily\\bfseries\\color{cyan}%1}%2"))
end
\end{luacode}
\AtBeginDocument{\directlua{
luatexbase.add_to_callback("process_input_buffer", hello, "hello")}}
\begin{document}
hello hellow Hello hello.
\end{document}
Respuesta3
En ConTeXt, puede utilizar el translate
módulo para realizar dicha búsqueda y reemplazo en tiempo de compilación:
\usemodule[translate]
\definehighlight[SPECIAL][color=cyan, style=\ttbf]
\def\HELLO{\SPECIAL{hello}}
\translateinput[hello][\HELLO{}]
\enableinputtranslation
\setupbodyfont[ss,12pt]
\starttext
When you greet people, you say hello.
\stoptext
lo que da:
Respuesta4
Para mi diversión al usarLátex3, el código siguiente define un entorno boldwords
que acepta una lista de palabras separadas por comas que se escribirán en negrita dentro del entorno. Ejecutar el MWE produce:
Tenga en cuenta, en particular, que la log
entrada catalogue
no está en negrita porque no es una palabra completa.
\documentclass{article}
\usepackage{environ}
\usepackage{expl3}
\ExplSyntaxOn
\clist_new:N \l_bold_word_clist
\tl_new:N \l_BODY_tl
\NewEnviron{boldwords}[1]{
\clist_set:Nn \l_bold_word_clist {#1}
\tl_set:No \l_BODY_tl {\BODY}
\clist_map_inline:Nn \l_bold_word_clist {
\regex_replace_all:nnN {\b##1\b} { \c{textbf}\cB\{##1\cE\} } \l_BODY_tl
}
\l_BODY_tl
}
\ExplSyntaxOff
\begin{document}
\begin{boldwords}{dog, log}
a dog, a cat, a frog a log and a catalogue
a dog, a cat, a frog a log and a catalogue
a dog, a cat, a frog a log and a catalogue
a dog, a cat, a frog a log and a catalogue
a dog, a cat, a frog a log and a catalogue
\end{boldwords}
\end{document}