Eliminar el margen de la lista solo dentro de la tabla

Eliminar el margen de la lista solo dentro de la tabla

Estoy intentando diseñar itemizelistas que aparecen en entornos tabulares (específicamente en a longtable). Idealmente, me gustaría eliminar el margen izquierdo de las listas que aparecen en las tablas y mantener el margen en las listas fuera de las tablas.

Aquí ya hay varias respuestas sobre cómo usar el enumitempaquete para cambiar los márgenes de las listas:puedes configurar leftmargin=*en listas específicas, o tu puedescrear un nuevo itemizeentorno personalizadoy úselo específicamente dentro de las tablas.

Sin embargo, estoy usando pandoc para convertir Markdown a TeX, por lo que no tengo control sobre la salida TeX resultante; no puedo agregar \begin{itemize}[leftmargin=*]ni usar un archivo \begin{marginlessitemize}. enumitemtiene una \setlistmacro que le permite establecer la configuración de la lista globalmente y \setlist[itemize]{leftmargin=*}elimina el margen izquierdo de todas las listas, lo cual no es ideal, ya que solo intento apuntar a listas dentro de tablas.

¿Hay alguna manera de aplicar?\setlist{...} solo¿Detallar entornos que están anidados dentro de entornos tabulares? En un mundo perfecto, sería genial usar algún tipo de lógica en el preámbulo: si itemizeestá en una tabla, no use margen; de lo contrario utilice un margen.


Aquí hay un MWE...

(El longtableresultado desordenado proviene de esta tabla Markdown, que pandoc convierte a TeX):

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

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

…genera este PDF:

Márgenes dentro y fuera de la mesa

Si agrego esto al preámbulo…

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

…el margen izquierdo en la lista dentro de la tabla desaparece, pero también desaparece en la lista fuera de la tabla:

Sin márgenes en ninguna parte

Si creo un entorno detallado personalizado, puedo usarlo en la tabla:

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

...

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

Sin margen de entrada, sí margen de salida

Eso funciona, pero como el TeX se genera automáticamente, no puedo usar el entorno personalizado sin editar manualmente el archivo convertido. De ahí la necesidad de establecer de alguna manera automáticamente ningún margen en las listas dentro de las tablas.

Respuesta1

Lo siguiente funciona (solo para longtable) si lo coloca en su 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}

espaciado mejorado

Para una breve explicación: el inicio del longtableentorno se define 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]} 

Entonces, después de evaluar algunas cosas, llama a la \LT@arraymacro en la que inyectamos nuestro código que altera el itemizeentorno y, como está dentro de una \begingroup...\endgroupconstrucción, los cambios realizados son locales.

EDITAR: Para mejorar el espaciado vertical agregué after=\strutal archivo \setlist.

Respuesta2

Aquí hay (con suerte) una solución con enumitemy etoolbox. Si no desea el pequeño espacio vertical entre la segunda y la tercera fila, reemplácelo after=\vspace*{\dimexpr1ex-\baselineskip}con 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} 

ingrese la descripción de la imagen aquí

información relacionada