При обстоятельствах, которые я не понимаю, содержимое среды 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
: Если заменить только одну из них, проблема возникнет снова, если будут добавлены дополнительные строки, и, таким образом, снова будет превышен лимит столбцов.