Contenido del entorno tabularx comprimido en el margen izquierdo: ¿problema de anidamiento?

Contenido del entorno tabularx comprimido en el margen izquierdo: ¿problema de anidamiento?

En circunstancias que no entiendo, el contenido de un entorno tabularx queda comprimido en el margen izquierdo. El siguiente ejemplo de código produce el problema en mi sistema (usando xelatex):

\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}

Lo que da como resultado el siguiente resultado:

contenido comprimido al margen izquierdo

Si, como se describe en el comentario, se comenta una de las filas del entorno tabularx (por ejemplo, la primera), el resultado se parece más a lo que espero:

ingrese la descripción de la imagen aquí

El ejemplo anterior es solo un MWE como representante de varias constelaciones cuando esto sucede. Sin embargo, espero que lo que estoy haciendo mal en este ejemplo se aplique a todas las constelaciones.

Gracias de antemano por tu ayuda.

Respuesta1

ingrese la descripción de la imagen aquí

\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}

Cambios:

  • nuevas definiciones de \usrchordy\usrlyricsxx
  • \usrchordutilizar tabularentorno estándar con p{...}tipo de columnas
  • mostró uso \usrchordcon más subcélulas

Respuesta2

La razón por la que la salida del MWE se vuelve confusa es el número de Xcolumnas: si este número aumenta demasiado, el funcionamiento interno del tabularxentorno provocará un desbordamiento interno de tex (consulte¿Cómo componer tabularx con 34 columnas? (Mensaje de error)). Y el número de Xcolumnas consideradas para un tabularxentorno exterior incluye todas las Xcolumnas de todos tabularxlos entornos anidados.

Esto se puede verificar fácilmente agregando \tracingtabularxal preámbulo del MWE la pregunta: La ejecución xelatexproduce el siguiente resultado de depuración sobre el tabularxentorno más externo:

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

El número de 31 columnas es una más que las 4 Xcolumnas del tabularxentorno más externo, más las 8 Xcolumnas debidas al uso del \usrchordcomando, más las 2 * 9 Xcolumnas debidas al uso del \usrlyricsxxcomando.

Casualmente, el número 31 del MWE es el límite exacto en el que se produce el desbordamiento: el número de columnas (menos una) se multiplica por el ancho de la columna inicial, es decir, 31 * 540,60239 pt = 16758,67409 pt, que excede el límite tex de 16384pt menos épsilon. Simplemente eliminando una sola de las Xcolumnas (por ejemplo, eliminando uno de los \usrchordcomandos) evitará el desbordamiento, ya que 30 * 540.60239pt = 16218.0717pt < 16384pt. Por lo tanto, también el comentario de cualquiera de las líneas del tabularxentorno exterior (como se describe en la pregunta) conduce a un número suficientemente pequeño de columnas para que todo funcione como se esperaba.

El problema del desbordamiento sólo puede resolverse garantizando para cada tabularxentorno que el número agregado de Xcolumnas no sea demasiado grande. Para lograr esto, puede que sea necesario cambiar tabularxa un entorno diferente. Para el ejemplo de la pregunta, esto sería recomendable tanto para los comandos \usrchordcomo para los \usrlyricsxx: si solo se reemplaza uno de ellos, el problema volverá a ocurrir si se agregan más líneas y, por lo tanto, nuevamente se excederá el límite de columnas.

información relacionada