
Beginnen wir mit einer Textpassage wie dieser:
This is a sample passage.
Wie kann ich jedes Wort so einstellen, dass es zufällig in einer anderen Größe aus einer Liste mit 3–4 möglichen Größen angezeigt wird?
Beispielsweise könnte in der Ausgabe „Dies“ groß sein, „ist“ könnte klein sein, „ein“ könnte mittelgroß sein usw.
- Bei jeder Wiedergabe des Dokuments können die Größen unterschiedlich sein.
Antwort1
Neben den beiden von Aditya und Henri erwähnten Befehlen bietet ConTeXt auch die Befehle \applytosplitstringwordspaced
und \applytosplitstringcharspaced
zum Anwenden eines Befehls auf jedes word
oder character
im angegebenen Argument.
\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
Antwort2
Der schwierige Teil besteht darin, Wörter aus einer Passage zu isolieren und auf jedes dieser Wörter ein beliebiges Makro anzuwenden. ConTeXt bietet einen Befehl, \processwords
der dies tut. Um diesen Befehl zu verwenden, müssen Sie zunächst ein Makro definieren, \processword
das auf ein bestimmtes Wort einwirkt.
Angenommen, Sie möchten um jedes Wort einen Rahmen zeichnen. Definieren Sie dann:
\def\processword{\inframed}
\starttext
Normal text \processwords{This is a simple passage.} Normal text
\stoptext
was gibt
Der nächste Schritt besteht nun darin, ein Makro zu erstellen, das eine zufällige Schriftgröße auswählt und anwendet.
Antwort3
Adityas Antwort ist im Prinzip richtig, aber das naive Makro zur zufälligen Festlegung der Schriftgröße funktioniert nicht. Dies liegt daran, dass standardmäßig \processwords
die„alter Ruf“wobei jedes Wort in eine Box gesetzt wird und das \processword
Makro nur einmal ausgewertet wird. Um dies zu mildern, müssen wir manuell auf die„MetaFun-Anruf“das auch nicht Lua aufrufen muss.
\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
Alternativ können Sie verwenden \processseparatedlist
, was Ihnen die Verwendung eines beliebigen Trennzeichens ermöglicht:
\processseparatedlist
[This is a simple passage.]
[ ]
{\groupedcommand{\bgroup\switchtobodyfont[\randomnumber{5}{15}pt]}{\space\egroup}}
Achten Sie in jedem Fall auf unerwünschte Leerzeichen nach der Liste.