在我不理解的情况下,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列多了1列。X
\usrchord
X
\usrlyricsxx
巧合的是,MWE 中的数字 31 正是发生溢出的确切边界:列数(减一)乘以初始列宽,即 31 * 540.60239pt = 16758.67409pt,超过了 16384pt 减去 epsilon 的 tex 限制。只需删除一列X
(例如,删除其中一个\usrchord
命令)即可避免溢出,因为 30 * 540.60239pt = 16218.0717pt < 16384pt。因此,对外部环境的任何行进行注释tabularx
(如问题中所述)也会导致足够少的列数,从而使事情按预期进行。
解决溢出问题的唯一办法是确保每个tabularx
环境中的列总数X
不会变得太大。要实现这一点,可能需要切换tabularx
到不同的环境。对于问题中的示例,建议对\usrchord
和\usrlyricsxx
命令都这样做:如果只替换其中一个,则如果添加更多行,问题将再次出现,因此列限制将再次被超出。