私が理解できない状況では、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
すべての列が含まれます。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 列という数は、X
最も外側の環境の 4 列に、コマンドの使用によるtabularx
8列と、コマンドの使用による2*9列を加えた数より 1 つ多い数です。X
\usrchord
X
\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
コマンドの両方にこれが推奨されます。どちらか一方だけが置き換えられると、行が追加されると問題が再発し、再び列制限を超えてしまいます。