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 '16, 12:09

Cletus's gravatar image

Cletus
1.4k14258
Akzeptiert-Rate: 83%

bearbeitet 27 Jan '16, 12:23

saputello's gravatar image

saputello
10.8k103963

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 '16, 12: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 '16, 10:12

cgnieder's gravatar image

cgnieder
20.8k193463
Akzeptiert-Rate: 60%

bearbeitet 29 Jan '16, 10:40

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

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

Frage-Themen:

×238
×5

gestellte Frage: 27 Jan '16, 12:09

Frage wurde gesehen: 3,717 Mal

zuletzt geändert: 29 Jan '16, 10:40