
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 \applytosplitstringwordspaced
e \applytosplitstringcharspaced
para aplicar um comando a cada um word
ou character
no 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
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 \processwords
que faz isso. Para usar este comando, primeiro você deve definir uma macro \processword
que 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á
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 \processwords
usa o“chamada antiga”onde cada palavra é colocada em uma caixa e a \processword
macro é 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
Alternativamente, você pode usar \processseparatedlist
which 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.