Probleme mit \usebox und \label

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Deancel
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Fr 6. Jan 2012, 14:56

Probleme mit \usebox und \label

Beitrag von Deancel »

Ich habe in meinem newenvironment das Problem, dass ich die Fehlermeldung "Missing \endcsname inserted" erhalte.
Die Umgebung soll folgendermaßen funktionieren:
\documentclass[12pt,oneside]{scrreprt}
\usepackage[latin1]{inputenc}						
\usepackage[babel,german=quotes]{csquotes}
\usepackage[german]{babel}
\usepackage{fancyhdr}
\usepackage{float}
\usepackage{tikz}
\usetikzlibrary{shapes,backgrounds}
\usepackage{array}

\newsavebox{\GrafikCaption}
\newsavebox{\GrafikLabel}
\newenvironment{grafik}[2]
{\begin{figure}[H] \sbox{\GrafikCaption}{#1} \sbox{\GrafikLabel}{#2} \begin{center} \begin{tikzpicture}}
{\end{tikzpicture} \end{center} \caption{\label{\usebox{\GrafikLabel}}\usebox{\GrafikCaption}} \end{figure}}


\begin{grafik}{Venn-Diagramm einer echten Teilmenge}{label}
	\draw [fill=yellow!50] (0,0) circle(1) node[]{$Z_1$};
	\draw (0.5,0) circle(2) node[]{};
	\node (L) at (1.75,0) {L};
\end{grafik}
Das newenvironment soll einfach den Code innerhalb der Arbeit abkürzen. Mit Caption soll eine Beschriftung unterhalb der Grafik entstehen, daher die Verschachtelung mit newsavebox. Die Labels brauche ich für einen Bezug.

Das Problem scheint die Stelle \label{\usebox{\GrafikLabel} zu sein. Wenn ich stattdessen \label{test} eingebe, funktioniert es einwandfrei. Das Label muss ja aber nach Caption kommen, deshalb sind andere Stellen ausgeschlossen.
Wo ist mein Fehler?

Ich habe auch schon versucht, das \label nicht ins Environment zu nehmen sondern manuell an die Stelle vor \end{grafik} zu schreiben. Allerdings ist die Referenz dann nicht die Grafik, sondern die Section. Das bringt also auch nichts.

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag von cgnieder »

Ich würde entweder \edef verwenden, um Caption und Label zu speichen, oder die Umgebung mit xparse definieren:
\documentclass[12pt,oneside]{scrreprt}
\usepackage{tikz,float}

\newenvironment{grafik}[3][H]
  {\begin{figure}[#1] \edef\GrafikCaption{#2} \edef\GrafikLabel{#3} \begin{center} \begin{tikzpicture}}
  {\end{tikzpicture} \end{center} \caption{\GrafikCaption}\label{\GrafikLabel}\end{figure}}

% oder mit xparse:
\usepackage{xparse}
\NewDocumentEnvironment{xgrafik}{O{H}mm}
  {\begin{figure}[#1]\begin{center}\begin{tikzpicture}}
  {\end{tikzpicture}\end{center}\caption{#2}\label{#3}\end{figure}}

\begin{document}

\begin{grafik}{Venn-Diagramm einer echten Teilmenge}{label}
   \draw (0,0) circle (1) node[] {$Z_1$};
   \draw (0.5,0) circle(2) node[]{};
   \node (L) at (1.75,0) {L};
\end{grafik}

\begin{xgrafik}{Venn-Diagramm einer echten Teilmenge}{label_zwo}
   \draw (0,0) circle (1) node[] {$Z_1$};
   \draw (0.5,0) circle(2) node[]{};
   \node (L) at (1.75,0) {L};
\end{xgrafik}

\begin{xgrafik}[htp]{Venn-Diagramm einer echten Teilmenge}{label_drei}
   \draw (0,0) circle (1) node[] {$Z_1$};
   \draw (0.5,0) circle(2) node[]{};
   \node (L) at (1.75,0) {L};
\end{xgrafik}

\end{document}
Clemens
Paketauthor

Deancel
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Fr 6. Jan 2012, 14:56

Beitrag von Deancel »

Ja, sauber! Die Variante mit \edef funktioniert einwandfrei!
Den Befehl kannte ich gar nicht. Hab zwar stundenlang gegoogelt, bin dabei aber nur auf die Möglichkeit mit den saveboxes gestoßen.

Vielen, vielen Dank!
Und noch einen schönen Sonntagabend.

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag von cgnieder »

\edef ist ein TeX-Befehl. Da wird der Befehl bei der Definition gleich expandiert, wodurch in diesem Fall das Argument „gespeichert“ wird.

Siehe z.B. das TeXbook für weitere Informationen.

PS: ich habe den Status mal auf „beantwortet“ gestellt. Ich hoffe, das ist ok...
Clemens
Paketauthor

Deancel
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Fr 6. Jan 2012, 14:56

Beitrag von Deancel »

Klar ist das ok.

Deancel
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Fr 6. Jan 2012, 14:56

Beitrag von Deancel »

Kurzer Nachtrag, den ich mit cgnieder per PN geführt habe, der aber auch für andere interessant sein könnte.



DEANCEL:
Nochmal kurz ein Nachtrag zu dem im Grunde gelösten Problem:

Mit der edef-Variante erhalte ich jetzt, wenn ich als caption einen längeren Text eingebe, z.B.
"Kartesisches Produkt der Mengen $A=\{a,b,c\}$ und $B=\{1,2,3\}$"
die Fehlermeldung:
TeX capacity exceeded, sorry [input stack size=5000]



CGNIEDER:
Du könntest einfach auf die mit xparse definierte Variante umsteigen, damit geht es nämlich fehlerfrei.

Oder die Zeile
\def\odef#1#2{\expandafter\def\expandafter#1\expandafter{#2}}
einfügen und in der Umgebungsdefinition \edef durch \odef ersetzen.



DEANCEL:
Die letzte Lösung funktioniert nun bei mir einwandfrei.
Vielen Dank dafür.

Antworten