Ich versuche, itemize
Listen 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 enumitem
Paket zum Ändern der Listenränder verwenden kann:Sie können leftmargin=*
bestimmte Listen festlegen, oder du kannstErstellen Sie eine neue benutzerdefinierte itemize
Umgebungund 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}
. enumitem
verfügt über ein \setlist
Makro, 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 itemize
es sich um eine Tabelle handelt, verwenden Sie keinen Rand, andernfalls verwenden Sie einen Rand.
Hier ist ein MWE …
(Die unordentliche longtable
Ausgabe 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:
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:
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}
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}
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@array
Makro auf, in das wir unseren Code einfügen, der die Umgebung ändert itemize
, und da es sich innerhalb einer \begingroup...\endgroup
Konstruktion befindet, sind die vorgenommenen Änderungen lokal.
BEARBEITEN: Um den vertikalen Abstand zu verbessern, habe ich after=\strut
hinzugefügt \setlist
.
Antwort2
Hier ist (hoffentlich) eine Lösung mit enumitem
und 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}