PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : datatool in tabular ergibt Misplaced \noalign



Dirk2718
09-11-2012, 14:04
Hallo Zusammen,

ich lade eine Tabelle über datatool und möchte den Inhalt darstellen. Das klappt aber nicht ohne eine nicht gewollte Leerzeile im Quellcode (siehe auskommentierte Zeile über \bottomrule):

\documentclass{scrreprt}
% Kodierungspakete
\usepackage[T1]{fontenc}
\usepackage{selinput}
\SelectInputMappings{
adieresis={ä},
germandbls={ß},
Euro={€},
}
\usepackage{booktabs, datatool}

\begin{document}

\DTLnewdb{dbTest}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{32.1}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{98.7}

\begin{table}[ht]
\centering
\begin{tabular}[t]{lc}
\toprule
Über & schrift\\
\midrule
\DTLforeach{dbTest}{%
\Daten=Daten}{%
\theDTLrowi & \Daten\\%
}%
%\\
\bottomrule
\end{tabular}
\caption{Test}
\label{tabTest}
\end{table}

\end{document}


Die Leerzeile ist natürlich ungewollt. Wie bekomme ich das hin?

Vielen Dank und Grüße
Dirk

esdd
09-11-2012, 22:16
Hallo,

hier ist ein Vorschlag, wie sich das Problem vermeiden lässt:

\documentclass{scrreprt}
% Kodierungspakete
\usepackage[T1]{fontenc}
\usepackage{selinput}
\SelectInputMappings{
adieresis={ä},
germandbls={ß},
Euro={€},
}
\usepackage{booktabs, datatool}

\begin{document}

\DTLnewdb{dbTest}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{32.1}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{98.7}

\begin{table}[ht]
\centering
\begin{tabular}[t]{lc}
\toprule
Über & schrift\\
\midrule
\DTLforeach{dbTest}{%
\Daten=Daten}{%
\DTLiffirstrow{}{\\}\theDTLrowi & \Daten%
}%
\\
\bottomrule
\end{tabular}
\caption{Test}
\label{tabTest}
\end{table}

\end{document}
Gruß
Elke

Dirk2718
10-11-2012, 11:41
Danke! So sollte es laufen.

Da war ich doch glatt eine Seite über der Beschreibung von iffirst und finde das nicht. Asche über mein Haupt.

Das ist aber so auch gewollt und kein Bug?
Für \DTLdisplaydb wird \bottomrule auch mit führendem \\ in \dtldisplayendtab definiert. Hier gibt es keine zusätzliche Leerzeile.

Viele Grüße
Dirk

Dirk2718
13-11-2012, 12:18
Hallo Zusammen,

ich habe das gerade bei mir eingebaut und ein weiteres Problem tat auf. Bei manchen Spalten nutze ich den S-Spaltentyp aus dem siunitx Paket. Hier klappt allerdings das \DTLiffirstrow nicht, es gibt einen Fehler. Damit bin ich wieder beim eigentlichen Problem, dass ich unten oder oben eine leer Zeile einbauen muss, was ich natürlich auch nicht möchte.

Hier das Minimalbeispiel:

\documentclass{scrreprt}
% Kodierungspakete
\usepackage[T1]{fontenc}
\usepackage{selinput}
\SelectInputMappings{
adieresis={ä},
germandbls={ß},
Euro={€},
}
\usepackage{booktabs, datatool, siunitx}

\begin{document}

\DTLnewdb{dbTest}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{32.1}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{5.9}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{9.81}

\begin{table}[ht]
\centering
\begin{tabular}[t]{lS}
\toprule
Über & schrift\\
\midrule
\DTLforeach*{dbTest}{%
\Daten=Daten}{%
\DTLiffirstrow{}{\\}%
\theDTLrowi & \Daten%\\%
}%
\\%
\bottomrule
\end{tabular}
\caption{Test}
\label{tabTest}
\end{table}

\end{document}


Viele Grüße
Dirk

esdd
13-11-2012, 12:49
Hallo,

vermutlich muss am Ende der S Spalten immer ein & oder ein \\ stehen. Du könntest eine zusätzliche leere Spalte am Ende einfügen oder am Ende der Tabelle einen negativen Abstand einfügen und damit die \bottomrule wieder nach oben schieben:

\documentclass{scrreprt}
% Kodierungspakete
\usepackage[T1]{fontenc}
\usepackage{selinput}
\SelectInputMappings{
adieresis={ä},
germandbls={ß},
Euro={€},
}
\usepackage{booktabs, datatool, siunitx}

\begin{document}

\DTLnewdb{dbTest}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{32.1}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{5.9}
\DTLnewrow{dbTest}
\DTLnewdbentry{dbTest}{Daten}{9.81}

\begin{tabular}[t]{lS@{}l}
\toprule
Über & {schrift}\\
\midrule
\DTLforeach*{dbTest}{%
\Daten=Daten}{%
\DTLiffirstrow{}{\\}%
\theDTLrowi & \Daten&%
}%
\\
\bottomrule
\end{tabular}
\hspace{3em}
\begin{tabular}[t]{lS}
\toprule
Über & {schrift}\\
\midrule
\DTLforeach*{dbTest}{%
\Daten=Daten}{%
\theDTLrowi & \Daten\\%
}%
\\[\dimexpr-\ht\strutbox-\dp\strutbox\relax]%
\bottomrule
\end{tabular}

\end{document}
Gruß
Elke

Dirk2718
13-11-2012, 13:01
Hallo Elke,

ok, so kann man es lösen. Danke!

Allerdings finde ich, dass der grad der Workarounds fast schon auf einen Bug schließen lässt. Oder interpretiere ich das falsch? Falls nicht, würde ich das dem Entwickler mit einem Link auf das Forum hier zurückmelden.

Was meinst du?

Viele Grüße
Dirk

esdd
13-11-2012, 13:25
Hallo,

ich hab jetzt doch mal in die Doku von siunitx geschaut. Da gibt es für solche Fälle das Makro \tablenum als Alternative zum Spaltentyp S:

\begin{tabular}[t]{lc}
\toprule
Über & schrift\\
\midrule
\DTLforeach*{dbTest}{%
\Daten=Daten}{%
\DTLiffirstrow{}{\\}%
\theDTLrowi & \tablenum{\Daten}%
}%
\\
\bottomrule
\end{tabular}
Gruß
Elke

Dirk2718
13-11-2012, 14:14
Prima!

Du kannst offensichtlich besser Dokus lesen als ich. Das Kapitel über datatool in siunitx habe ich gefunden, nur das \tablenum-Macro nicht.

Vielen Dank!

Grüße
Dirk

esdd
13-11-2012, 14:25
Den Abschnitt über datatool hab ich dafür gar nicht gesehen. Damit gibt es noch eine weitere Möglichkeit:

\begin{table}
\sisetup{parse-numbers = false}
\begin{tabular}[t]{lS}
\toprule
Über & {schrift}\\
\midrule
\DTLforeach*{dbTest}{%
\Daten=Daten}{%
\DTLiffirstrow{}{\\}%
\theDTLrowi & \Daten%
}%
\\
\bottomrule
\end{tabular}
\end{table}
Gruß
Elke

Dirk2718
13-11-2012, 14:49
Wobei ich das ausprobiert habe und mir überhaupt nicht gefällt. Das siunitx Paket macht aus unterschiedlichen Zahlen (9.81 bzw. 9,81) je nach Sprache das richtige. Dazu erkennt es in wissenschaftlichen Zahlen (2,4e-5) die Zehnerpotenz und stellt die Zahl schön dar (2,4*10^-5). Dazu kommt noch die Ausrichtung am Komma. Das stellt man mit der Option "parse-numbers=false" alles aus. Neee. ;-)

Viele Grüße
Dirk