PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was bewirkt ein @{} bei einem \newcolumntype ?



sysrq
04-04-2011, 10:17
Hallo,

ursprünglich wollte ich ein Tabellenspalten haben, die eine feste Breite und horizontal zentrierten Inhalt hat. Das mit der festen Breite kann mit einem p{2cm} schnell gelöst werden:



\documentclass{scrbook}
\begin{document}
\begin{tabular}{|p{5cm}|p{5cm}|p{5cm}|}
\hline
Das ist ein wenig Text & Noch mehr & Und noch mehr Text \\
\hline
Weiter & Das ist die nächste Zeile leider mit viel zu viel Inhalt & Und noch etwas Text \\
\hline
Das ist die letzte Zeile & Noch etwas Inhalt & Und schon fertig \\
\hline
\end{tabular}
\end{document}


Jedoch ist der Text nicht horizontal zentriert. Abhilfe schafft hier eine neue Spaltendefinition:



\documentclass{scrbook}
\usepackage{array}
\begin{document}
\newcolumntype{S}[1]{>{\centering\arraybackslash}p{#1}}
\begin{tabular}{|S{5cm}|S{5cm}|S{5cm}|}
\hline
Das ist ein wenig Text & Noch mehr & Und noch mehr Text \\
\hline
Weiter & Das ist die nächste Zeile leider mit viel zu viel Inhalt & Und noch etwas Text \\
\hline
Das ist die letzte Zeile & Noch etwas Inhalt & Und schon fertig \\
\hline
\end{tabular}
\end{document}


Alles funktioniert wunderbar. Ich weiß zwar immer noch nicht wieso das \arraybackslash notwendig ist. Aber ich bin zumindest zufrieden, dass es alles so funktioniert wie ich es mir vorgestellt habe.

Im Internet habe ich noch eine weitere Spaltendefinition gefunden, die mit @{} arbeiteitet:



\documentclass{scrbook}
\usepackage{array}
\begin{document}
\newcolumntype{S}[1]{@{}>{\centering\arraybackslash}p{#1}@{}}
\begin{tabular}{|S{5cm}|S{5cm}|S{5cm}|}
\hline
Das ist ein wenig Text & Noch mehr & Und noch mehr Text \\
\hline
Weiter & Das ist die nächste Zeile leider mit viel zu viel Inhalt & Und noch etwas Text \\
\hline
Das ist die letzte Zeile & Noch etwas Inhalt & Und schon fertig \\
\hline
\end{tabular}
\end{document}


Das einzige was mir auffällt ist, dass die Spalten auf einmal schmaler werden. Als ob ihnen das @{} Platz stehlen würde. Aber das dürfte doch eigentlich nicht sein, schließlich wird ja eine feste Breite vorgegeben. Was passiert hier also hinter den Külissen von Latex? Google hat mir da nicht helfen können.

rstuby
04-04-2011, 10:22
So weit ich weiß, nimmt es den automatischen Abstand zwischen den Spalten weg.

Xenara
04-04-2011, 10:46
@ entfernt (wie rstuby schon erwähnte) den Abstand vor/nach der Spalte. Will man also eine Tabelle nur zum Gliedern von normalem Text verwenden, nimmt man @, da dann der Text in der Tabelle auf gleicher Höhe wie der normale Text anfängt.

\arraybackslash ist notwendig, wenn umdefinierte Spalten als letzte Spalte verwendet werden und der Zeilenumbruch mit \\ erfolgt. Mit \newcolumntype definiert man irgendwie den Zeilenumbruch um, sodass sich LaTeX danach an \\ verschluckt. Abhilfe schafft \tabularnewline statt \\ fürs Ende der Tabellenzeile zu verwenden oder eben \arraybackslash anzugeben, um das wieder zurückzudefinieren.


\documentclass{scrbook}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{array}
\usepackage{blindtext}
\usepackage{tabularx}

\begin{document}

\blindtext

\minisec{Normal}
\newcolumntype{T}[1]{>{\centering\arraybackslash}p{#1}}
\noindent\begin{tabular}{|T{5cm}|T{5cm}|T{5cm}|}
\hline
l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l & l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l & l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l \\
\hline
Das ist ein wenig Text & Noch mehr & Und noch mehr Text \\
\hline
Weiter & Das ist die nächste Zeile leider mit viel zu viel Inhalt & Und noch etwas Text \\
\hline
Das ist die letzte Zeile & Noch etwas Inhalt & Und schon fertig \\
\hline
\end{tabular}

\minisec{Mit at}
\newcolumntype{S}[1]{@{}>{\centering\arraybackslash}p{#1}@{}}
\noindent\begin{tabular}{|S{5cm}|S{5cm}|S{5cm}|}
\hline
l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l & l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l & l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l \\
\hline
Das ist ein wenig Text & Noch mehr & Und noch mehr Text \\
\hline
Weiter & Das ist die nächste Zeile leider mit viel zu viel Inhalt & Und noch etwas Text \\
\hline
Das ist die letzte Zeile & Noch etwas Inhalt & Und schon fertig \\
\hline
\end{tabular}

\minisec{Anwendung mit at}
Dies hier ist ein Blindtext zum Testen von Textausgaben. Wer diesen Text liest, ist
selbst schuld. Der Text gibt lediglich den Grauwert der Schrift an.

\noindent%
\begin{tabularx}{\textwidth}{@{}XXX@{}}
l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l & l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l & l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l \\
Das ist ein wenig Text & Noch mehr & Und noch mehr Text \\
Weiter & Das ist die nächste Zeile leider mit viel zu viel Inhalt & Und noch etwas Text \\
Das ist die letzte Zeile & Noch etwas Inhalt & Und schon fertig \\
\end{tabularx}
\noindent%
Dies hier ist ein Blindtext zum Testen von Textausgaben. Wer diesen Text liest, ist
selbst schuld. Der Text gibt lediglich den Grauwert der Schrift an.

\minisec{Ohne arraybackslash, dann aber entweder nie in der letzten Spalte oder Zeilenumbruch mit tabularnewline statt backslash backslash}
\newcolumntype{U}[1]{>{\centering}p{#1}}
\noindent\begin{tabular}{|U{5cm}|U{5cm}|U{5cm}|}
\hline
l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l & l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l & l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l \tabularnewline
\hline
Das ist ein wenig Text & Noch mehr & Und noch mehr Text \tabularnewline
\hline
Weiter & Das ist die nächste Zeile leider mit viel zu viel Inhalt & Und noch etwas Text \tabularnewline
\hline
Das ist die letzte Zeile & Noch etwas Inhalt & Und schon fertig \tabularnewline
\hline
\end{tabular}

\end{document}

sysrq
04-04-2011, 11:14
@ entfernt (wie rstuby schon erwähnte) den Abstand vor/nach der Spalte. Will man also eine Tabelle nur zum Gliedern von normalem Text verwenden, nimmt man @, da dann der Text in der Tabelle auf gleicher Höhe wie der normale Text anfängt.


Von welchem Abstand redet ihr genau? Meint ihr etwa \tabcolsep?

rstuby
04-04-2011, 11:20
Wenn du \tabcolsep auf Null setzt, hast du den Abstand NIRGENDS mehr. Mit @{} wird er nur an den entsprechenden Stellen weggelassen.

Xenara
04-04-2011, 11:24
Ja, tabcolsep ist gemeint.

u_fischer
04-04-2011, 12:04
Um ganz genau zu sein: @ ersetzt den Abstand durch sein Argument. Wenn Linien im Spiel sind, braucht man ggfs. mehrere @{} zwischen den Spalten:


\documentclass[a4paper]{article}
\begin{document}
\begin{tabular}{ll@{}l@{BLUB}l@{\hspace{3cm}}l}
erste&zweite&dritte&vierte&fünfte
\end{tabular}

\begin{tabular}{|l|l|@{}|l|@{BLUB}|l|@{\hspace{3cm }}|l}
erste&zweite&dritte&vierte&fünfte
\end{tabular}

\begin{tabular}{l@{}|@{}l}
erste&zweite
\end{tabular}
\end{document}