Seite 1 von 1

Längen(neu)berechnung in \newcolumntype

Verfasst: So 17. Mai 2015, 13:04
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}?

Verfasst: So 17. Mai 2015, 13:14
von u_fischer
Wozu die Hilfslänge? p{#1\Spaltenteiler} funktioniert doch.

Verfasst: So 17. Mai 2015, 13:20
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.)

Verfasst: So 17. Mai 2015, 13:42
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

Verfasst: So 17. Mai 2015, 13:47
von die_nase
Vielen, vielen Dank. Genau das wars. Das \dimexpr kannte ich nicht. :)

Verfasst: So 17. Mai 2015, 14:13
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.

Verfasst: So 17. Mai 2015, 14:17
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.

Verfasst: So 17. Mai 2015, 14:48
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}}

Verfasst: So 17. Mai 2015, 15:08
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

Verfasst: So 17. Mai 2015, 16:11
von die_nase
Vielen Dank für eure Mühen!