Sie sind hier

Rahmenboxen mit geschwungenen Rändern

In der Dokumentation zu Koma-Script werden Beispiele in Rahmenboxen gesetzt, die am oberen oder unteren Rand (bzw. an beiden) einen wellenartig geschwungenen Rahmen haben. Mich würde interessieren, wie dies in LaTeX realisiert ist.

MfG.
Florian

Bild von Markus Kohm

Die Ausgabe dieser Beispiele wird mit der Umgebung ShowOutput erledigt. Diese ist in scrguide.cls (zu finden unter source/latex/koma-script/doc/scrguide im installierten tds-Baum oder im tds-Archiv von KOMA-Script) definiert. Die geschwungene Linie ist schlicht mit \qbezier in einer picture-Umgebung realisiert. \qbezier ist im usrguide (Teil jeder LaTeX-Distribution) dokumentiert.

Übrigens wird für die Umgebung auch noch die sehr interessante lrbox-Umgebung verwendet, die ebenfalls im usrguide dokumentiert ist. Dazu kommen dann noch ein paar kleine Berechnungen. Diese sind in LaTeX realisiert. Die Anweisung \strip@pt aus dem LaTeX-Kern wäre für die Realisierung übrigens gar nicht notwendig gewesen. Das Paket eso-pic zeigt eine min. ebenso gute Methode, um eine Länge als Koordinatenwert in der picture-Umgebung zu verwenden.

Die Idee, das mit Bezier-Kurven zu machen, stammt übrigens von Jens. Ich hatte ursprünglich nur gestrichelte Linien vorgesehen.

Frage 1:
Ich möchte die Rahmenboxen mit geschwungenen Rändern in meinen Dokumenten verwenden. Weder über Google (zum herunterladen) noch auf meiner Installation (SuSE Linux 10.2) habe ich die benötigten Quellen gefunden, um das Makro "ShowOutput" entnehmen zu können. Auf meiner Festplatte bietet sich bezgl. KOMAscript folgende Landschaft an:

dh:/usr/share/texmf/tex # find . -name "*.cls" | grep scr
./latex/koma-script/scrartcl.cls
./latex/koma-script/scrbook.cls
./latex/koma-script/scrreprt.cls
./latex/koma-script/scrlttr2.cls
./latex/koma-script/scrlettr.cls

dh:/usr/share/texmf/tex # find . -name "*.cls" | grep scr | grep -H ShowOutput

Wer kann mir mit der Bereitstellung von "ShowOutput" einschl. aller notwendigen Umgebungen helfen?

Frage 2:
Ich verwende u.a. auch das Paket "niceframes" welches 4 Boxen bereitstellt. Wenn ich eine "vereinfachte", hausgemachte Nachbildung mit "\parbox" innerhalb einer mit \begin{multicols}..\end{multicols} Umgebung verwende, und der Inhalt der Box über das Seitenende hinausgeht, wird nicht auf die nächste Spalte umgebrochen, sondern in der gleichen Spalte ausgegeben, natürlich unsichtbar unterhalb des unteren Seitenrandes.
Gibt es einen Parameter, der für die Verwendung von \parbox innerhalb einer mehrspaltigen Umgebung geeignet ist?

Bild von Markus Kohm

Das bekommst du mit texdoc tds. Dort wird Dir dann erklärt, dass sich Quellen unter .../source/ und eben nicht unter .../tex/ befinden. Und wie es nunmal ist, installiert SuSE die Quellen nicht automatisch. Genau genommen ist das ein Verstoß gegen die Lizenz, denn es wiederspricht Punkt 3 der LPPL. Aber ich habe absolut keine Lust, mich schon wieder mit einem Distributor deswegen herumzuärgern. Bedanke Dich bei SuSE und verwende einfach die von mir empfohlenen Quellen für KOMA-Script, dort bekommt man es vollständig.

Zu Deiner zweiten Frage: Boxen konnten noch nie über mehrere Seiten umbrochen werden. Dabei ist völlig egal, wieviele Spalten ein Dokument hat.

Markus,
zunächst vielen Dank für Deinen Hinweis auf die Quellen von KOMA-Script. Ich habe aus scrguide2.cls die Umgebung "ShowOutput" UNVERÄNDERT kopiert und möchte sie in einer 2-spaltigen Umgebung einsetzen.

\begin{multicols}{2}

text text text text text .......

\begin{ShowOutput}
Es klingelt an der Tür eines Pfarrhauses in Stuttgart. Als die Haushälterin öffnet, steht ein unrasierter Mann in einem reichlich schäbigen Mantel vor der Tür und hält seine Strickmütze in der Hand.

„Gute Frau“, verkündet der Mann in gequältem Ton, doch bestem Hochdeutsch, während er verlegen von einem Bein auf das andere wechselt, „ich habe seit drei Tagen nichts mehr gegessen“.

Die Frau schüttelt mitleidig den Kopf und entgegnet im Brustton vollster Überzeugung: „Guda Moah, Sie missat sich halt zwinga!“
\end{ShowOutput}

text text text text text .......

\end{multicols}

Die Fehlermeldung lautet:
! You can't use `\spacefactor' in vertical mode.
\@->\spacefactor
\@m

In Helmut Kopka's LaTeX-Buch ist zur obigen Fehlermeldung sinngemäß vermerkt, dass "das Sonderzeichen # im normalen Text erschien. Wahrscheinlich sollte \# im Text stehen ..."

Wenn ich die Umgebung "ShowOutput" gegen eine andere austausche, z.B. gegen die Umgebung "QuellcodeRahmen" (KOMA-Script S. 111), läuft's problemlos.

Kannst Du mir bitte einen Hinweis geben, was ich falsch mache?

Eine kleine Frage (am Rande) zum Beispiel der Umgebung "QuellcodeRahmen" (KOMA-Script S. 111):
Ganz oben auf der Seite steht \newenvironment{QuellcodeRahmen}.
In der gerahmten Box ist der Zeichenkette "QuellcodeRahmen" ein Backslash vorangestellt.
Notwendig oder ein Versehen?

Danke
Gruß
Dieter

Bild von Markus Kohm

Die Fehlermeldung ist wörtlich in der De-TeX-FAQ zu finden – einschließlich Lösung, versteht sich. Und nein, mit »#« hat das gar nichts zu tun, sondern mit »@«.

Ich habe die beiden Befehle \makeatletter und \makeatother eingefügt. Siehe unten.
Die gleiche Fehlermeldung, trotz des Einfügens.

In einem nächsten Schritt habe ich die beiden Längenvariablen \@tempdima und \strip@pt in allen ihren Vorkommnissen umbenannt, so dass ihre Namen nicht mehr das @-Zeichen enthalten. Die gleiche Fehlermeldung.

Die \edef-Anweisung ist wohl eine erweiterte \def-Anweisung(?). Stimmt meine Vermutung, dass in der \edef-Anweisung Variablen vorkommen müssen, in deren Namen ein @-Zeichen ist? D.h. hat das @-Zeichen eine besondere Wirkung bei \edef? Über die Wirkung von \edef habe ich in Google nichts gefunden.

Hier die "ShowOutput"-Umgebung, die ich - wie gestern beschrieben - mit \begin{ShowOutput}...\end{ShowOutput} verwende:

\newsavebox\ShowOutputBox
\newenvironment{ShowOutput}[1][0pt]{\par
\begin{lrbox}{\ShowOutputBox}%
\minipage{.9\linewidth}%
\vspace*{\baselineskip}\vspace{-#1}%
}{%
\endminipage
\end{lrbox}%
\setlength{\unitlength}{1pt}%
\makeatletter
\setlength{\@tempdima}{\ht\ShowOutputBox}%
\addtolength{\@tempdima}{\dp\ShowOutputBox}%
\setlength{\@tempdima}{.75\@tempdima}%
\edef\MidY{\strip@pt\@tempdima}%
\addtolength{\@tempdima}{5pt}%
\edef\HighY{\strip@pt\@tempdima}%
\addtolength{\@tempdima}{-10pt}%
\edef\LowY{\strip@pt\@tempdima}%
\addtolength{\@tempdima}{5pt}%
\setlength{\@tempdima}{.9\linewidth}\edef\QuadIV{\strip@pt\@tempdima}%
\setlength{\@tempdima}{.675\linewidth}\edef\QuadIII{\strip@pt\@tempdima}%
\setlength{\@tempdima}{.45\linewidth}\edef\QuadII{\strip@pt\@tempdima}%
\setlength{\@tempdima}{.225\linewidth}\edef\QuadI{\strip@pt\@tempdima}%
\makeatother
\centering
\begin{picture}(\QuadIV,\MidY)
\qbezier(0,\MidY)(\QuadI,\HighY)(\QuadII,\MidY)%
\qbezier(\QuadII,\MidY)(\QuadIII,\LowY)(\QuadIV,\MidY)
\put(0,0){\makebox(\QuadIV,\MidY)[c]{%
\scalebox{.75}{\usebox{\ShowOutputBox}}%
}%
}%
\put(0,-5){\line(0,1){\HighY}}%
\put(\QuadIV,-5){\line(0,1){\HighY}}%
\qbezier(0,-5)(\QuadI,0)(\QuadII,-5)%
\qbezier(\QuadII,-5)(\QuadIII,-10)(\QuadIV,-5)
\end{picture}\par
\vspace{1ex plus 1ex minus .5ex}%
}

Bild von Markus Kohm

\edef steht für expanded definition. Den Unterschied zwischen \def und \edef siehst Du hier:

\def\A{A}
\def\B{\A}
\edef\C{\A}
\def\A{nicht A}
\show\A
\show\B
\show\C
\bye

Für das Beispiel benötigt man kein LaTeX es genügt TeX.

Zu Deinem catcode-Problem. Du änderst den catcode des at-Zeichens innerhalb eines Arguments von \newenvironment. Das bedeutet, dass das Argument bereits mit dem normalen catcode des at-Zeichens gelesen ist, wenn der catcode umgeschaltet wird. Die Token sind dann schon mit dem normalen catcode erzeugt.

Lösung: \makeatletter vor \newenvironment verschieben und \makeatother hinter das letzte Argument von \newenvironment. Dann hat das at-Zeichen den catcode letter bereits beim Lesen der Argumente.

PS: Verwende doch bitte ein paar HTML-Tags, damit Deine Codebeispiele halbwegs brauchbar formatiert werden.

Comments for "Rahmenboxen mit geschwungenen Rändern" abonnieren