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 環境の行の 1 つ (たとえば、最初の行) がコメント化されている場合、結果は期待したものに近くなります。

ここに画像の説明を入力してください

上記の例は、このような状況が発生した場合の複数の星座の代表として、1 つの 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の内部オーバーフローが発生します(34 列の tabularx をタイプセットするにはどうすればいいですか? (エラー メッセージ)X)。また、外部環境で考慮される列の数には、すべてのネストされた環境のtabularxすべての列が含まれます。Xtabularx

\tracingtabularxこれは、質問の MWE のプリアンブルに以下を追加することで簡単に確認できます。実行するxelatexと、最も外側の環境に関する次のデバッグ出力が生成されますtabularx

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

31 列という数は、X最も外側の環境の 4 列に、コマンドの使用によるtabularx8列と、コマンドの使用による2*9列を加えた数より 1 つ多い数です。X\usrchordX\usrlyricsxx

偶然にも、MWE の 31 という数字は、オーバーフローが発生する正確な境界です。列数 (マイナス 1) に初期列幅を掛けると、31 * 540.60239pt = 16758.67409pt となり、これは 16384pt マイナスイプシロンの tex 制限を超えます。列を 1 つ削除するだけでX(たとえば、コマンドの 1 つを削除するなど\usrchord)、30 * 540.60239pt = 16218.0717pt < 16384pt であるため、オーバーフローは回避されます。したがって、外部環境の行のいずれかをコメント化するとtabularx(質問で説明されているように)、列数が十分に少なくなり、期待どおりに動作します。

オーバーフローの問題は、各tabularx環境で合計された列数がX大きくなりすぎないようにすることによってのみ解決できます。これを実現するには、 からtabularx別の環境に切り替える必要がある場合があります。質問の例では、 コマンド\usrchord\usrlyricsxxコマンドの両方にこれが推奨されます。どちらか一方だけが置き換えられると、行が追加されると問題が再発し、再び列制限を超えてしまいます。

関連情報