PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schriftgröße dynamisch ändern?



Tobis
21-01-2009, 14:54
Hallo zusammen,


ich plane gerade eine Vorlage für Aushänge zu erstellen. Dabei soll jeder Aushang gleich aussehen. D.h. bei jedem Aushang soll an der gleichen Stelle der Titel, ein beschreibendes Bild, ein beschreibender Text usw. sein.

Beim beschreibenden Text dachte ich mir, dass ich mir einen Bereich definiere, in dem der Text auftauchen soll. Falls der Text zu lange für den Bereich sein sollte, dann soll automatisch die nächst kleinere Schrift gewählt werden, so dass ich mit dem Text nicht auf die zweite Seite rutsche. Ich hoffe man kann mein Anliegen ungefähr verstehen.

Kennt jemand eine Lösung, mit der sich die Schrift automatisch verkleinert falls ein bestimmter bereich überschritten wird?


Danke, Tobi

rais
21-01-2009, 17:56
Moin moin,


Beim beschreibenden Text dachte ich mir, dass ich mir einen Bereich definiere, in dem der Text auftauchen soll. Falls der Text zu lange für den Bereich sein sollte, dann soll automatisch die nächst kleinere Schrift gewählt werden, so dass ich mit dem Text nicht auf die zweite Seite rutsche.
was genau meinst Du? Definierst Du Dir so etwas wie eine \parbox mit vorgegebener Breite/Höhe? Oder willst Du den Rest der Seite nutzen?
Ersteres ginge vllt per \settoheight\foo{\parbox{Breite}{Text, der den Platz einnehmen soll}} -- d.h. evtl musst Du diesen Test um \settodepth\bla{\parbox{Breite}{Text, der den Platz einnehmen soll}} erweitern, um an die Gesamthöhe zu kommen -- und einem entsprechendem Vergleich, ob \foo größer als die vorgesehene Höhe der \parbox wird ... (dann halt entsprechend mit \small, \footnotesize, \scriptsize und \tiny erweitern und den Test wiederholen).
Zweiteres ginge in ähnlicher Form, `Breite' wäre dann halt \linewidth ... und der Vergleich wäre auf \foo+\pagetotal < \pagegoal denkbar ...

MfG

Tobis
22-01-2009, 08:12
Also ersteres wäre mir genauso recht wie zweiteres.

Danke für deine Vorschläge, werd sie gleich mal ausprobieren!

Tobis
22-01-2009, 09:53
Also ich kriegs nicht gebacken.

\foo ist ja, wenn ich das richtig verstanden habe, ein beliebig zu definierender Befehl.
Mit \settoheight\foo{\parbox{Breite}{Text, der den Platz einnehmen soll}} weise ich dem Befehl \foo die Höhe des Textes, der sich in der \parbox befindet, zu. Ist das richtig?

ICh bekoomme leider immer wieder fehlermeldungen wenn ich das so eingebe. Auch wenn ich mir vorher mit \newcommand einen Befehl mit dem Namen \foo definiere klapps irgendwie nicht.

rais
22-01-2009, 10:04
\foo ist ja, wenn ich das richtig verstanden habe, ein beliebig zu definierender Befehl.
Mit \settoheight\foo{\parbox{Breite}{Text, der den Platz einnehmen soll}} weise ich dem Befehl \foo die Höhe des Textes, der sich in der \parbox befindet, zu. Ist das richtig?

nö, eine Länge


\newlength\foo
\settoheight\foo{\parbox...}

(\bla entsprechend)

siehe vllt `texdoc latex2e', Abschnitt ``Lengths''

MfG

voss
22-01-2009, 10:04
Also ich kriegs nicht gebacken.

\foo ist ja, wenn ich das richtig verstanden habe, ein beliebig zu definierender Befehl.
Mit \settoheight\foo{\parbox{Breite}{Text, der den Platz einnehmen soll}} weise ich dem Befehl \foo die Höhe des Textes, der sich in der \parbox befindet, zu. Ist das richtig?

ICh bekoomme leider immer wieder fehlermeldungen wenn ich das so eingebe. Auch wenn ich mir vorher mit \newcommand einen Befehl mit dem Namen \foo definiere klapps irgendwie nicht.


\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{graphicx}
\newsavebox\TBox
\newlength\MaxBreite
\setlength\MaxBreite{5cm}
\newcommand\Textzeile[1]{%
\sbox\TBox{#1}\ifdim\wd\TBox>\MaxBreite
\resizebox{\MaxBreite}{!}{#1}\else#1\fi}
\begin{document}
\rule{5cm}{1pt}

\Textzeile{Ein einfacher Text}

\Textzeile{Ein ziemlich langer Text, der nicht mehr reinpasst}

\end{document}


Herbert

Tobis
23-01-2009, 09:13
Vielen Dank für eure Tipps. Der Code von Herbert funktioniert einwandfrei, ich hab dann vesucht ihn auf meinen Fall umzumodeln aber dann klappts leider wieder nicht mehr. Auch in Kombination mit dem Vorschlag von Rainer krieg ich es nicht hin.

Meine beiden Versuche:

%%%%%%%%
1. Versuch
%%%%%%%%
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{graphicx}

\newsavebox\TBox
\newlength\MaxHoehe
\setlength\MaxHoehe{10cm}
\newcommand\Textzeile[1]{%
\sbox\TBox{#1}\ifdim\ht\TBox>\MaxHoehe
\resizebox{!}{\MaxHoehe}{#1}\else#1\fi}



%%%%%%%%
2. Versuch
%%%%%%%%
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{graphicx}

\newsavebox\TBox
\newlength\MaxHoehe
\setlength\MaxHoehe{10cm}
\newlength\foo
\settoheight\foo{\parbox{160mm}{Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!}}
\newcommand\Textzeile[1]{%
\sbox\TBox{#1}\ifdim\foo>\MaxHoehe
\resizebox{!}{\MaxHoehe}{#1}\else#1\fi}



%%%%%%%%%%
Der Text ist dann jeweils:

\begin{document}

\Textzeile{Ein einfacher Text}

\Textzeile{Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!}

\end{document}



Hab auch schon \settodepth bzw. \ifdim\dp ausprobiert, leider auch mit dem gleichen Ergebnis.

rais
23-01-2009, 10:23
Moin moin,

Auch in Kombination mit dem Vorschlag von Rainer krieg ich es nicht hin.
ob sich beide Ansätze so ohne weiteres kombinieren lassen, weiß ich nicht, ich dachte da an so etwas:


\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{graphicx}

\newlength\foo
\newlength\bla
\newlength\MaxHoehe
\setlength\MaxHoehe{10cm}
\newcommand\TextBox[3]{%
\settoheight\foo{\parbox{#1}{#3}}%
\settodepth\bla{\parbox{#1}{#3}}%
\addtolength\foo{\bla}% h+d
\ifdim\foo>#2
\settoheight\foo{\parbox{#1}{\tiny#3}}%
\settodepth\bla{\parbox{#1}{\tiny#3}}%
\addtolength\foo{\bla}%
\ifdim\foo>#2
\fbox{\verb=\foo= (\the\foo) selbst bei \verb=\tiny= zu hoch!}
\else
\parbox{#1}{\tiny#3}
\fi
\else
\parbox{#1}{#3}
\fi
}
\begin{document}

\TextBox{5cm}{1cm}{Ein einfacher Text}

\rule{5cm}{1pt}

\rule{10cm}{1pt}

\TextBox{100mm}{\MaxHoehe}{Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!Ein ziemlich langer Text, der nicht mehr reinpasst!}

\end{document}
das zeigt jetzt zwar nur eine Unterscheidung zwischen \normalsize und \tiny, lässt sich aber noch um entsprechende Tests auf \small, \footnotesize und \scriptsize erweitern.

MfG

voss
23-01-2009, 10:45
Vielen Dank für eure Tipps. Der Code von Herbert funktioniert einwandfrei, ich hab dann vesucht ihn auf meinen Fall umzumodeln aber dann klappts leider wieder nicht mehr. Auch in Kombination mit dem Vorschlag von Rainer krieg ich es nicht hin.


Hab auch schon \settodepth bzw. \ifdim\dp ausprobiert, leider auch mit dem gleichen Ergebnis.


\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{graphicx,blindtext}
\newsavebox\TBox
\newlength\MaxBreite\newlength\MaxHoehe
\setlength\MaxBreite{7cm}\setlength\MaxHoehe{3cm}
\newcommand\TextBox[1]{%
\savebox\TBox{\parbox[b]{\MaxBreite}{#1}}\ifdim\ht\TBox>\MaxHoehe
\resizebox*{\MaxBreite}{\MaxHoehe}{\usebox\TBox}\e lse\usebox\TBox\fi}
\begin{document}
\rule{\MaxBreite}{1pt}

\TextBox{\Huge Ein einfacher Text}

\rule{1pt}{\MaxHoehe}\TextBox{\Huge\blindtext}

\end{document}


Herbert

rais
23-01-2009, 14:58
Hmm, wie wäre es damit, die Box vorm Verkleinern erst -- in beiden Richtungen -- zu vergrößern?


\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{calc,graphicx,blindtext}
\newsavebox\TBox
\newlength\MaxBreite\newlength\MaxHoehe\newlength\ ximag\newlength\yimag
\setlength\MaxBreite{7cm}\setlength\MaxHoehe{3cm}
\newcommand\TextBox[1]{%
\savebox\TBox{\parbox[b]{\MaxBreite}{#1}}%
\ifdim\ht\TBox>\MaxHoehe
\setlength\yimag{0.25\ht\TBox + 0.75\MaxHoehe}%
\setlength\ximag{\yimag / \MaxHoehe * \MaxBreite}%
\savebox\TBox{\parbox[b]{\ximag}{#1}}%
\resizebox*{\MaxBreite}{\MaxHoehe}{\usebox\TBox}%
\else
\usebox\TBox
\fi
}
\begin{document}
\rule{\MaxBreite}{1pt}

\TextBox{\Huge Ein einfacher Text}

\rule{1pt}{\MaxHoehe}\TextBox{\Huge\blindtext}

\end{document}

vllt noch nicht ganz koscher, aber immerhin auch bei kleinerem Zoom bereits lesbar;-)

MfG

Tobis
04-02-2009, 15:49
Super, passt.

Danke für eure Hilfe!