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모든 열이 포함됩니다 .Xtabularx

\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은 오버플로가 발생하는 정확한 경계입니다. 열 수(1 빼기)에 초기 열 너비, 즉 31 * 540.60239pt = 16758.67409pt를 곱합니다. 이는 tex 제한을 초과합니다. 16384pt 마이너스 엡실론. 열 중 하나만 제거하면 X(예: 명령 중 하나를 제거하여 \usrchord) 30 * 540.60239pt = 16218.0717pt < 16384pt와 같이 오버플로를 피할 수 있습니다. 따라서 tabularx(질문에 설명된 대로) 외부 환경의 행에 대한 주석을 달면 예상대로 작동하도록 충분히 적은 수의 열이 생성됩니다.

오버플로 문제는 각 tabularx환경에 대해 집계된 열 수가 X너무 커지지 않도록 보장해야만 해결할 수 있습니다. 이를 달성하려면 tabularx다른 환경 으로 전환해야 할 수도 있습니다 . 질문의 예에서 이는 \usrchord\usrlyricsxx명령 모두에 권장됩니다. 명령 중 하나만 교체되면 더 많은 행이 추가되어 다시 열 제한을 초과하면 문제가 다시 발생합니다.

관련 정보