PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erstellen eines eigenen Latex Environments für frabige Boxen



DrFaust
18-12-2010, 22:38
Hallo,

ich wollte gerne einen in einen srcbook etwas ähnliches haben wie einen Block in Latex Beamer haben. Leider habe ich keinen fertigen Befehl dafür gefunden. Was ich gefunden habe ist der folgende Blog (http://www.texample.net/tikz/examples/boxes-with-text-and-math/). Da wird mit Hilfe von tikz etwas ähnliches versucht. Der Code sieht etwa so aus:



\begin{tikzpicture}
\node [slblock_body] (box){%
\begin{minipage}{0.50\textwidth}
Text
\end{minipage}
};
\node[slblock_title, rounded corners, right=10pt] at (box.north west){Titel};
\end{tikzpicture}


Klappt wunderbar. Nun brauche ich solche Blocks öfter. Deshalb kam mir der Gedanke ein Environment daraus zu machen. Hier allerdings beginnt mein Problem. Der newenviroment Befehl erwartet einen Codeabschnitt der vor dem Envirment Body eingefügt wird. Das wäre demnach:



\begin{tikzpicture}
\node [slblock_body] (box){%
\begin{minipage}{0.50\textwidth}


und einen Codeabschnitt "für nach dem Body":



\end{minipage}
};
\node[slblock_title, rounded corners, right=10pt] at (box.north west){Titel};
\end{tikzpicture}

Das Resultat sieht bei mir so aus:



\newenvironment{slblock}
{
\begin{tikzpicture}
\node [slblock_body] (box){
\begin{minipage}{0.9\columnwidth}
}
{
\end{minipage}
};
\node[slblock_title, rounded corners, right=10pt] at (box.north west){Titel};
\end{tikzpicture}
}


An dieser Stelle streikt dann Latex.


\slblock ... \begin {minipage}{0.9\columnwidth } }
{ \end {minipage} }; \nod...
l.71 \begin{slblock}

! Missing } inserted.
<inserted text>
}
l.71 \begin{slblock}

Ich kann ja sogar verstehen wieso: Der Code der vor den Body kommt enthält eine öffnende Klammer aber keine schließende (die käme nach dem Body). Da die einzufügenden Codeblöcke für den newenvironment Befehl ja nun selber geklammert werden, ist der Befehl für keinen Parser dieser Welt mehr zu entziffern, da er schlicht uneindeutig ist. Wie also mache ich so etwas? Gibt es da irgendein workaround?

Danke. Ciao.

DrFaust

bobmalaria
18-12-2010, 23:12
so würde ich das machen, mit einem command. umgebung halte ich hierfür nicht angebracht


\documentclass{article}
\usepackage{tikz}
\begin{document}

\tikzstyle{slblock_body} = [draw=red, fill=blue!20, very thick,
rectangle, rounded corners, inner sep=10pt, inner ysep=20pt]
\tikzstyle{slblock_title} =[fill=red, text=white]

\newcommand{\baum}[2]{%
\begin{tikzpicture}%
\node [slblock_body] (box){%
\begin{minipage}{0.50\textwidth}%
#2%
\end{minipage}%
};%
\node[slblock_title, rounded corners, right=10pt] at (box.north west){#1};%
\end{tikzpicture}%
}

\baum{meintitel}{bla bla bla
\begin{itemize}
\item test
\item test
\item test
\end{itemize}
mehr bla bla
}
\end{document}

und das nächste mal ein richtiges volles beispiel mit allem nötigen code

sommerfee
19-12-2010, 10:08
\newenvironment{slblock}
{
\begin{tikzpicture}
\node [slblock_body] (box){
\begin{minipage}{0.9\columnwidth}
}
{
\end{minipage}
};
\node[slblock_title, rounded corners, right=10pt] at (box.north west){Titel};
\end{tikzpicture}
}


Das klappt deswegen so nicht, weil die Klammersymmetrie nicht stimmt. LaTeX erkennt nicht die richtigen Klammern als Blockende, weil in dem Startblock eine geöffnete Klammer ohne Gegenpart drin steht, in dem Endblock eine geschlossene ohne Gegenpart.

Lösen kann man das Problem, indem man die "alleinstehenden" Klammern durch \bgroup bzw. \egroup ersetzt. \bgroup ist das gleiche in grün wie {, wird aber beim Parsen als Befehl und nicht als Klammer behandelt, so daß für LaTeX die Klammersymmetrie stimmt, es also korrekt erkennen kann, wo der Startblock und Endblock startet bzw. endet.

Leider hast du kein lauffähiges Beispiel gepostet, deswegen muß jetzt dasjenige aus dem Blog als Beispiel herhalten:

Vorher:


\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes,snakes}
\usepackage{amsmath,amssymb}
\begin{document}

% Define box and box title style
\tikzstyle{mybox} = [draw=red, fill=blue!20, very thick,
rectangle, rounded corners, inner sep=10pt, inner ysep=20pt]
\tikzstyle{fancytitle} =[fill=red, text=white]

\begin{tikzpicture}
\node [mybox] (box){%
\begin{minipage}{0.50\textwidth}
To calculate the horizontal position the kinematic differential
equations are needed:
\begin{align}
\dot{n} &= u\cos\psi -v\sin\psi \\
\dot{e} &= u\sin\psi + v\cos\psi
\end{align}
For small angles the following approximation can be used:
\begin{align}
\dot{n} &= u -v\delta_\psi \\
\dot{e} &= u\delta_\psi + v
\end{align}
\end{minipage}
};
\node[fancytitle, right=10pt] at (box.north west) {A fancy title};
\node[fancytitle, rounded corners] at (box.east) {$\clubsuit$};
\end{tikzpicture}

\end{document}


Nachher:


\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes,snakes}
\usepackage{amsmath,amssymb}
\begin{document}

% Define box and box title style
\tikzstyle{mybox} = [draw=red, fill=blue!20, very thick,
rectangle, rounded corners, inner sep=10pt, inner ysep=20pt]
\tikzstyle{fancytitle} =[fill=red, text=white]

\newenvironment{mybox}[1]{%
\begin{tikzpicture}
\def\myboxtitle{#1}%
\node [mybox] (box)\bgroup
\begin{minipage}{0.50\textwidth}%
}{%
\end{minipage}%
\egroup;
\node[fancytitle, right=10pt] at (box.north west) {\myboxtitle};
\node[fancytitle, rounded corners] at (box.east) {$\clubsuit$};
\end{tikzpicture}%
}

\begin{mybox}{A fancy title}
To calculate the horizontal position the kinematic differential
equations are needed:
\begin{align}
\dot{n} &= u\cos\psi -v\sin\psi \\
\dot{e} &= u\sin\psi + v\cos\psi
\end{align}
For small angles the following approximation can be used:
\begin{align}
\dot{n} &= u -v\delta_\psi \\
\dot{e} &= u\delta_\psi + v
\end{align}
\end{mybox}

\end{document}


Liebe Grüße,
Axel

DrFaust
30-12-2010, 21:30
Hallo,

so nun nach dem die Feiertage um sind lese ich auch wieder Forum. Entschuldigt die Verzögerung. Die Lösung von sommerfee funktioniert wunderbar. Danke!