在我不理解 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列多一,加上由於使用指令而增加的tabularx
8列,再加上由於使用指令而增加的2*9列。X
\usrchord
X
\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
命令都是值得推薦的:如果僅替換其中一個,則如果添加更多行,則問題將再次出現,從而再次超出列限制。