내가 이해할 수 없는 상황에서는 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은 오버플로가 발생하는 정확한 경계입니다. 열 수(1 빼기)에 초기 열 너비, 즉 31 * 540.60239pt = 16758.67409pt를 곱합니다. 이는 tex 제한을 초과합니다. 16384pt 마이너스 엡실론. 열 중 하나만 제거하면 X
(예: 명령 중 하나를 제거하여 \usrchord
) 30 * 540.60239pt = 16218.0717pt < 16384pt와 같이 오버플로를 피할 수 있습니다. 따라서 tabularx
(질문에 설명된 대로) 외부 환경의 행에 대한 주석을 달면 예상대로 작동하도록 충분히 적은 수의 열이 생성됩니다.
오버플로 문제는 각 tabularx
환경에 대해 집계된 열 수가 X
너무 커지지 않도록 보장해야만 해결할 수 있습니다. 이를 달성하려면 tabularx
다른 환경 으로 전환해야 할 수도 있습니다 . 질문의 예에서 이는 \usrchord
및 \usrlyricsxx
명령 모두에 권장됩니다. 명령 중 하나만 교체되면 더 많은 행이 추가되어 다시 열 제한을 초과하면 문제가 다시 발생합니다.