Listenränder nur innerhalb der Tabelle entfernen

Listenränder nur innerhalb der Tabelle entfernen

Ich versuche, itemizeListen zu formatieren, die in tabellarischen Umgebungen (insbesondere in einem longtable) erscheinen. Idealerweise würde ich den linken Rand von Listen entfernen, die in Tabellen erscheinen, während der Rand von Listen außerhalb von Tabellen beibehalten wird.

Hier gibt es bereits mehrere Antworten dazu, wie man das enumitemPaket zum Ändern der Listenränder verwenden kann:Sie können leftmargin=*bestimmte Listen festlegen, oder du kannstErstellen Sie eine neue benutzerdefinierte itemizeUmgebungund verwenden Sie es speziell in Tabellen.

Ich verwende jedoch Pandoc, um Markdown in TeX zu konvertieren, sodass ich keine Kontrolle über die resultierende TeX-Ausgabe habe – ich kann keinen \begin{itemize}[leftmargin=*]benutzerdefinierten Wert hinzufügen oder verwenden \begin{marginlessitemize}. enumitemverfügt über ein \setlistMakro, mit dem Sie Listeneinstellungen global festlegen können, und \setlist[itemize]{leftmargin=*}entfernt den linken Rand aus allen Listen, was nicht ideal ist, da ich nur auf Listen in Tabellen abziele.

Gibt es eine Möglichkeit, sich zu bewerben\setlist{...} nurum Umgebungen aufzulisten, die in tabellarischen Umgebungen verschachtelt sind? In einer perfekten Welt wäre es cool, eine Art Logik in der Präambel zu verwenden: Wenn itemizees sich um eine Tabelle handelt, verwenden Sie keinen Rand, andernfalls verwenden Sie einen Rand.


Hier ist ein MWE …

(Die unordentliche longtableAusgabe stammt aus dieser Markdown-Tabelle, die Pandoc in TeX konvertiert):

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

Diese TeX-Datei…

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

…erzeugt dieses PDF:

Ränder innerhalb und außerhalb der Tabelle

Wenn ich dies der Präambel hinzufüge …

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

…der linke Rand in der Liste innerhalb der Tabelle verschwindet, er verschwindet aber auch in der Liste außerhalb der Tabelle:

Keine Ränder überall

Wenn ich eine benutzerdefinierte Itemize-Umgebung erstelle, kann ich sie in der Tabelle verwenden:

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

...

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

Kein Spielraum rein, aber Spielraum raus

Das funktioniert, aber da TeX automatisch generiert wird, kann ich die benutzerdefinierte Umgebung nicht verwenden, ohne die konvertierte Datei manuell zu bearbeiten. Daher muss irgendwie automatisch kein Rand für Listen in Tabellen festgelegt werden.

Antwort1

Folgendes funktioniert (nur für longtable), wenn Sie es in Ihre Präambel einfügen:

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

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

verbesserte Abstände

Zur kurzen Erklärung: Der Beginn der longtable-Umgebung ist wie folgt definiert:

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

Nach der Auswertung einiger Dinge ruft es das \LT@arrayMakro auf, in das wir unseren Code einfügen, der die Umgebung ändert itemize, und da es sich innerhalb einer \begingroup...\endgroupKonstruktion befindet, sind die vorgenommenen Änderungen lokal.

BEARBEITEN: Um den vertikalen Abstand zu verbessern, habe ich after=\struthinzugefügt \setlist.

Antwort2

Hier ist (hoffentlich) eine Lösung mit enumitemund etoolbox. Wenn Sie den kleinen vertikalen Abstand zwischen der 2. und 3. Reihe nicht möchten, ersetzen Sie ihn after=\vspace*{\dimexpr1ex-\baselineskip}durch 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} 

Bildbeschreibung hier eingeben

verwandte Informationen