Содержимое среды tabularx сжато по левому краю — проблема вложенности?

Содержимое среды tabularx сжато по левому краю — проблема вложенности?

При обстоятельствах, которые я не понимаю, содержимое среды tabularx сжимается до левого поля. Следующий пример кода создает проблему в моей системе (используя 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}

В результате получаем следующий результат:

содержимое сжато по левому краю

Если, как описано в комментарии, одна из строк среды tabularx прокомментирована (например, первая), результат будет больше похож на то, что я ожидаю:

введите описание изображения здесь

В примере выше представлен только один MWE как представитель нескольких созвездий, когда это происходит. Однако я надеюсь, что то, что я делаю неправильно в этом примере, применимо ко всем созвездиям.

Заранее спасибо за вашу помощь.

решение1

введите описание изображения здесь

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

Изменения:

  • новые определения \usrchordи\usrlyricsxx
  • \usrchordиспользовать стандартную tabularсреду с p{...}типом столбцов
  • показал использование \usrchordс большим количеством подэлементов

решение2

Причиной искажения выходных данных MWE является количество Xстолбцов: если это число становится слишком большим, внутренняя работа среды tabularxприводит к внутреннему переполнению tex (см.Как набрать tabularx с 34 столбцами? (Сообщение об ошибке)). И число Xстолбцов, рассматриваемых для внешней tabularxсреды, включает все Xстолбцы всех вложенных tabularxсред.

Это можно легко проверить, добавив \tracingtabularxв преамбулу MWE из вопроса: Запуск xelatexзатем выдает следующий отладочный вывод о самой внешней tabularxсреде:

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

Число столбцов (31) на один больше, чем 4 Xстолбца самой внешней tabularxсреды, плюс 8 Xстолбцов из-за использования команды \usrchord, плюс 2*9 Xстолбцов из-за использования команды \usrlyricsxx.

По совпадению, число 31 из MWE является точной границей, на которой происходит переполнение: количество столбцов (минус один) умножается на начальную ширину столбца, то есть 31 * 540.60239pt = 16758.67409pt, что превышает предел tex 16384pt минус epsilon. Простое удаление одного из столбцов X(например, путем удаления одной из \usrchordкоманд) позволит избежать переполнения, так как 30 * 540.60239pt = 16218.0717pt < 16384pt. Следовательно, также комментирование любой из строк внешнего tabularxокружения (как было описано в вопросе) приводит к достаточно небольшому количеству столбцов, чтобы все работало так, как и ожидалось.

Проблему переполнения можно решить, только обеспечив для каждой tabularxсреды, чтобы агрегированное число Xстолбцов не стало слишком большим. Для достижения этого может потребоваться перейти из tabularxв другую среду. Для примера из вопроса это было бы рекомендовано для обеих команд \usrchordи \usrlyricsxx: Если заменить только одну из них, проблема возникнет снова, если будут добавлены дополнительные строки, и, таким образом, снова будет превышен лимит столбцов.

Связанный контент