Ich m�chte, dass die Schriftgr��e eines Textes sich von oben nach unten
von Zeile zu Zeile verkleinert. Die erste Zeile soll in 18 Punkt sein,
die letzte in 6 Punkt. Gibt es eine Umgebung, die das kann?
DiV und Gru�. Friedrich Vosberg
--
Kinderl�rm ist Zukunftsmusik.
vatolin (at) me (dot) com
Vielleicht kann man basierend auf "lineno" etwas bauen. Jede Zeile wird
bei diesem Paket einzeln behandelt (Nummern werden hinzugefügt).
Vermutlich könnte man das Ausgeben der Zeilennummern ersetzen durch das
Ändern der Schriftgröße. Nur so ins Blaue hinein...
...Rolf
> Ich m�chte, dass die Schriftgr��e eines Textes sich von oben nach unten
> von Zeile zu Zeile verkleinert. Die erste Zeile soll in 18 Punkt sein,
> die letzte in 6 Punkt. Gibt es eine Umgebung, die das kann?
AFAIK nein.
Was soll mit der Zeilenl�nge passieren?
Wenn sie analog schrumpft, k�nnte man
�ber das Skalieren arbeiten:
Man setzt den Text, zerpfl�ckt ihn von
Zeile zu Zeile (\vsplit) und skaliert jede
Zeile etwas kleiner.
Ansonsten k�nnte man mit \parshape arbeiten,
so dass die Zeilen immer l�nger werden, dann
zerpfl�ckt man wieder zuvor und schrumpft
die Zeilen wieder auf die Textbreite.
Oder man schreibt sich einen Soul-Treiber, der
den Text silbenweise aufspaltet. Dann f�gt
man solange Silben zur ersten Zeile, bis diese
voll ist und gibt diese aus. Dann schaltet man
auf eine kleinere Schriftart und f�llt die
zweite Zeile. Das geht dann so weiter, bis
der Text aufgebraucht ist. Die Zeilenzahl
muss man aus der Gesamtl�nge sch�tzen.
F�r ein genaueres Ergebnis kann man den
Prozess iterieren, damit in der letzten Zeile
die Schrift nicht zu klein oder zu gro� ist.
Viele Gr��e
Heiko <ober...@uni-freiburg.de>
Was willst Du schreiben? AGBs?
> Was willst Du schreiben? AGBs?
;-)
Ich will eine Todo-Liste generieren, deren Eintr�ge aus einer Datenbank
bezogen werden. In dieser Datenbank haben die zuletzt eingetragenen
Aufgaben die geringste Priorit�t; je �lter eine Aufgabe ist, umso h�her
ist die Priorit�t. Aus dieser Datenbank wird t�glich einen Todo-Liste
erstellt. Darin sollen die am dringlichesten zu erledigenden Aufgaben
oben in gro�er Schrift stehen und die weniger dringlichen dann nach
unten in immer kleinerer Schrift dargestellt werden.
Zugegeben, dass ist eine etwas verspielte Herangehensweise.
Aber vielleicht kann man das ja hin bekommen. Die Idee von Heiko halte
ich f�r einen durchaus Erfolg versprechenden L�sungsansatz.
Gru�. Friedrich
--
Kinderl�rm ist Zukunftsmusik.
> sollen die am dringlichesten zu erledigenden Aufgaben oben in großer
> Schrift stehen und die weniger dringlichen dann nach unten in immer
> kleinerer Schrift dargestellt werden.
Eine nicht zeilenweise, sondern eintragsweise Verkleinerung wäre ja
geradezu trivial, mit relsize ...
g.
> Heiko Oberdiek schrieb:
>
> > Die Zeilenzahl
> > muss man aus der Gesamtl�nge sch�tzen.
>
> Mir kommt es so vor, als ob das der interessanteste
> Teil an der Sache sein k�nnte, denn zum einen
> ist die Zeilenanzahl auch durch die Schriftgr��e
> bedingt, zum anderen h�ngt in der von Friedrich
> gestellten Aufgabe die Schriftgr��e der jeweiligen
> Zeile auch von der sich ergebenden Zeilenanzahl ab.
>
> Wie k�nnte man beim Sch�tzen vorgehen?
In der ersten Zeile bekommt man $z$ viel Text unter.
In der letzen Zeile mit 1/3 Schritftgr��e geht dreimal
soviel: $3z$. Es seien $n$ Zeilen gegeben.
Dann kann man ein Rechteck identifizieren, jede
Zeile hat mindestend $z$ viel Text, Fl�che = $nz$.
�brig bleibt ein rechtwinkliges Dreieck, deren Schenkel
$n$ und $2z$ sind, Fl�che = $\frac{n*2z}{2} = nz$.
Zusammen wird die Gesamtl�nge $G$ auf die
Fl�che $2nz$ verteilt. $z$ und $G$ sind bekannt,
so ist die Zeilenzahl $n = \frac{2G}{z}$.
F�r kleine $n$ ist die Fl�chenn�herung nicht so toll,
so dass man die ersten Werte besser explizit abfragt.
if G == 0 then n=0
elsif G <= z then n = 1
elsif G <=4z then n = 2
elsif n = ceil(2G/l)
z ist dabei die Zeilenl�nge,
G die Gesamtl�nge des Textes in der Anfangsschriftgr��e.
> Eine nicht zeilenweise, sondern eintragsweise Verkleinerung w�re ja
> geradezu trivial, mit relsize ...
Dem gegen�ber ist der Ansatz, eine Umgebung zu haben, in der unabh�ngig
von manuellen Zeilenumbr�chen, Abs�tzen o.dgl.m. die Zeichengr��e jeder
folgenden Zeile auf dem aktuellen Blatt gleichm��ig gemindert wird,
universaler.
Nehmen wir also an, jede Zeile ist maximal mit Text bef�llt.
$z$ ist also die Anzahl von Zeichen (druckbare Zeichen
einschlie�lich Leerzeichen), die bei einer
Festbreitenschrift den Platz (in der Breite) $p$ einnehmen.
> In der letzen Zeile mit 1/3 Schritftgr��e geht dreimal
> soviel: $3z$. Es seien $n$ Zeilen gegeben.
F�r die Zeile $k$ gilt, wenn $A(i)$ die Anzahl der
Zeichen in der Zeile $i$ angibt:
$A(k-1) \leq A(k) \leq A(k+1)$ f�r $2 \leq k \leq n-1$
> Dann kann man ein Rechteck identifizieren, jede
> Zeile hat mindestend $z$ viel Text, Fl�che = $nz$.
Genauer w�re also die Fl�che des Rechtecks = $n*(z*p)$
> �brig bleibt ein rechtwinkliges Dreieck, deren Schenkel
> $n$ und $2z$ sind, Fl�che = $\frac{n*2z}{2} = nz$.
Den Schritt sehe ich nicht so:
Ein rechtwinkliges (leeres) Dreieck kann nur dann
in das Rechteck eingetragen werden, wenn angenommen wird,
dass
1) jede Zeile genau gleich viel Zeichen enthalten,
2) und die Breite des einzelnen Zeichens sich verringert.
(Das Zweite wollen wir, das erste aber eigentlich nicht)
> Zusammen wird die Gesamtl�nge $G$ auf die
> Fl�che $2nz$ verteilt. $z$ und $G$ sind bekannt,
> so ist die Zeilenzahl $n = \frac{2G}{z}$.
Mhm...*gr�bel*:
Du m�chtest als Heuristik wirklich die Anzahl
aller Zeichen verdoppeln und durch die Anzahl
der Zeichen in einer Zeile dividieren?
Ich denke diese Heuristik ist zu gro�z�gig.
Garantiert wird man niemals mehr Seiten bekommen,
als der Text in original Gr��e ausmacht, und das
ist:
$n = \frac{G}{z}$
oder besser
$n = \frac{G}{z*p}$
mit $z$ Anzahl der Zeichen und $p$ ihr Platz in der Breite.
>
> F�r kleine $n$ ist die Fl�chenn�herung nicht so toll,
> so dass man die ersten Werte besser explizit abfragt.
> if G == 0 then n=0
> elsif G <= z then n = 1
> elsif G <=4z then n = 2
> elsif n = ceil(2G/l)
>
> z ist dabei die Zeilenl�nge,
> G die Gesamtl�nge des Textes in der Anfangsschriftgr��e.
Was ist das l ?
===========
�berlegen wir noch etwas formaler:
Gegeben/Annahmen:
1) Festbreiten Schrift
2) Abstand zwischen den Zeilen ist erstmal ABST(L)=konstant
3) lineare Verkleinerung der Zeichen pro Zeile
Gesucht:
$F(L)$ Funktion zur Berechnung
der Schriftgr��e zu einer Linie L
$B(L)$ Funktion zur Berechnung
der Breite eines Zeichens in Linie L
$Z(L)$ Funktion zur Berechnung
der Anzahl von Zeichen in der Linie L
$P(T)$ Funktion zur Berechnung
der Anzahl von Seiten
Bestimmung von $F(L)$:
> Die erste Zeile soll in 18 Punkt sein, die letzte in 6 Punkt.
Es sei $n$ die Anzahl aller Linien (oder Zeilen):
F�r $F(L)$ muss gelten,
1) F(1) = 18
2) F(n) = 6
-> Lineare Interpolation durch eine
Gerade f mit baryzentrischer Koordinate t
f(t) = (1-t)*18 + t*6, mit $t \in \mathbbm{R}, 0 \leq t \leq 1$
Wir m�ssen nun sicherstellen, dass gilt
F(1) = f(0) = (1-0)*18 + 0*6 = 18
F(n) = f(1) = (1-1)*18 + 1*6 = 6
dies gelingt mit L->t durch t = (L-1)/(n-1)
Am Beispiel von n = 10 Zeilen
L t F(L) = f(t)
1 0/9=0 18
2 1/9 16+(1/3)
3 2/9
4 3/9
5 4/9
6 5/9
7 6/9
8 7/9
9 8/9
10 9/9=1 6
Bestimmung von $B(L)$:
Entweder so:
B(L)=BreiteDesFontsMitGr��e(F(L))
... ist ja Festbreitenschrift,
sollte man also irgendwo auslesen k�nnen
oder ebenfalls mit linearer Interpolation
�ber baryzentrische Koordinaten:
Dann muss man nur die 18 durch die Breite ersetzen
und die 6 durch die entsprechende Breite
Bestimmung von $Z(L)$:
Ziel ist es die Textbreite w in cm (einer Zeile)
konstant zuhalten, aber die Anzahl der Zeichen
innerhalb einer Zeile entsprechend ihrer Breite
zu berechnen.
Sei w die Textbreite um L die Zeile, dann ist
Z(L) = w/(B(L)) die Anzahl der Zeichen in L
Bestimmung von $P(T)$:
Die Berechnung der Anzahl der Seiten, will sich mir
nicht als geschlossene Formel er�ffnen. Daher m�chte
ich hier einen Algorithmus angeben - ob und wie
er sich in TeX / LaTeX implementieren l�sst, kann ich
nicht �berblicken.
Es sei T ein Text (Zeichenkette)
Z�hlVariable AnzahlDerSeiten=0
FALLS (T nicht leer)
DANN BEGINN
Kopiere Inhalt von T nach temp
AnzahlDerSeiten=1
Z�hlVariable Linie=1
Gr��enVariable FreierPlatz = \textheight
SOLANGE (temp nicht leer)
BEGINN
Z�hlVariable Zeichen=0
SOLANGE (Zeichen <= Z(Linie))
BEGINN
entferne erstes Zeichen aus temp
Zeichen = Zeichen +1
ENDE
Linie = Linie + 1
FreierPlatz = FreierPlatz-F(Linie)-ABST(Linie)
FALLS (FreierPlatz <= 0)
DANN BEGINN
%Geh�rt diese Zeile schon auf
%die N�chste Seite
AnzahlDerSeiten = AnzahlDerSeiten+1
FreierPlatz = \textheight
ENDE
ENDE
ENDE
Besten Gru�,
Robert