Como randomizar o tamanho do texto de cada palavra no ConTeXT?

Como randomizar o tamanho do texto de cada palavra no ConTeXT?

Começando com uma passagem de texto como esta:

This is a sample passage.

Como posso definir cada palavra para aparecer aleatoriamente em um tamanho diferente, em uma lista de 3 a 4 tamanhos possíveis?

Por exemplo, na saída, “This” pode ser grande, “is” pode ser pequeno, “a” pode ser de tamanho médio, etc.

  • Cada vez que o documento é renderizado, eles podem ter tamanhos diferentes.

Responder1

Além dos dois comandos mencionados por Aditya e Henri ConTeXt também fornece os comandos \applytosplitstringwordspacede \applytosplitstringcharspacedpara aplicar um comando a cada um wordou characterno argumento fornecido.

\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

Tamanho aleatório para cada palavra em uma string

Responder2

A parte difícil é isolar palavras de uma passagem e aplicar uma macro arbitrária a cada uma das palavras. ConTeXt fornece um comando \processwordsque faz isso. Para usar este comando, primeiro você deve definir uma macro \processwordque atuará em uma palavra específica.

Por exemplo, suponha que você queira desenhar uma moldura ao redor de cada palavra. Então, defina:

\def\processword{\inframed}

\starttext
Normal text \processwords{This is a simple passage.} Normal text
\stoptext

que dá

insira a descrição da imagem aqui

Agora, a próxima etapa é criar uma macro que escolha um tamanho de fonte aleatório e o aplique.

Responder3

A resposta de Aditya está, em princípio, correta, mas a macro ingênua para randomizar o tamanho da fonte não funcionará. Isso ocorre porque por padrão \processwordsusa o“chamada antiga”onde cada palavra é colocada em uma caixa e a \processwordmacro é avaliada apenas uma vez. Para mitigar isso, temos que mudar manualmente para o“Chamada MetaFun”que também não precisa chamar 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

insira a descrição da imagem aqui

Alternativamente, você pode usar \processseparatedlistwhich permite usar um separador arbitrário:

\processseparatedlist
  [This is a simple passage.]
  [ ]
  {\groupedcommand{\bgroup\switchtobodyfont[\randomnumber{5}{15}pt]}{\space\egroup}}

Em todos os casos, procure espaços falsos após a lista.

informação relacionada