¿Cómo aleatorizar el tamaño del texto de cada palabra en ConTeXT?

¿Cómo aleatorizar el tamaño del texto de cada palabra en ConTeXT?

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 \applytosplitstringwordspacedy \applytosplitstringcharspacedpara aplicar un comando a cada uno wordo characteren 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

Tamaño aleatorio para cada palabra en una cadena

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 \processwordsque hace esto. Para utilizar este comando, primero debes definir una macro \processwordque 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

ingrese la descripción de la imagen aquí

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 \processwordsutiliza el“vieja llamada”donde cada palabra se coloca en un cuadro y la \processwordmacro 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

ingrese la descripción de la imagen aquí

Alternativamente puedes usar \processseparatedlistlo 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.

información relacionada