Remover margem da lista apenas dentro da tabela

Remover margem da lista apenas dentro da tabela

Estou tentando estilizar itemizelistas que aparecem em ambientes tabulares (especificamente em a longtable). Idealmente, gostaria de remover a margem esquerda das listas que aparecem nas tabelas, mantendo a margem nas listas fora das tabelas.

Já existem várias respostas aqui sobre como usar o enumitempacote para alterar as margens das listas:você pode definir leftmargin=*listas específicas, ou você podecrie um novo itemizeambiente personalizadoe use-o especificamente dentro de tabelas.

No entanto, estou usando o pandoc para converter Markdown em TeX, portanto não tenho controle sobre a saída resultante do TeX – não posso adicionar \begin{itemize}[leftmargin=*]ou usar um arquivo \begin{marginlessitemize}. enumitempossui uma \setlistmacro que permite definir configurações de lista globalmente e \setlist[itemize]{leftmargin=*}remove a margem esquerda de todas as listas, o que não é o ideal, pois estou apenas tentando direcionar listas dentro de tabelas.

Existe uma maneira de aplicar\setlist{...} apenasdiscriminar ambientes aninhados em ambientes tabulares? Num mundo perfeito, seria legal usar algum tipo de lógica no preâmbulo: se itemizeestiver em uma tabela, não use margem; caso contrário, use uma margem.


Aqui está um MWE…

(A longtablesaída confusa vem desta tabela Markdown, que pandoc converte em TeX):

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

Este arquivo 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}

… gera este PDF:

Margens dentro e fora da mesa

Se eu adicionar isso ao preâmbulo…

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

…a margem esquerda da lista dentro da tabela desaparece, mas também desaparece na lista fora da tabela:

Sem margens em qualquer lugar

Se eu criar um ambiente de itemização personalizado, posso usá-lo na tabela:

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

...

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

Sem margem de entrada, sim, margem de saída

Isso funciona, mas como o TeX é gerado automaticamente, não posso usar o ambiente customizado sem editar manualmente o arquivo convertido. Daí a necessidade de, de alguma forma, definir automaticamente nenhuma margem nas listas dentro das tabelas.

Responder1

O seguinte funciona (apenas para longtable) se você colocá-lo em seu preâmbulo:

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

MWE completo:

\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}

espaçamento melhorado

Para uma breve explicação: O início do longtableambiente é definido como:

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]} 

Então depois de avaliar algumas coisas ele chama a \LT@arraymacro na qual injetamos nosso código que altera o itemizeambiente e por estar dentro de uma \begingroup...\endgroupconstrução as alterações feitas são locais.

EDIT: Para melhorar o espaçamento vertical adicionei after=\strutao arquivo \setlist.

Responder2

Aqui está (espero) uma solução com enumiteme etoolbox. Se você não quiser o pequeno espaço vertical entre a 2ª e a 3ª linha, substitua after=\vspace*{\dimexpr1ex-\baselineskip}por 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} 

insira a descrição da imagem aqui

informação relacionada