Sie sind hier

\input und \bottomrule verursachen Fehler

Hallo,

auf der Tex Live Mailing Liste wies man mich heute darauf hin, dass ich folgende Fehlermeldung direkt bei Markus/im Forum posten sollte. Hier meine Mail an die Liste:

----
I have quite a few instances where I read the table body from a file
(see MWE below). This used to work well up until before Christmas, but
as of today LuaTeX crashes with:

! Misplaced \noalign.
\bottomrule ->\noalign
{\ifnum 0=`}\fi \@aboverulesep =\aboverulesep \global...

l.19 \end{tabularx}

When I don't read the table body from a separate file it works
alright. Please take a look at the following example:

\documentclass[a4paper]{scrartcl}
\usepackage{tabularx}
\usepackage{booktabs}

\begin{filecontents}{tablebody.tex}
abc & 123 \\
def & 456 \\
\end{filecontents}

\begin{document}

\begin{tabularx}{1\linewidth}{XX}
\toprule
Col 1 & Col 2 \\
\midrule
\input{tablebody}
\bottomrule
\end{tabularx}

\end{document}

Further experiments show that if I replace the "scrartcl" class with
"article", LuaTeX does not crash. So it seems that something might be
wrong after the KoMa Script update of December 23rd?

I'd be glad if somebody could look into this.

----

Nun habe ich auf dieser Seite Markus Hinweise zu "Stress" gelesen, in denen Änderungen an \InputIfFileExists und Anpassungen in LaTeX 2019-10 erwähnt werden. Vermutlich gibt es da einen Zusammenhang, aber ich kann das nicht näher eingrenzen. Vielleicht kann mir jemand genauer erklären, ob dies ein Feature oder ein Bug ist?

Ich verwende TeX Live mit Stand vom 06.12., hier die Ausgabe von \listfiles:

*File List*
scrartcl.cls 2019/12/23 v3.28 KOMA-Script document class (article)
scrkbase.sty 2019/12/23 v3.28 KOMA-Script package (KOMA-Script-dependent bas
ics and keyval usage)
scrbase.sty 2019/12/23 v3.28 KOMA-Script package (KOMA-Script-independent b
asics and keyval usage)
keyval.sty 2014/10/28 v1.15 key=value parser (DPC)
scrlfile.sty 2019/12/23 v3.28 KOMA-Script package (loading files)
tocbasic.sty 2019/12/23 v3.28 KOMA-Script package (handling toc-files)
scrsize11pt.clo 2019/12/23 v3.28 KOMA-Script font size class option (11pt)
typearea.sty 2019/12/23 v3.28 KOMA-Script package (type area)
tabularx.sty 2016/02/03 v2.11b `tabularx' package (DPC)
array.sty 2019/08/31 v2.4l Tabular extension package (FMi)
booktabs.sty 2019/10/08 v1.6180339 publication quality tables
***********

Herzlichen Dank!

Alexander

Bild von Markus Kohm

Aufgrund von Änderungen im LaTeX-Kern und von einem Bug in älteren Versionen des LaTeX-Kerns musste \InputIfFileExists in scrlfile seit der letzten Release mehrfach geändert werden. Als Nebeneffekt werden nun am Ende von \input noch einige interne Makros definiert. Dadurch wird im Beispiel bereits Code ausgeführt, bevor \bottomrule ausgeführt wird und LaTeX geht dann davon aus, dass die nächste Spalte bereits begonnen hat.

Letztlich ist das jetzt also vergleichbar mit:

\documentclass[a4paper]{article}
\usepackage{tabularx}
\usepackage{booktabs}
 
\begin{filecontents}{tablebody.tex}
abc & 123 \\
def & 456 \\
\end{filecontents}
\begin{document}
 
\begin{tabularx}{1\linewidth}{XX}
\toprule
Col 1 & Col 2 \\
\midrule
\input{tablebody}
\def\test{ok}%
\bottomrule
\end{tabularx}
 
\end{document}

.
Übrigens war dein Vorgehen auch bisher schon nicht unkritisch, wenn nämlich jemand \AfterFile{tablebody}{\typeout{tablebody gelesen}} o. ä. gemacht hätte, dann wäre schon das in die Hose gegangen.

Wenn die ganze Hook-Geschichte von scrlfile keine Anwendung finden soll und auch die Dateisuche via \InputIfFileExists nicht benötigt wird, dann kannst du \csname @input\endcsname statt \input verwenden. Wenn außerdem sicher gestellt werden soll, dass wirklich das TeX-Primitiv \input verwendet wird, also Seiteneffekte wie obiger auch durch andere Pakete vermieden werden sollen, dann empfehle ich sogar \csname @@input\endcsname. Das ist per Definition in LaTeX das ursprüngliche TeX-Primitiv. Wobei ich vor einige Zeit auch auf ein Paket gestoßen bin, das sogar \@@input noch einmal umdefiniert. Wenn das also auch nicht funktioniert, dann ggf. noch einmal per \show testen, ob das ebenfalls umdefiniert wurde und ggf. noch eine Ebene tiefer absteigen.

Vermutlich könnte ich für die aktuelle Version des LaTeX-Kerns einen Workaround einbauen. Ob ich das will, steht allerdings auf einem anderen Blatt.

Falls übrigens (wie im Beispiel) die externe Datei nur ein Hilfskonstrukt ist, könnte man auch:

\documentclass[a4paper]{scrartcl}
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage{scontents}
 
\begin{scontents}[store-env=tablebody]
abc & 123 \\
def & 456 \\
\end{scontents}
 
 
\begin{document}
  \begin{tabularx}{1\linewidth}{XX}
    \toprule
    Col 1 & Col 2 \\
    \midrule
    \getstored{tablebody}
    \bottomrule
  \end{tabularx}
 
\end{document}

verwenden. Aber das ist natürlich ein eher seltener Fall.

Markus, vielen Dank für die schnelle, ausführliche und höchst hilfreiche Erklärung. Gerade in Anbetracht der von Dir angekündigten Auszeit freue ich mich sehr über Deine Hilfe.

Ich werde mir noch genauer anschauen, welche Seiteneffekte zu beachten sind und mich dann für eine der beiden Alternativen entscheiden.

Die externe Datei ist im echten Dokument kein Hilfskonstrukt, sondern wird von einem externen Prozess beigesteuert.

Bild von Markus Kohm

Die Auszeit ist inzwischen beendet. Eigentlich wurde sie das schon mit Veröffentlichung von KOMA-Script 3.28 am 23. Dezember. Allerdings habe ich mir bis gestern noch etwas Urlaub gegönnt. Ergebnisse aus der Auszeit gibt es auch abseits der Veröffentlichung von KOMA-Script 3.28.

Bild von Markus Kohm

Der erwähnte Workaround ist inzwischen eingebaut und sollte auch für ältere LaTeX-Kernel funktionieren. Allerdings behebt dieser (ganz bewusst) nicht das Problem, falls \AfterFile für die per \input geladene Datei eine Rolle spielt. Das gezeigte Beispiel funktioniert aber mit der aktuellen Prerelease von KOMA-Script 3.29 wieder. Siehe dazu auch die bekannten Probleme und Änderungen in KOMA-Script 3.28.

Comments for "\input und \bottomrule verursachen Fehler" abonnieren