
Comenzando con un pasaje de texto como este:
This is a sample passage.
¿Cómo puedo configurar cada palabra para que aparezca aleatoriamente en un tamaño diferente, de una lista de 3 a 4 tamaños posibles?
Por ejemplo, en el resultado, "Esto" puede ser grande, "es" puede ser pequeño, "a" puede ser de tamaño mediano, etc.
- Cada vez que se renderiza el documento, pueden tener diferentes tamaños.
Respuesta1
Además de los dos comandos mencionados por Aditya y Henri, ConTeXt también proporciona los comandos \applytosplitstringwordspaced
y \applytosplitstringcharspaced
para aplicar un comando a cada uno word
o character
en el argumento dado.
\startluacode
function userdata.randomwordsize(str)
local sizes = { "10pt", "12pt", "14pt", "16pt", "18pt", "20pt" }
local size = sizes[math.random(1,6)]
context.startfont{ string.formatters["Serif at %s"](size) }
context(str)
context.stopfont()
end
\stopluacode
\starttext
\defineexpandable[1]\RandomWordSize
{\ctxlua{userdata.randomwordsize("#1")}}
\applytosplitstringwordspaced\RandomWordSize
{The fraction of fossil olfactory receptor genes is significantly
higher in all species with full color vision. This suggests that
the evolution of trichromatic vision --- which allows these
primates to detect food, mates, and danger with visual cues ---
has reduced their reliance on the sense of smell.}
\blank
\applytosplitstringcharspaced\RandomWordSize
{The fraction of fossil olfactory receptor genes is significantly
higher in all species with full color vision. This suggests that
the evolution of trichromatic vision --- which allows these
primates to detect food, mates, and danger with visual cues ---
has reduced their reliance on the sense of smell.}
\stoptext
Respuesta2
La parte difícil es aislar palabras de un pasaje y aplicar una macro arbitraria a cada una de las palabras. ConTeXt proporciona un comando \processwords
que hace esto. Para utilizar este comando, primero debes definir una macro \processword
que actuará sobre una palabra en particular.
Como ejemplo, supongamos que desea dibujar un marco alrededor de cada palabra. Luego, define:
\def\processword{\inframed}
\starttext
Normal text \processwords{This is a simple passage.} Normal text
\stoptext
lo que da
Ahora, el siguiente paso es crear una macro que elija un tamaño de fuente aleatorio y lo aplique.
Respuesta3
La respuesta de Aditya es, en principio, correcta, pero la ingenua macro para aleatorizar el tamaño de fuente no funcionará. Esto se debe a que por defecto \processwords
utiliza el“vieja llamada”donde cada palabra se coloca en un cuadro y la \processword
macro solo se evalúa una vez. Para mitigar esto, tenemos que cambiar manualmente al“Llamada MetaFun”que tampoco necesita llamar a Lua.
\def\processword#1{{\switchtobodyfont[\randomnumber{5}{15}pt]#1}}
\starttext
Normal text \processwords{This is a simple passage.} Normal text
\unprotect
\def\processwords#1%
{\syst_helpers_process_word#1 \_e_o_w_}% no \unskip
\protect
Normal text \processwords{This is a simple passage.}Normal text
\stoptext
Alternativamente puedes usar \processseparatedlist
lo que te permite usar un separador arbitrario:
\processseparatedlist
[This is a simple passage.]
[ ]
{\groupedcommand{\bgroup\switchtobodyfont[\randomnumber{5}{15}pt]}{\space\egroup}}
En todos los casos, busque espacios falsos después de la lista.