Beim Versuch mit dem xparse-Befehl \NewDocumentEnvironment eine Umgebung zu definieren, die eine Tabelle beginnt und beendet, erhalte ich eine Fehlermeldung. Mit dem klassischen \newenvironment funktioniert das Ganze aber.

Open in Online-Editor
\documentclass{article}
\usepackage{xparse}
\usepackage[utf8]{inputenc}

\newenvironment{TabelleFr}
{\begin{tabular}{ll}\hline französisch & deutsch \\ \hline}
{\hline\end{tabular}}

\NewDocumentEnvironment{TabelleLa}{}
{\begin{tabular}{ll}\hline lateinisch & deutsch \\ \hline}
{\hline\end{tabular}}

\begin{document}
\begin{TabelleFr}
liberté & Freiheit \\
egalité & Gleichheit \\
fraternité & Brüderlichkeit \\
\end{TabelleFr}

\bigskip
\begin{TabelleLa}
edere & essen \\
bibere & trinken \\
dormire & schlafen \\
\end{TabelleLa}
\end{document}
! Misplaced \noalign.
\hline ->\noalign 
                  {\ifnum 0=`}\fi \hrule \@height \arrayrulewidth \futurelet...
l.25 \end{TabelleLa}

gefragt 27 Jan, 06:09

Cletus's gravatar image

Cletus
995126
Akzeptiert: 71%

bearbeitet 27 Jan, 06:23

saputello's gravatar image

saputello
18.4k22352

1

Das Problem ist nicht die tabular-Umgebung. Das Problem ist das \hline. Da \end{TabelleFr} schon etwas ausführt, bevor \hline zum Zuge kommt, ist dessen \noalign dann nicht mehr im korrekten Kontext. Aus ähnlichem Grund funktioniert auch ein mit \NewDocumentCommand{\myhline}{}{\hline} definiertes \myhline nicht in einer Tabelle, während \DeclareExpandableDocumentCommand{\myhline}{}{\hline} funktioniert.

(27 Jan, 06:15) saputello

@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' 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.

Open in Online-Editor
\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). Steht irgendetwas derartiges vor \noalign, dann kommt es zu dem berüchtigten »misplaced \noalign«-Fehler wie hier:

Open in Online-Editor
! Misplaced \noalign.
\hline ->\noalign 
                  {\ifnum 0=`}\fi \hrule \@height \arrayrulewidth \futurelet...

Die Fehlermeldung lässt sich beispielsweise schon mit einem relax hervorrufen, das ja (siehe Link) keinerlei Output erzeugt, aber eben nicht expandierbar ist:

Open in Online-Editor
\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.

Open in Online-Editor
\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:

Open in Online-Editor
\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:

Open in Online-Editor
\begin{TabelleLa}
  edere   & essen \\
  bibere  & trinken \\
  dormire & schlafen
\end{TabelleLa}
Permanenter link

beantwortet 29 Jan, 04:12

Clemens's gravatar image

Clemens
19.0k112960

bearbeitet 29 Jan, 04:40

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×185
×2

Frage gestellt: 27 Jan, 06:09

Frage wurde angeschaut: 709 Mal

Zuletzt aktualisiert: 29 Jan, 04:40