Wie man im Beispiel sieht, ragen die große Zahlen über die definierte p-Spaltenbreite hinaus. Wie erreicht man, daß die Länge des größten Elements in der Spalte gemessen wird und an die Spaltenbreite in der Tabellenpräamble zurückgegeben wird, sodaß im wiederholten LaTeX-Durchlauf die Breite der zweiten Spalte angepasst wird? Die p-Definition soll beibehalten werden.

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{longtable}
\begin{document}
\begin{longtable}{p{2cm}p{2cm}p{2cm}}
\textbf{Erste}&\textbf{Zweite}&\textbf{Dritte}\\ \endhead
A&B&C\\
100&200&300\\
100&200&300\\
100&2000000000000000000&300\\
100&2000000000000000000&300\\
\end{longtable}
\end{document}

gefragt 03 Nov '14, 23:50

ctansearch's gravatar image

ctansearch
(ausgesetzt)
Akzeptiert-Rate: 18%

zurückgesetzt 11 Nov '14, 13:41


Das ganze funktioniert sehr einfach, wenn man nicht darauf besteht, die p-Spalten beizubehalten:

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage[german]{babel}% Geändert, da der Fragesteller offenbar alte Rechtschreibung bevorzugt.
\usepackage[utf8]{inputenc}
\usepackage{ltablex}% Geändert, da die Lösung so einfacher ist.
\begin{document}
\begin{tabularx}{\textwidth}{XXX}% Geändert, da die Lösung so einfacher ist.
\textbf{Erste}&\textbf{Zweite}&\textbf{Dritte}\\ \endhead
A&B&C\\
100&200&300\\
100&200&300\\
100&2000000000000000000&300\\
100&2000000000000000000&300\\
\end{tabularx}% Geändert.
\end{document}

Auch eine Mindestbreite der Spalten ist dabei erreichbar, beispielsweise mit:

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage[german]{babel}% Geändert, da der Fragesteller offenbar alte Rechtschreibung bevorzugt.
\usepackage[utf8]{inputenc}
\usepackage{ltablex}% Geändert, da die Lösung so einfacher ist.
\begin{document}
\begin{tabularx}{\textwidth}{XXX}% Geändert, da die Lösung so einfacher ist.
\makebox[2cm][l]{\textbf{Erste}}&\makebox[2cm][l]{\textbf{Zweite}}&\makebox[2cm][l]{\textbf{Dritte}}\\% Geändert für die Mindestbreite
\endhead
A&B&C\\
100&200&300\\
100&200&300\\
100&2000000000000000000&300\\
100&2000000000000000000&300\\
\end{tabularx}% Geändert.
\end{document}

oder:

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage[german]{babel}% Geändert, da der Fragesteller offenbar alte Rechtschreibung bevorzugt.
\usepackage[utf8]{inputenc}
\usepackage{ltablex}% Geändert, da die Lösung so einfacher ist.
\begin{document}
\begin{tabularx}{\textwidth}{XXX}% Geändert, da die Lösung so einfacher ist.
\multicolumn1{p{2cm}}{\textbf{Erste}} &  % Geändert für die Mindestbreite
\multicolumn1{p{2cm}}{\textbf{Zweite}} & % -"-
\multicolumn1{p{2cm}}{\textbf{Dritte}} \\ % -"-
\endhead
A&B&C\\
100&200&300\\
100&200&300\\
100&2000000000000000000&300\\
100&2000000000000000000&300\\
\end{tabularx}% Geändert.
\end{document}

Ich gebe natürlich zu, dass das nicht die Frage beantwortet, da ich eben die p-Spalten entgegen der Vorgabe durch X-Spalten und longtable durch das davon abgeleitete ltablex ersetzt habe.

Will man das ganze unbedingt mit p-Spalten machen, dann muss man sich eben in ltablex anschauen, wie das dort funktioniert, um es für longtable und p-Spalten nachzubauen. Oder man muss den Inhalt, der die Breite bestimmten soll, beispielsweise mit \settowidth oder \widthof (letzteres benötigt calc) ausmessen und über die aux-Datei für den nächsten Lauf sichern. Man möge mir nachsehen, dass ich statt einer solch aufwändigen, dogmatischen, lieber eine einfache, pragmatische Lösung gezeigt habe.

Auf der anderen Seite ist es vielleicht doch eine Antwort, denn genau genommen sind X-Spalten ja ebenfalls p-Spalten, die aber um die zusätzliche Funktion der automatischen Breitenanpassung erweitert wurden. Bei ltablex ist dabei die Breite im Gegensatz zu tabularx oder ltxtable auch von der natürlichen Breite des Inhalts abhängig. Man kann daher in solchen Spalten insbesondere auch einen automatischen oder manuellen Umbruch haben. Hier einmal manuell:

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage[german]{babel}% Geändert, da der Fragesteller offenbar alte Rechtschreibung bevorzugt.
\usepackage[utf8]{inputenc}
\usepackage{ragged2e,ltablex}% Geändert, da die Lösung so einfacher ist.
\begin{document}
\begin{tabularx}{\textwidth}{X>{\RaggedRight}XX}% Geändert, da die Lösung so einfacher ist.
\multicolumn1{p{2cm}}{\textbf{Erste}} &  % Geändert für die Mindestbreite
\multicolumn1{p{2cm}}{\textbf{Zweite}} & % -"-
\multicolumn1{p{2cm}}{\textbf{Dritte}} \\ % -"-
\endhead
A&B&C\\
100&200&300\\
100&200&300\\
100&2000000000000000000\\42&300\\
100&2000000000000000000&300\\
\end{tabularx}% Geändert.
\end{document}

Hier automatisch:

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage[german]{babel}% Geändert, da der Fragesteller offenbar alte Rechtschreibung bevorzugt.
\usepackage[utf8]{inputenc}
\usepackage{ltablex}% Geändert, da die Lösung so einfacher ist.
\usepackage{mwe}% Eingefügt für den Fülltext des automatischen Umbruchs.
\begin{document}
\begin{tabularx}{\textwidth}{XXX}% Geändert, da die Lösung so einfacher ist.
\multicolumn1{p{2cm}}{\textbf{Erste}} &  % Geändert für die Mindestbreite
\multicolumn1{p{2cm}}{\textbf{Zweite}} & % -"-
\multicolumn1{p{2cm}}{\textbf{Dritte}} \\ % -"-
\endhead
A&B&C\\
100&200&300\\
100&200&300\\
100&2000000000000000000&300\\
100&\blindtext&300\\% Geändert zur Demonstration des automatischen Umbruchs
\end{tabularx}% Geändert.
\end{document}

Man kann das auch noch mit dem Paket environ kombiniert. Dann kann man nämlich einen neuen Spaltentyp definieren, dessen Argument die Mindestbreite der Spalte ist. Um der Anforderung, dass eine p-Spalte verwendet werden soll, möglichst nahe zu kommen, nenne ich diesen neuen Spaltentyp P:

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage[german]{babel}% Geändert, da der Fragesteller offenbar alte Rechtschreibung bevorzugt.
\usepackage[utf8]{inputenc}
\usepackage{ltablex}
\usepackage{environ}
\makeatletter
\NewEnviron{mincolwidth}[1]{%
  \setbox\@tempboxa\hbox{\BODY}%
  \ifdim\wd\@tempboxa<#1
    \hbox to #1{\BODY\hfil}%
  \else
    \BODY
  \fi
}
\makeatother
\newcolumntype{P}[1]{>{\begin{mincolwidth}{#1}}X<{\end{mincolwidth}}}
\begin{document}
\begin{tabularx}{\textwidth}{p{2cm}P{2cm}p{2cm}}
\textbf{Erste}&\textbf{Zweite}&\textbf{Dritte}\\ \endhead
A&B&C\\
100&200&300\\
100&200&300\\
100&200000000000000&300\\
100&200000000000000&300\\
\end{tabularx}
\end{document}

Achtung: Solche Spalten mit environ-Umgebung kann man nicht in der ersten oder der letzten Spalte verwenden. Für das Beispiel und die in der Frage genannte zweite Spalte, funktioniert es jedoch. Allerdings geht das auf Kosten der manuellen Umbrüche. Wollte man diese zusätzlich erlauben, müsste man noch einmal etwas mehr Aufwand investieren. Automatische Zeilenumbrüche funktionieren jedoch:

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage[german]{babel}% Geändert, da der Fragesteller offenbar alte Rechtschreibung bevorzugt.
\usepackage[utf8]{inputenc}
\usepackage{ltablex}
\usepackage{environ}
\makeatletter
\NewEnviron{mincolwidth}[1]{%
  \setbox\@tempboxa\hbox{\BODY}%
  \ifdim\wd\@tempboxa<#1
    \hbox to #1{\BODY\hfil}%
  \else
    \BODY
  \fi
}
\makeatother
\newcolumntype{P}[1]{>{\begin{mincolwidth}{#1}}X<{\end{mincolwidth}}}
\usepackage{mwe}
\begin{document}
\begin{tabularx}{\textwidth}{p{2cm}P{2cm}p{2cm}}
\textbf{Erste}&\textbf{Zweite}&\textbf{Dritte}\\ \endhead
A&B&C\\
100&200&300\\
100&200&300\\
100&\blindtext&300\\
100&200000000000000&300\\
\end{tabularx}
\end{document}
Permanenter link

beantwortet 04 Nov '14, 08:04

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 07 Nov '14, 09:39

Mir ist jetzt nicht klar, warum Du keine l-Spalte verwenden möchtest. Deshalb nehme ich an, dass sich die zweite Spalte wie eine p{2cm} Spalte verhalten soll, wenn alle Elemente in der Spalte schmaler als 2cm sind und wie eine l Spalte, wenn mindestens ein Element breiter als 2cm ist.

Wie @Ulrike als Kommentar geschrieben hat, stellt longtable den Befehl \kill zur Verfügung, mit dem man diese Mindestspaltenbreite einfach sicherstellen kann:

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage{longtable}
\usepackage{eqparbox}
\begin{document}
\begin{longtable}{p{2cm}lp{2cm}}
  &\hspace*{2cm}\kill
  \textbf{Erste}&\textbf{Zweite}&\textbf{Dritte}\\ \endhead
  A&B&C\\
  100&200&300\\
  100&200&300
\end{longtable}

\begin{longtable}{p{2cm}lp{2cm}}
  &\hspace*{2cm}\kill
  \textbf{Erste}&\textbf{Zweite}&\textbf{Dritte}\\ \endhead
  A&B&C\\
  100&200&300\\
  100&200&300\\
  100&2000000000000000000&300\\
  100&2000000000000000000&300
\end{longtable}
\end{document}

Ergebnis:

alt text


Wenn in der Spalte außerdem ein manueller Zeilenumbruch möglich sein soll, dann wäre die Nutzung des Pakets eqparbox eine Möglichkeit das zu realisieren. Für die richtige Spaltenbreite werden zwei bis drei Durchläufe benötigt, man erhält aber entsprechende Warnungen von eqparbox und longtable.

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage{longtable}
\usepackage{eqparbox}
\begin{document}

\eqsetminwidth{ltsp1}{2cm}% Mindestbreite 2cm
\begin{longtable}{p{2cm}>{\begin{eqminipage}[t]{ltsp1}}l<{\strut\end{eqminipage}}p{2cm}}
  \textbf{Erste}&\textbf{Zweite}&\textbf{Dritte}\\ \endhead
  A&B&C\\
  100&200\newline 250&300\\
  100&200&300
\end{longtable}

\eqsetminwidth{ltsp2}{2cm}% Mindestbreite 2cm
\begin{longtable}{p{2cm}>{\begin{eqminipage}[t]{ltsp2}}l<{\strut\end{eqminipage}}p{2cm}}
  \textbf{Erste}&\textbf{Zweite}&\textbf{Dritte}\\ \endhead
  A&B&C\\
  100&200&300\\
  100&200&300\\
  100&2000000000000000000\newline 10&300\\
  100&2000000000000000000&300
\end{longtable}
\end{document}

alt text

Darüber hinaus stellt das Paket auch noch den Befehlt \eqsetmaxwidth bereit, mit dem man einen Maximalwert für die Spaltenbreite vorgeben kann.

Permanenter link

beantwortet 05 Nov '14, 01:05

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 06 Nov '14, 00:34

Ich lösche den langen Kommentarstrang.

(11 Nov '14, 13:39) ctansearch

@ctansearch auch wenn ich nicht mitkommentiert habe, finde ich es nicht gut, eine offene Diskussion einfach ohne Vorankündigung zu löschen. Im Sinne der Höflichkeit sollte man meines Erachtens doch seinen Mitdiskutierern die Gelegenheit zur Reaktion bieten, bevor man ihre Beiträge einfach löscht, findest Du nicht?

(11 Nov '14, 13:53) cgnieder

@ctansearch Ich hätte bei meinen eigenen Kommentaren gern selbst entschieden, ob und welche gelöscht werden. Ich bin mir auch sicher, dass ich mindestens einen der Kommentare gern behalten hätte. Leider hast Du mir keine Zeit gelassen, Dir das mitzuteilen.

Bitte kündige Löschaktionen vorher an und lösche frühestens nach 24 Stunden.

(11 Nov '14, 14:06) esdd

@ctansearch: Ich finde es nicht nur unhöflich sondern schlicht unverschämt meine Kommentare einfach in die Tonne zu klopfen. Mach das nie wieder, wenn du von mir je wieder eine Reaktion auf eine deiner Fragen haben willst.

(11 Nov '14, 14:20) Ulrike Fischer

Sorry, ich dachte, Kommentare wären wiederherstellbar.

(11 Nov '14, 14:32) ctansearch
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×39
×11

gestellte Frage: 03 Nov '14, 23:50

Frage wurde gesehen: 16,593 Mal

zuletzt geändert: 11 Nov '14, 14:32