
2013년에 나는 이 질문을 하고 답변을 받았지만 다른 코드를 구현하면 이전에 제시되지 않은 새로운 문제가 발생했습니다.
세 개의 열이 있는데 tabularx
그중 두 개는 l
또는 r
이고 c
중간 열은 X
열입니다. 열 이 두 줄 이상을 사용하는 경우 X
원하는 동작은 첫 번째 열(예: 열 l
)을 위쪽으로 정렬하고(열의 첫 번째 줄과 동일한 행에서) X
세 번째 열을 아래쪽으로 정렬하는 것입니다(예: 열). 열의 마지막 줄과 같은 행 X
) 빈 열은 \cdot
.
원본 게시물은 [1]에서 볼 수 있습니다. David Carlisle이 제공한 솔루션에는 측정을 수행하고 텍스트를 원하는 위치( \xleft
, \xright
, \xstart
및 \xend
) 에 배치하는 새로운 명령이 포함되었습니다 \xpad
. 지금까지는 완벽하게 작동했습니다.
- 첫 번째 열과 세 번째 열의 셀에 두 개 이상의 텍스트 문자가 포함되어 있는 경우 채워진 셀은 중앙에 정렬되는 대신 관련된 다른 셀의 텍스트 시작/끝에 수평으로 정렬됩니다. 이는 원하는 모양입니다.
\hbox
셀의 내용을 인쇄하기 위해 를 사용하면 과 같은 확장 가능한 공백의 사용이 금지되고\hfill
오른쪽 열의 한 셀은text\hfill text
열 너비까지 두 단어 사이의 공간을 확장하는 패턴이 있어야 합니다(내에서는 더 긴 셀에서 가져옴). 열 제목의 경우).
다음 코드는 내가 지금 원하는 것을 보여주기 위해 예시된 David Carlisle의 솔루션입니다.
\documentclass{article}
\usepackage{tabularx}
\makeatletter
\def\savepos#1{\leavevmode\pdfsavepos\write\@auxout{%
\gdef\noexpand#1{\the\pdflastypos sp }}}
\def\xstart#1{\expandafter\savepos\csname save@start@#1\endcsname}
\def\xend#1{\expandafter\savepos\csname save@end@#1\endcsname}
\def\xpad#1#2#3{%
\vtop{%
\baselineskip\normalbaselineskip
#2%
\expandafter\ifx\csname save@start@#1\endcsname\relax
\else
\dimen@\csname save@start@#1\endcsname\relax
\loop
\ifdim\dimen@>\csname save@end@#1\endcsname
\advance\dimen@-\baselineskip
\hbox{$\cdot$}%
\repeat
\fi
#3%
}}
\def\xleft#1#2{\xpad{#1}{\hbox{#2}}{}}
\def\xright#1#2{\xpad{#1}{}{\hbox{#2}}}
\begin{document}
\begin{tabularx}{5cm}{cXr}
title 1 & title 2 & title 3 \\
\xleft{a}{7890} & \xstart{a}qwer asdf zxcv qwer
asdf zxcv qwer asdf
zxcv\xend{a} & \xright{a}{1} \\
\xleft{b}{50} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1} \\
90 & ..... & B\hfill2
\end{tabularx}
\end{document}
보시다시피, "7890" 아래의 점은 이 셀의 시작 부분, 즉 숫자 "7" 아래에 정렬되고 "50" 셀 아래의 점은 "5" 바로 아래에 있습니다. 전체적인 모습은 모두 어긋나 있는 모습입니다. 나는 그것들을 모두 첫 번째와 세 번째 열( c
및 r
열)의 중앙에 두는 것을 선호합니다.
두 번째 요점은 \hfill
. 예제에서 \hfill
in 은 A\hfill1
아무 것도 확장되지 않으므로 표시된 텍스트는 "A1"이지만 다음 행 A\hfill2
에는 가장 넓은 셀의 크기(첫 번째 셀: "title 3")까지 확장 가능한 공간이 확장되는 내용이 포함되어 있습니다. 열이 래핑될 수 \hfill
있는 행에서도 효과를 얻을 수 있다면 좋을 것입니다 X
.
티아.
답변1
다시 작성하지 않고 가장 간단한 방법은 상자에 사용할 너비를 지정하고 \hfill
늘릴 수 있도록 허용하는 것입니다. 첫 번째와 세 번째 열의 수평 확장을 측정하기 위해 X 열의 수직 범위를 측정하는 데 사용되는 메커니즘 을 사용하는 것이 가능할 것이라고 가정합니다. \pdflatstpos
그러나 실제로 거의 사용되지 않는 것에 대해 많은 복잡성을 추가합니다. 여기에서처럼 2cm 고정 너비를 사용하는 대신 \settowidth
가장 넓은 항목으로 알고 있는 너비를 얻는 데 사용할 수 있습니다.
\documentclass{article}
\usepackage{tabularx}
\makeatletter
\def\savepos#1{\leavevmode\pdfsavepos\write\@auxout{%
\gdef\noexpand#1{\the\pdflastypos sp }}}
\def\xstart#1{\expandafter\savepos\csname save@start@#1\endcsname}
\def\xend#1{\expandafter\savepos\csname save@end@#1\endcsname}
\def\xpad#1#2#3{%
\vtop{%
\baselineskip\normalbaselineskip
#2%
\expandafter\ifx\csname save@start@#1\endcsname\relax
\else
\dimen@\csname save@start@#1\endcsname\relax
\loop
\ifdim\dimen@>\csname save@end@#1\endcsname
\advance\dimen@-\baselineskip
\hbox{$\cdot$}%
\repeat
\fi
#3%
}}
\def\xleft#1#2#3{\xpad{#1}{\hbox\ifx!#3!\else to #3\fi{#2}}{}}
\def\xright#1#2#3{\xpad{#1}{}{\hbox\ifx!#3!\else to #3\fi{#2}}}
\begin{document}
\begin{tabularx}{5cm}{lXr}
\multicolumn{1}{c}{title 1}& title 2 & title 3 \\
\xleft{a}{7890}{} & \xstart{a}qwer asdf zxcv qwer
asdf zxcv qwer asdf
zxcv\xend{a} & \xright{a}{1}{2cm} \\
\xleft{b}{50}{} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1}{2cm} \\
90 & ..... & B\hfill2
\end{tabularx}
\end{document}