Conteúdo do ambiente tabularx espremido na margem esquerda - problema de aninhamento?

Conteúdo do ambiente tabularx espremido na margem esquerda - problema de aninhamento?

Em circunstâncias que não entendo, o conteúdo de um ambiente tabularx fica espremido na margem esquerda. O exemplo de código a seguir produz o problema no meu 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}

O que resulta na seguinte saída:

conteúdo espremido na margem esquerda

Se, conforme descrito no comentário, uma das linhas do ambiente tabularx for comentada (por exemplo, a primeira), o resultado ficará mais parecido com o que eu esperava:

insira a descrição da imagem aqui

O exemplo acima é apenas um MWE como representante de diversas constelações quando isso acontece. No entanto, espero que o que estou fazendo de errado neste exemplo se aplique a todas as constelações.

Agradeço antecipadamente por sua ajuda.

Responder1

insira a descrição da imagem aqui

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

Mudanças:

  • novas definições de \usrchorde\usrlyricsxx
  • \usrchorduse tabularambiente padrão com p{...}tipo de colunas
  • mostrou uso \usrchordcom mais subcélulas

Responder2

A razão pela qual a saída do MWE fica distorcida é o número de Xcolunas: se esse número ficar muito grande, o funcionamento interno do tabularxambiente levará a um estouro interno do tex (consulteComo compor tabularx com 34 colunas? (Mensagem de erro)). E o número de Xcolunas consideradas para um tabularxambiente externo inclui todas as Xcolunas de todos tabularxos ambientes aninhados.

Isso pode ser facilmente verificado adicionando-se \tracingtabularxao preâmbulo do MWE da pergunta: A execução xelatexproduz a seguinte saída de depuração sobre o tabularxambiente mais externo:

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

O número de 31 colunas é um a mais que as 4 Xcolunas do tabularxambiente mais externo, mais as 8 Xcolunas devido aos usos do \usrchordcomando, mais as 2*9 Xcolunas devido aos usos do \usrlyricsxxcomando.

Coincidentemente, o número 31 do MWE é o limite exato no qual ocorre o overflow: O número de colunas (menos um) é multiplicado pela largura inicial da coluna, ou seja, 31 * 540,60239pt = 16758,67409pt, que excede o limite tex de 16384pt menos épsilon. Apenas remover uma das Xcolunas (por exemplo, retirando um dos \usrchordcomandos) evitará o overflow, pois 30 * 540.60239pt = 16218.0717pt < 16384pt. Portanto, também o comentário de qualquer uma das linhas do tabularxambiente externo (conforme descrito na pergunta) leva a um número suficientemente pequeno de colunas para que as coisas funcionem conforme o esperado.

O problema do overflow só pode ser resolvido garantindo para cada tabularxambiente que o número agregado de Xcolunas não se torne muito grande. Para conseguir isso, pode ser necessário mudar tabularxpara um ambiente diferente. Para o exemplo da pergunta, isso seria recomendável para \usrchordos comandos e \usrlyricsxx: Se apenas um deles for substituído, o problema ocorrerá novamente se mais linhas forem adicionadas e, portanto, novamente o limite da coluna será excedido.

informação relacionada