Estoy intentando diseñar itemize
listas 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 enumitem
paquete para cambiar los márgenes de las listas:puedes configurar leftmargin=*
en listas específicas, o tu puedescrear un nuevo itemize
entorno 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}
. enumitem
tiene una \setlist
macro 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 itemize
está en una tabla, no use margen; de lo contrario utilice un margen.
Aquí hay un MWE...
(El longtable
resultado 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:
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:
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}
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}
Para una breve explicación: el inicio del longtable
entorno 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@array
macro en la que inyectamos nuestro código que altera el itemize
entorno y, como está dentro de una \begingroup...\endgroup
construcción, los cambios realizados son locales.
EDITAR: Para mejorar el espaciado vertical agregué after=\strut
al archivo \setlist
.
Respuesta2
Aquí hay (con suerte) una solución con enumitem
y 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}