Längen(neu)berechnung in \newcolumntype

Tabellen und Grafiken erstellen und anordnen


die_nase
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 50
Registriert: So 3. Mai 2015, 21:05

Längen(neu)berechnung in \newcolumntype

Beitrag von die_nase »

Hallo zusammen,

ich möchte gerne einen neuen Spaltentyp definieren, bei dem die vorher definierte Länge mit einem bestimmten Wert (nämlich dem, der als Argument übergeben wird) multipliziert wird. Also anstatt bspl. p{3cm} an longtable zu übergeben, möchte ich P{0.12} übergeben, wobei die 0.12 nur als Faktor für eine andere (zuvor definierte) Länge dienen sollen.

Vielleicht wird es an dem MB deutlicher.
\documentclass[11pt, oneside]{article}   
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}	
\usepackage{geometry}                		
   \geometry{a4paper}                    	
\usepackage[parfill]{parskip}    		
\usepackage{graphicx}				
\usepackage{amssymb}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{array}
\usepackage{calc}

\newlength{\Spaltenteiler} 
\newlength{\Hilfsleng}

\setlength{\Spaltenteiler}{\textwidth-2\tabcolsep} %Längendefinition funktioniert

\newcolumntype{P}[1]{ 
\setlength{\Hilfsleng}{#1\Spaltenteiler} %Hier klappt es nicht
p{\Hilfsleng}
}


\begin{document}

\begin{longtable}{P{0.125}P{0.1}P{0.3}P{0.125}} %Spaltendefinition
\caption{Tabelle}\\
\toprule 
\addlinespace 
Tab1 & Tab2 & Tab3 & Tab4\\
\addlinespace
\midrule
\endfirsthead 
\toprule 
\midrule 
\endhead
Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text\\
\end{longtable}

\end{document}  

Das liefert mir den Fehler:
./Ohne-Titel.tex:30: Package array Error:  Illegal pream-token (\setlength): `c
' used.

See the array package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.30 ...n{longtable}{P{0.125}P{0.1}P{0.3}P{0.125}}
                                                  
? 
Wenn ich jedoch den Faktor direkt mit der definierten Länge an p{} übergebe, dann funktioniert es einwandfrei:
\documentclass[11pt, oneside]{article}   
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}	
\usepackage{geometry}                		
   \geometry{a4paper}                    	
\usepackage[parfill]{parskip}    		
\usepackage{graphicx}				
\usepackage{amssymb}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{array}
\usepackage{calc}


\newlength{\Spaltenteiler} 
\newlength{\Hilfsleng}

\setlength{\Spaltenteiler}{\textwidth-2\tabcolsep} %Längendefinition funktioniert


\begin{document}

\begin{longtable}{p{0.125\Spaltenteiler}p{0.1\Spaltenteiler}p{0.3\Spaltenteiler}p{0.125\Spaltenteiler}} %Spaltendefinition
\caption{Tabelle}\\
\toprule 
\addlinespace 
Tab1 & Tab2 & Tab3 & Tab4\\
\addlinespace
\midrule
\endfirsthead 
\toprule 
\midrule 
\endhead
Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text\\ \addlinespace
Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text\\ \addlinespace
\end{longtable}

\end{document}  
Hat jemand eine Lösung, sodass ich einfach P{0.12} schreiben kann und nicht, so wie in dem zweiten Beispiel, p{0.12\Spaltenteiler}?

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4300
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Wozu die Hilfslänge? p{#1\Spaltenteiler} funktioniert doch.

die_nase
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 50
Registriert: So 3. Mai 2015, 21:05

Beitrag von die_nase »

u_fischer hat geschrieben:Wozu die Hilfslänge? p{#1\Spaltenteiler} funktioniert doch.
Ja, das funktioniert. Ich dachte nur, dass es übersichtlicher sei, wenn man nicht in jedem p{} noch eine zusätzliche Länge stehen hat. Ich bin auf das Problem gestoßen und habe mich gewundert, dass es anscheinen nicht möglich ist, noch zusätzliche Aktionen in der \newcolumntyp-Umgebung auszuführen...und war schlussendlich nur an einer Lösung des Problems interessiert

(@Ulrike: Du hast natürlich vollkommen Recht, dass es so klappt. Per Copy-Paste geht es ja auch schnell.)

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Ganz ohne Hilfslängen geht doch
\newcolumntype{P}[1]{>{\raggedright\arraybackslash}p{\dimexpr#1\textwidth-2\tabcolsep\relax} 
}
und dann
\begin{longtable}{P{0.125}P{0.1}P{0.3}P{0.125}}
Gruß
Elke

die_nase
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 50
Registriert: So 3. Mai 2015, 21:05

Beitrag von die_nase »

Vielen, vielen Dank. Genau das wars. Das \dimexpr kannte ich nicht. :)

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4300
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

esdd hat geschrieben:Ganz ohne Hilfslängen geht doch
\newcolumntype{P}[1]{>{\raggedright\arraybackslash}p{\dimexpr#1\textwidth-2\tabcolsep\relax} 
}
\dimexpr#1\textwidth-2\tabcolsep\relax ist aber nicht das Gleiche wie #1\Spaltenteiler (aber wahrscheinlich das, was wirklich rauskommen sollte).

die_nase hat geschrieben:Ja, das funktioniert. Ich dachte nur, dass es übersichtlicher sei, wenn man nicht in jedem p{} noch eine zusätzliche Länge stehen hat.
Das habe ich ja auch gar nicht gemeint. Du solltest p{#1\Spaltentrenner} in deiner P-column-Definition verwenden.

die_nase
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 50
Registriert: So 3. Mai 2015, 21:05

Beitrag von die_nase »

Inwiefern ist das nicht das Gleiche? (Ich kenne mich in dem Bereich nicht so gut aus.)

Achso, das meinst du. Das lieferte mir leider die Fehlermeldung, die ich im Post #1 aufgeschrieben habe (oder reden wir gerade aneinander vorbei?).

Meine Vermutung war, dass Latex nicht weiß, was ich als Argument übergebe (also #1 kann eine Zahl, ein Wort, ein Buchstabe, eine Länge..sein). Und deshalb die Fehlermeldung ausspuckt.

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4300
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

die_nase hat geschrieben:Inwiefern ist das nicht das Gleiche? (Ich kenne mich in dem Bereich nicht so gut aus.)
a*b+c ist nicht das Gleiche wie a*(b+c)

Achso, das meinst du. Das lieferte mir leider die Fehlermeldung, die ich im Post #1 aufgeschrieben habe (oder reden wir gerade aneinander vorbei?).
\newcolumntype{P}[1]{p{#1\Spaltenteiler}}

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Mir war bewusst, dass das nicht das gleiche ist. Aber ich bin einfach davon ausgegangen, dass die Tabelle die Breite \textwidth haben soll, wenn sich die Faktoren der einzelnen Spalten zu 1 aufsummieren. Da \tabcolsep links und rechts von jeder Spalte eingefügt wird, muss es deshalb 2x je Spalte abgezogen werden.

Hier nochmal als vollständiges Beispiel, wobei ich solch schmale Spalten dann nicht mehr im Blocksatz ausgeben würde und deshalb linksbündigen Flattersatz verwende. Und auch die Spaltenbreiten habe ich etwas verändert.
\documentclass[11pt]{article}   
\usepackage[T1]{fontenc} 
\usepackage[ngerman]{babel}   
\usepackage{longtable} 
\usepackage{booktabs} 
\usepackage{array} 

\newcolumntype{P}[1]{%
  >{\raggedright\arraybackslash}% linksbündiger Flattersatz
  p{\dimexpr#1\textwidth-2\tabcolsep\relax}%
} 

\begin{document} 
\begin{longtable}{P{0.15}P{0.2}P{0.3}P{0.35}} %Spaltendefinition 
\caption{Tabelle}\\
\toprule 
\addlinespace 
 Tab1 & Tab2 & Tab3 & Tab4\\ 
\addlinespace 
\midrule 
\endfirsthead 
\toprule 
\midrule 
\endhead 
 Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text & Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text, Das ist ein langer Text\\ 
\end{longtable} 
\end{document}
Gruß
Elke

die_nase
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 50
Registriert: So 3. Mai 2015, 21:05

Beitrag von die_nase »

Vielen Dank für eure Mühen!

Antworten