Eigene Tabellenumgebung

Tabellen und Grafiken erstellen und anordnen


ThoRie
Forum-Century
Forum-Century
Beiträge: 127
Registriert: Fr 12. Mai 2017, 11:57

Eigene Tabellenumgebung

Beitrag von ThoRie »

Hallo, ich habe ein Problem mit folgendem Code:

Code: Alles auswählen

\documentclass{scrbook}

\usepackage{ltablex}
\usepackage{setspace}
\newenvironment{tabelle}[2]{%
	\begin{spacing}{.7}%
		\renewcommand{\arraystretch}{1.5}%
		\begin{tabularx}{#1}{#2}%
		}%
	{%
\end{tabularx}%
\end{spacing}%
}
\usepackage{blindtext}
\begin{document}

\begin{tabularx}{\linewidth}{|X|X|}
\hline
\blindtext & \blindtext\\\hline
\end{tabularx}



\end{document}

Da spuckt er mir eine Fehlermeldung aus, die ich leider null verstehe.
Ich möchte eben nicht jedes Mal folgendes eingeben müssen:

Code: Alles auswählen

\begin{spacing}{.7}
		\renewcommand{\arraystretch}{1.5}
\begin{tabularx}{\linewidth}{|X|X|}
\hline
\blindtext & \blindtext\\\hline
\end{tabularx}
\end{spacing}


Präambel ist im zweiten Code bis auf die Umgebungsdefinition die selbe.
Kann mir jemand sagen, was der Fehler ist und wie man den behebt.

Falls ihr so tief drin stecken solltet, könnt ihr mir auch sehr gerne erklären (das aber dann bitte per PN, weil hier wäre es OT) wie dieser Fehler entsteht. Vielleicht habe ich mit dem irgendwann noch einmal zu tun und kann dann auch selbst erstmal herumprobieren :D


MoeWe
Forum-Guru
Forum-Guru
Beiträge: 283
Registriert: Fr 30. Aug 2019, 15:35
Kontaktdaten:

Re: Eigene Tabellenumgebung

Beitrag von MoeWe »

Die Tabellen-Umgebung tabularx aus dem tabularx-Paket ist etwas speziell. Man kann \begin{tabularx}{<width>}{<col spec>}...\end{tabularx} nicht im Start- und Endcode von \newenvironment benutzen, da die Implementierung von tabularx nach dem String \end{tabularx} sucht, um zum Ende zu kommen. Der Workaround besteht darin, die Makro-Version \tabularx{<width>}{<col spec>}...\endtabularx zu verwenden. Siehe https://tex.stackexchange.com/q/42325/35864.

Bei ltablex scheint das nicht zu funktionieren. Da geht es dann aber mit einem anderen Trick: https://tex.stackexchange.com/q/208850/35864.

Code: Alles auswählen

\documentclass{scrbook}

\usepackage{ltablex}
\usepackage{setspace}
\usepackage{environ}

\NewEnviron{tabelle}[2]{%
  \begin{spacing}{.7}%
  \renewcommand{\arraystretch}{1.5}%
  \begin{tabularx}{#1}{#2}%
  \BODY
  \end{tabularx}%
  \end{spacing}}

\usepackage{blindtext}

\begin{document}
\begin{tabelle}{\linewidth}{|X|X|}
\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\end{tabelle}

\clearpage
  \begin{spacing}{.7}%
  \renewcommand{\arraystretch}{1.5}%
  \begin{tabularx}{\linewidth}{|X|X|}
  \hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \end{tabularx}%
  \end{spacing}
\end{document}

Eine andere Möglichkeit ist in https://tex.stackexchange.com/q/196993/35864 gezeigt. Die schien aber bei mir nicht zu funktionieren, wenn die spacing-Umgebung noch involviert war. In diesem Fall scheint es mir aber möglich, auf spacing als Umgebung zu verzichten und stattdessen einfach \setspace zu nehmen (die Zusätzliche Mühe, die spacing sich macht, den vorherigen Absatz zu beenden und am Übergang zum folgenden Absatz die Abstände richtig zu setzen, lohnt sich bei einer Tabelle wohl eher nicht). Dann ginge auch

Code: Alles auswählen

\documentclass{scrbook}

\usepackage{setspace}

\usepackage{ltablex}
\usepackage{etoolbox}
\makeatletter
% get rid of \par (there are two empty lines in the definition by ltablex)
\patchcmd{\TX@endtabularx}{\par}{}{}{}
\patchcmd{\TX@endtabularx}{\par}{}{}{}

\patchcmd{\TX@endtabularx}
  {\end{tabularx}}
  {\endtabularx\endgroup}
  {}{}
\makeatother

\newenvironment{tabelle}[2]
  {\setstretch{.7}%
   \renewcommand{\arraystretch}{1.5}%
   \tabularx{#1}{#2}}
  {\endtabularx}

\usepackage{blindtext}

\begin{document}
\begin{tabelle}{\linewidth}{|X|X|}
\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\end{tabelle}

\clearpage
  \begin{spacing}{.7}%
  \renewcommand{\arraystretch}{1.5}%
  \begin{tabularx}{\linewidth}{|X|X|}
  \hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \blindtext & \blindtext\\\hline
  \end{tabularx}%
  \end{spacing}
\end{document}

ThoRie
Forum-Century
Forum-Century
Beiträge: 127
Registriert: Fr 12. Mai 2017, 11:57

Re: Eigene Tabellenumgebung

Beitrag von ThoRie »

Okay, vielen, vielen Dank für die Hilfe. Das ist wirklich perfekt :D


Bartman
Forum-Meister
Forum-Meister
Beiträge: 2180
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Re: Eigene Tabellenumgebung

Beitrag von Bartman »

Ein Wechsel von ltablex zu xltabular bietet eine weitere Möglichkeit, die ohne etoolbox oder xpatch auskommt:

Code: Alles auswählen

\documentclass{scrbook}

\usepackage{xltabular}
\usepackage{setspace}
\usepackage{blindtext}
\usepackage{showframe}

\newenvironment{tabelle}[2]
  {\setstretch{.7}%
   \renewcommand{\arraystretch}{1.5}%
   \xltabular{#1}{#2}}
  {\endxltabular}

\begin{document}
\begin{tabelle}{\linewidth}{|X|X|}
\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\blindtext & \blindtext\\\hline
\end{tabelle}
\end{document}

Antworten