Wie kann ich die Textgröße jedes Wortes in ConTeXT zufällig festlegen?

Wie kann ich die Textgröße jedes Wortes in ConTeXT zufällig festlegen?

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 \applytosplitstringwordspacedund \applytosplitstringcharspacedzum Anwenden eines Befehls auf jedes wordoder characterim 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

Zufällige Größe für jedes Wort in einer Zeichenfolge

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, \processwordsder dies tut. Um diesen Befehl zu verwenden, müssen Sie zunächst ein Makro definieren, \processworddas 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

Bildbeschreibung hier eingeben

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 \processwordsdie„alter Ruf“wobei jedes Wort in eine Box gesetzt wird und das \processwordMakro 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

Bildbeschreibung hier eingeben

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.

verwandte Informationen