테이블 내부에서만 목록 여백 제거

테이블 내부에서만 목록 여백 제거

itemize테이블 형식 환경(특히 )에 나타나는 목록의 스타일을 지정하려고 합니다 longtable. 이상적으로는 테이블 외부 목록의 여백을 유지하면서 테이블에 나타나는 목록에서 왼쪽 여백을 제거하고 싶습니다.

enumitem패키지를 사용하여 목록의 여백을 변경하는 방법에 대한 몇 가지 답변이 이미 있습니다 .leftmargin=*특정 목록에 설정할 수 있습니다, 또는 할 수 있습니다새로운 사용자 정의 itemize환경 만들기특히 테이블 내부에서 사용하세요.

그러나 Pandoc을 사용하여 Markdown을 TeX으로 변환하고 있으므로 결과 TeX 출력을 제어할 수 없습니다. 사용자 정의 \begin{itemize}[leftmargin=*]. 전역적으로 목록 설정을 지정하고 모든 목록에서 왼쪽 여백을 제거 할 수 있는 매크로가 있습니다 . 이는 테이블 내의 목록만 대상으로 삼으려고 하기 때문에 이상적이지 않습니다.\begin{marginlessitemize}enumitem\setlist\setlist[itemize]{leftmargin=*}

신청할 수 있는 방법이 있나요\setlist{...} 오직테이블 형식 환경 내에 중첩된 환경을 항목화하려면 어떻게 해야 합니까? 완벽한 세상에서는 서문에 일종의 논리를 사용하는 것이 좋을 것입니다. itemize테이블에 있으면 여백을 사용하지 마십시오. 그렇지 않으면 여백을 사용하십시오.


MWE는 다음과 같습니다…

(지저분한 longtable출력은 pandoc이 TeX으로 변환하는 이 Markdown 테이블에서 나옵니다):

+-----------+-----------+
| Thing     | List      |
+===========+===========+
| Thing 1   | - Item 1  |
|           | - Item 2  |
+-----------+-----------+
| Thing 2   | - Item 3  |
|           | - Item 4  |
+-----------+-----------+

이 TeX 파일은…

\documentclass[11pt,article,oneside]{memoir}

\usepackage{longtable}

\begin{document}

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

\begin{itemize}
\tightlist
\item
  Item 1
\item
  Item 2
\end{itemize}

\begin{longtable}[]{@{}ll@{}}
\caption{This is a table.}\tabularnewline
\toprule
\begin{minipage}[b]{0.21\columnwidth}\raggedright
Thing
\end{minipage} & \begin{minipage}[b]{0.27\columnwidth}\raggedright
List
\end{minipage}\tabularnewline
\midrule
\endfirsthead
\toprule
\begin{minipage}[b]{0.21\columnwidth}\raggedright
Thing
\end{minipage} & \begin{minipage}[b]{0.27\columnwidth}\raggedright
List
\end{minipage}\tabularnewline
\midrule
\endhead
\begin{minipage}[t]{0.21\columnwidth}\raggedright
Thing 1
\end{minipage} & \begin{minipage}[t]{0.27\columnwidth}\raggedright
\begin{itemize}
\tightlist
\item
  Item 1
\item
  Item 2
\end{itemize}
\end{minipage}\tabularnewline
\begin{minipage}[t]{0.21\columnwidth}\raggedright
Thing 2
\end{minipage} & \begin{minipage}[t]{0.27\columnwidth}\raggedright
\begin{itemize}
\tightlist
\item
  Item 3
\item
  Item 4
\end{itemize}
\end{minipage}\tabularnewline
\bottomrule
\end{longtable}

\end{document}

…이 PDF를 생성합니다.

테이블 안팎의 여백

이것을 서문에 추가하면…

\usepackage{enumitem}
\setlist[itemize]{leftmargin=*}

...테이블 내부 목록의 왼쪽 여백이 사라지지만, 테이블 외부 목록에서도 사라집니다.

어디에도 여백 없음

사용자 정의 itemize 환경을 생성하면 테이블에서 사용할 수 있습니다.

\newlist{marginlessitemize}{itemize}{1}
\setlist[marginlessitemize]{label=\textbullet,leftmargin=*}

...

% Inside a table cell...
\begin{marginlessitemize}
\item
  Item 1
\item
  Item 2
\end{marginlessitemize}

마진 없음, 예 마진 아웃

작동하지만 TeX가 자동으로 생성되기 때문에 변환된 파일을 수동으로 편집하지 않으면 사용자 정의 환경을 사용할 수 없습니다. 따라서 테이블 내부 목록에 여백을 자동으로 설정하지 않아도 됩니다.

답변1

longtable프리앰블에 배치하면 다음이 작동합니다( 에만 해당 ).

\makeatletter
\let\LT@arraybak\LT@array
\def\LT@array{\setlist[itemize]{leftmargin=*,after=\strut}\LT@arraybak}
\makeatother

MWE 완료:

\documentclass[11pt,article,oneside]{memoir}

\usepackage{longtable}
\usepackage{enumitem}
\makeatletter
\let\LT@arraybak\LT@array
\def\LT@array{\setlist[itemize]{leftmargin=*,after=\strut}\LT@arraybak}
\makeatother



\begin{document}

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

\begin{itemize}
\tightlist
\item
  Item 1
\item
  Item 2
\end{itemize}

\begin{longtable}[]{@{}ll@{}}
\caption{This is a table.}\tabularnewline
\toprule
\begin{minipage}[b]{0.21\columnwidth}\raggedright
Thing
\end{minipage} & \begin{minipage}[b]{0.27\columnwidth}\raggedright
List
\end{minipage}\tabularnewline
\midrule
\endfirsthead
\toprule
\begin{minipage}[b]{0.21\columnwidth}\raggedright
Thing
\end{minipage} & \begin{minipage}[b]{0.27\columnwidth}\raggedright
List
\end{minipage}\tabularnewline
\midrule
\endhead
\begin{minipage}[t]{0.21\columnwidth}\raggedright
Thing 1
\end{minipage} & \begin{minipage}[t]{0.27\columnwidth}\raggedright
\begin{itemize}
\tightlist
\item
  Item 1
\item
  Item 2
\end{itemize}
\end{minipage}\tabularnewline
\begin{minipage}[t]{0.21\columnwidth}\raggedright
Thing 2
\end{minipage} & \begin{minipage}[t]{0.27\columnwidth}\raggedright
\begin{itemize}
\tightlist
\item
  Item 3
\item
  Item 4
\end{itemize}
\end{minipage}\tabularnewline
\bottomrule
\end{longtable}

\end{document}

향상된 간격

간단한 설명: longtable-environment의 시작은 다음과 같이 정의됩니다.

macro:->\par \ifx \multicols \@undefined \else \ifnum \col@number
>\@ne \@twocolumntrue \fi \fi \if@twocolumn \LT@err {longtable not
in 1-column mode}\@ehc \fi \begingroup \@ifnextchar [\LT@array {\LT@array
[x]} 

따라서 일부 항목을 평가한 후 환경 \LT@array을 변경하는 코드를 삽입하는 매크로를 호출하며 구성 itemize내부에 있기 때문에 \begingroup...\endgroup변경 사항은 로컬입니다.

편집: 수직 간격을 개선하기 after=\strut위해 \setlist.

답변2

enumitem다음은 (희망적으로) 및 를 사용한 솔루션입니다 etoolbox. 두 번째와 세 번째 행 사이에 작은 수직 공간을 원하지 않으면 다음 after=\vspace*{\dimexpr1ex-\baselineskip}으로 바꾸십시오 after=vspace*{-\baselineskip}.

\documentclass[11pt, article, oneside]{memoir}%
\usepackage{longtable}
\usepackage{enumitem}

\usepackage{etoolbox}
\AtBeginEnvironment{longtable} {\setlist[itemize]{nosep, wide=0pt, leftmargin=*, before=\vspace*{-\baselineskip}, after=\vspace*{\dimexpr1ex-\baselineskip}}}

\begin{document}

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

\begin{itemize}
\tightlist
\item
  Item 1
\item
  Item 2
\end{itemize}

%%%%%%%%%%%%%%%%%%%%%%
\begin{longtable}{@{}>{\raggedright\arraybackslash}p{0.21\linewidth}>{\raggedright\arraybackslash}p{0.27\linewidth}@{}}%
\caption{This is a table.}\tabularnewline
\toprule
Thing & List
\tabularnewline
\midrule
\endfirsthead
\toprule
Thing & List
\tabularnewline
\midrule
\endhead
Thing 1
 &\begin{itemize}
\item
 Item 1
\item
 Item 2
\end{itemize}
\tabularnewline
Thing 2
 & \begin{itemize}
\item
 Item 3
\item
 Item 4
\end{itemize}
\tabularnewline
\bottomrule
\end{longtable}

\end{document} 

여기에 이미지 설명을 입력하세요

관련 정보