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列多了1列。X\usrchordX\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命令都这样做:如果只替换其中一个,则如果添加更多行,问题将再次出现,因此列限制将再次被超出。

相关内容