Inhalt der Tabularx-Umgebung am linken Rand zusammengedrückt – Verschachtelungsproblem?

Inhalt der Tabularx-Umgebung am linken Rand zusammengedrückt – Verschachtelungsproblem?

Unter Umständen, die ich nicht verstehe, wird der Inhalt einer tabularx-Umgebung an den linken Rand gequetscht. Das folgende Codebeispiel führt auf meinem System (mit xelatex) zu diesem Problem:

\documentclass{article} % -*- coding: utf-8-unix -*-
\usepackage[german]{babel}
\usepackage{geometry}
\usepackage{tabularx}
\geometry{a4paper,margin=1cm}
\begin{document}
\newcommand{\usrchord}[2]{
   \vspace{0ex}
   \begin{tabularx}{0.23\textwidth}{*{#1}{X}}
      \Huge \bf #2
   \end{tabularx}
}
\newcommand{\usrlyricsxx}[2]{   
   \vspace{0ex}
   \begin{tabularx}{0.2\textwidth}{X|X}
      #1 & #2 \\
   \end{tabularx}
}
\begin{tabularx}{\textwidth}{*{4}{|X}|}
% Comment randomly any of the following lines to see the difference
   \usrchord{1}{A}    & \usrchord{1}{D}    & \usrchord{1}{E}    & \usrchord{1}{A}    \\
   \usrlyricsxx{a}{b} & \usrlyricsxx{c}{d} & \usrlyricsxx{e}{f} & \usrlyricsxx{g}{h} \\
   \usrchord{1}{A}    & \usrchord{1}{D}    & \usrchord{1}{E}    & \usrchord{1}{E}    \\
   \usrlyricsxx{i}{j} & \usrlyricsxx{k}{l} & \usrlyricsxx{m}{n} & \usrlyricsxx{o}{p} \\
   \usrlyricsxx{q}{}  \\
\end{tabularx}
\end{document}

Das Ergebnis ist die folgende Ausgabe:

Inhalt an den linken Rand gequetscht

Wenn, wie im Kommentar beschrieben, eine der Zeilen der tabularx-Umgebung kommentiert wird (zum Beispiel die erste), sieht das Ergebnis eher so aus, wie ich es erwarte:

Bildbeschreibung hier eingeben

Das obige Beispiel ist nur ein MWE stellvertretend für mehrere Konstellationen, in denen dies geschieht. Ich hoffe jedoch, dass das, was ich in diesem Beispiel falsch mache, für alle Konstellationen gilt.

Vielen Dank im Voraus für Ihre Hilfe.

Antwort1

Bildbeschreibung hier eingeben

\documentclass{article}
\usepackage{tabularx}
\usepackage[a4paper,margin=1cm]{geometry}

\newcommand{\usrchord}[2]{
   \begin{tabularx}{\dimexpr\hsize+\tabcolsep\relax}{*{#1}{>{\bfseries\Huge}X}}
      #2
   \end{tabularx}
}
\newcommand{\usrlyricsxx}[2]{
   \begin{tabular}{p{\dimexpr0.5\hsize-1.5\tabcolsep\relax}|
                   p{\dimexpr0.5\hsize-1.5\tabcolsep\relax}}
      #1 & #2 \\
   \end{tabular}
}

\usepackage{showframe}% for show page layout in this MWE ...
\renewcommand\ShowFrameLinethickness{0.15pt}
\renewcommand*\ShowFrameColor{\color{red}}

\begin{document}
\noindent
\begin{tabularx}{\textwidth}{*{4}{|X}|}
\usrchord{1}{A}    & \usrchord{1}{D}    & \usrchord{1}{E}    & \usrchord{1}{A}    \\
\usrlyricsxx{a}{b} & \usrlyricsxx{c}{d} & \usrlyricsxx{e}{f} & \usrlyricsxx{g}{h} \\
\usrchord{1}{A}    & \usrchord{1}{D}    & \usrchord{1}{E}    & \usrchord{1}{E}    \\
\usrlyricsxx{i}{j} & \usrlyricsxx{k}{l} & \usrlyricsxx{m}{n} & \usrlyricsxx{o}{p} \\
\usrchord{2}{A & B}&\usrchord{4}{C & D & E & F}  \\
\end{tabularx}
\end{document}

Änderungen:

  • neue Definitionen von \usrchordund\usrlyricsxx
  • \usrchordtabularStandardumgebung mit p{...}Spaltentyp verwenden
  • zeigte Verwendung \usrchordmit mehr Unterzellen

Antwort2

Der Grund, warum die Ausgabe für das MWE verstümmelt wird, ist die Anzahl der XSpalten: Wenn diese Zahl zu groß wird, führt die Funktionsweise der tabularxUmgebung zu einem internen Tex-Überlauf (sieheWie setze ich Tabularx mit 34 Spalten? (Fehlermeldung)). Und die Anzahl der Xfür eine äußere tabularxUmgebung berücksichtigten Spalten umfasst alle XSpalten aller verschachtelten tabularxUmgebungen.

Dies lässt sich leicht überprüfen, indem man \tracingtabularxder Präambel des MWE aus der Frage Folgendes hinzufügt: Beim Ausführen xelatexwird dann die folgende Debug-Ausgabe über die äußerste tabularxUmgebung erzeugt:

(tabularx)     Table Width    Column Width    X Columns
(tabularx)      2212.40952pt    540.60239pt      31
(tabularx) Don't exceed \maxdimen 

Die Anzahl der 31 Spalten ist um eins mehr als die 4 XSpalten der äußersten tabularxUmgebung plus die 8 XSpalten aufgrund der Verwendungen des \usrchordBefehls plus die 2*9 XSpalten aufgrund der Verwendungen des \usrlyricsxxBefehls.

Zufälligerweise ist die Zahl 31 aus dem MWE die genaue Grenze, bei der der Überlauf auftritt: Die Anzahl der Spalten (minus eins) wird mit der anfänglichen Spaltenbreite multipliziert, das ergibt 31 * 540,60239pt = 16758,67409pt, was die Tex-Grenze von 16384pt minus Epsilon überschreitet. Das Entfernen einer einzigen XSpalte (z. B. durch Herausnehmen eines der \usrchordBefehle) vermeidet den Überlauf, da 30 * 540,60239pt = 16218,0717pt < 16384pt. Daher führte auch das Kommentieren beliebiger Zeilen der äußeren tabularxUmgebung (wie in der Frage beschrieben) zu einer ausreichend kleinen Anzahl von Spalten, sodass alles wie erwartet funktionierte.

Das Problem des Überlaufs lässt sich nur lösen, indem man für jede tabularxUmgebung sicherstellt, dass die aggregierte Anzahl der XSpalten nicht zu groß wird. Dazu kann es notwendig sein, von in eine andere Umgebung zu wechseln . Für das Beispiel aus der Frage wäre das sowohl für den als auch für die Befehle tabularxempfehlenswert : Wird nur einer davon ersetzt, tritt das Problem erneut auf, wenn weitere Zeilen hinzugefügt werden und damit wieder das Spaltenlimit überschritten wird.\usrchord\usrlyricsxx

verwandte Informationen