Seite 1 von 1

Lässt sich \caption nicht umdefinieren

Verfasst: Fr 11. Mär 2011, 14:33
von iTob
Hallo Forum,

ich versuche gerade eine Nicht-Gleitumgebung für Tabellen und Abbildungen zu basteln. Die Beschriftung kann ich mit \captionof erzeugen, aber ich würde gerne das \caption innerhalb der neuen Umgebung zu \captionof umdefiniert wird, was nicht zu gehen scheint und bei mir nur dazu führt, dass pdfLaTeX ewig läuft ohne Ergebnis. Definiere ich stattdessen einen eigenen Befehl \Caption (mit großem C) geht es. Woran liegt das?

Hier das Beispiel
\documentclass[ngerman]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{blindtext}

\usepackage{caption}% das KOMA-Klassen \captionof auch
% bereitstellen weiß ich, aber im Original brauche ich
% die normale article-Klasse

% neue Umgebungen für nichtgleitende Tabellen und
% Abbildungen
\makeatletter
\def\ifEmpty#1{\def\@temp{#1}\ifx\@temp\@empty} 
\newenvironment{svtable}{%
	\par\small%
	\@setnobreak% Wozu?
	\@setminipage% Wozu?
	\setlength{\parindent}{0pt}%
	\newcommand\Caption[2][]{%
	% mit
%	\renewcommand\caption[2][]{%
	% stattdessen geht es nicht
		\ifEmpty{##1}%
		\captionof{table}{##2}%
		\else
		\captionof{table}[##1]{##2}%
		\fi%
	}%
}{\endgraf\medskip}% ?
\makeatother

\begin{document}
\blindtext
%
\begin{svtable}
	\centering
	\Caption{Eine Tabelle}\label{test}
	\begin{tabular}{lll}
		A & B & C\\
		1 & 2 & 3\\
	\end{tabular}
\end{svtable}
%
\blindtext% Dieser Text sollte eigenlich ohne Einzug gesetzt werden

Verweis: \ref{test}
\end{document}
Und ich hab noch zwei weitere Fragen:
2. Wie kann ich erreichen, dass der Einzug nach der Umgebung wirklich nur gemacht wird, wenn eine Leerzeile dazwischen steht. Ohne Leerzeile bzw auskommentierte Leerzeile hätte ich gerne, dass der Absatz ohne Einzug fortgesetzt wird.
3. Wozu dienen die Befehle \@setnobreak und \@setminipage? Ich habe sie aus der Vorlage übernommen, die verwendet werden muss.

Vielen Dank!
Tobi

Re: Lässt sich \caption nicht umdefinieren

Verfasst: Fr 11. Mär 2011, 19:34
von sommerfee
iTob hat geschrieben:aber ich würde gerne das \caption innerhalb der neuen Umgebung zu \captionof umdefiniert wird, was nicht zu gehen scheint und bei mir nur dazu führt, dass pdfLaTeX ewig läuft ohne Ergebnis. Definiere ich stattdessen einen eigenen Befehl \Caption (mit großem C) geht es. Woran liegt das?
\captionof besteht (im caption-Paket) aus \captionsetup{type=...} und \caption. Wenn du jetzt \caption so umdefinierst, daß es \captionof verwendest, dann dreht sich das im Kreis, eben weil \captionof \caption verwendet, was wiederum \captionof verwendet, was wiederum \caption verwendet...

Abhilfe: Vergiss das Umdefinieren von \caption und packe stattdessen \captionsetup{type=table} in die Definition deiner Umgebung.
\documentclass[ngerman]{article} 
\usepackage[latin1]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage{babel} 
\usepackage{blindtext} 

\usepackage{caption}% das KOMA-Klassen \captionof auch 
% bereitstellen weiß ich, aber im Original brauche ich 
% die normale article-Klasse 

% neue Umgebungen für nichtgleitende Tabellen und 
% Abbildungen 
\makeatletter 
\def\ifEmpty#1{\def\@temp{#1}\ifx\@temp\@empty} 
\newenvironment{svtable}{% 
   \par\small% 
   \@setnobreak% Wozu? 
   \@setminipage% Wozu? 
   \setlength{\parindent}{0pt}%
   \captionsetup{type=table}%
}{\endgraf\medskip}% ? 
\makeatother 

\begin{document} 
\blindtext 
% 
\begin{svtable} 
   \centering 
   \caption{Eine Tabelle}\label{test} 
   \begin{tabular}{lll} 
      A & B & C\\ 
      1 & 2 & 3\\ 
   \end{tabular} 
\end{svtable} 
% 
\blindtext% Dieser Text sollte eigenlich ohne Einzug gesetzt werden 

Verweis: \ref{test} 
\end{document}

Verfasst: Sa 12. Mär 2011, 14:00
von iTob
Danke, da muss man erstmal drauf kommen. Mir kam gar nicht der Gedanke mal zu schauen, wie \captionof arbeitet. :)

Bleiben noch Frage 2 und 3 offen …

Liebe Grüße
Tobi