Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

29 Jan '16, 10:40

cgnieder's gravatar image

cgnieder
22.1k253463

@saputello hat es in einem Kommentar schon angedeutet: zu Beginn einer Tabelle oder zu Beginn einer neuen Tabellenzeile kann per `\hline` (oder den meines Erachtens schöneren Linien mit [`booktabs`][1] [`booktabs`][1]' Befehlen wie `\toprule` etc.) eine horizontale Tabellenlinie eingefügt werden. Damit die Linie nicht als Teil der ersten Zelle der aktuellen Zeile interpretiert wird, wird dafür unter der Haube das TeX-Primitiv `\noalign` verwendet. \def\hline{\noalign{...}} Damit `\noalign` seine Arbeit verrichten kann, darf die aktuelle Zelle noch nicht begonnen haben. Konkret heißt das, dass vor `\noalign` nur expandierbare Makros stehen dürfen (die auch nicht zu nichtexpandierbarem Inhalt/Output etc expandieren dürfen). dürfen). Steht irgendetwas derartiges vor `\noalign`, dann kommt es zu dem berüchtigten »misplaced `\noalign`«-Fehler wie hier: ! Misplaced \noalign. \hline ->\noalign {\ifnum 0=`}\fi \hrule \@height \arrayrulewidth \futurelet... Die Fehlermeldung lässt sich beispeilsweise beispielsweise schon [mit einem `\relax`][2] hervorrufen: hervorrufen, das ja (siehe Link) keinerlei Output erzeugt, aber eben nicht expandierbar ist: \documentclass{article} \begin{document} \begin{tabular}{c} \relax \hline \end{tabular} \end{document} In diesem Fall ist das Problem, dass die Befehle `\foo` und `\endfoo`, die durch `\NewDocumentEnvironment{foo}` definiert werden, `\protected`, also nicht expandierbar sind, so wie `\relax`. Da `\endfoo` aufgerufen werden muss, um die Definition des Umgebungsendes einzufügen, wirst Du hier gebissen. \documentclass{article} \usepackage{xparse} \NewDocumentEnvironment{tabelle}{} {\tabular} {\hline\endtabular} \show\endtabelle % > \endtabelle=\protected macro: % ->\environment tabelle end aux . \begin{document} \begin{tabelle}{c} \hline foo \\ \end{tabelle} \end{document} Einfacher Workaround für Deinen Fall: definiere `TabelleLa` folgendermaßen: \NewDocumentEnvironment{TabelleLa}{} {\tabular{ll}\hline lateinisch & deutsch \\ \hline} {\\ \hline\endtabular} Damit wird das Ende der Zeile und der Start der neuen verzögert, und das `\noalign` in `\hline` ist tatsächlich das erste in der entsprechenden Zeile. Du musst dann eben das letzte `\\` bei der Verwendung der Umgebung weglassen: \begin{TabelleLa} edere & essen \\ bibere & trinken \\ dormire & schlafen \end{TabelleLa} [1]: http://www.ctan.org/pkg/booktabs [2]: http://texwelt.de/wissen/fragen/894/
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

29 Jan '16, 10:13

cgnieder's gravatar image

cgnieder
22.1k253463

@saputello hat es in einem Kommentar schon angedeutet: zu Beginn einer Tabelle oder zu Beginn einer neuen Tabellenzeile kann per `\hline` (oder den meines Erachtens schöneren Linien mit [`booktabs`][1] Befehlen wie `\toprule` etc.) eine Tabellenline horizontale Tabellenlinie eingefügt werden. Damit die Linie nicht als Teil der ersten Zelle der aktuellen Zeile interpretiert wird, wird dafür unter der Haube das TeX-Primitiv `\noalign` verwendet. \def\hline{\noalign{...}} Damit `\noalign` seine Arbeit verrichten kann, darf die aktuelle Zelle noch nicht begonnen haben. Konkret heißt das, dass vor `\noalign` nur expandierbare Makros stehen dürfen (die auch nicht zu nichtexpandierbarem Inhalt/Output etc expandieren dürfen). Die Fehlermeldung lässt sich beispeilsweise schon [mit einem `\relax`][2] hervorrufen: \documentclass{article} \begin{document} \begin{tabular}{c} \relax \hline \end{tabular} \end{document} In diesem Fall ist das Problem, dass die Befehle `\foo` und `\endfoo`, die durch `\NewDocumentEnvironment{foo}` definiert werden, `\protected`, also nicht expandierbar sind, so wie `\relax`. Da `\endfoo` aufgerufen werden muss, um die Definition des Umgebungsendes einzufügen, wirst Du hier gebissen. \documentclass{article} \usepackage{xparse} \NewDocumentEnvironment{tabelle}{} {\tabular} {\hline\endtabular} \show\endtabelle % > \endtabelle=\protected macro: % ->\environment tabelle end aux . \begin{document} \begin{tabelle}{c} \hline foo \\ \end{tabelle} \end{document} Einfacher Workaround für Deinen Fall: definiere `TabelleLa` folgendermaßen: \NewDocumentEnvironment{TabelleLa}{} {\tabular{ll}\hline lateinisch & deutsch \\ \hline} {\\ \hline\endtabular} Damit wird das Ende der Zeile und der Start der neuen verzögert, und das `\noalign` in `\hline` ist tatsächlich das erste in der entsprechenden Zeile. Du musst dann eben das letzte `\\` bei der Verwendung der Umgebung weglassen: \begin{TabelleLa} edere & essen \\ bibere & trinken \\ dormire & schlafen \end{TabelleLa} [1]: http://www.ctan.org/pkg/booktabs [2]: http://texwelt.de/wissen/fragen/894/
Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

29 Jan '16, 10:12

cgnieder's gravatar image

cgnieder
22.1k253463