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 內部溢位(請參閱如何排版 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列多一,加上由於使用指令而增加的tabularx8列,再加上由於使用指令而增加的2*9列。X\usrchordX\usrlyricsxx

巧合的是,MWE 中的數字 31 正是發生溢出的邊界:列數(減一)乘以初始列寬,即 31 * 540.60239pt = 16758.67409pt,超出了 tex 限制16384pt 減去 epsilon。只需刪除一列X(例如,刪除其中一個\usrchord命令)即可避免溢出,因為 30 * 540.60239pt = 16218.0717pt < 16384pt。因此,對外部環境的任何行的評論tabularx(如問題中所述)都會導致列數足夠少,從而使事情按預期進行。

溢出問題只能透過確保每個tabularx環境的總數X不會變得太大來解決。為了實現這一點,可能需要切換tabularx到不同的環境。對於問題中的範例,這對於\usrchord\usrlyricsxx命令都是值得推薦的:如果僅替換其中一個,則如果添加更多行,則問題將再次出現,從而再次超出列限制。

相關內容