Удалить поле списка только внутри таблицы

Удалить поле списка только внутри таблицы

Я пытаюсь стилизовать itemizeсписки, которые появляются в табличных средах (в частности в longtable). В идеале я хотел бы удалить левое поле из списков, которые появляются в таблицах, сохранив поле для списков вне таблиц.

Здесь уже есть несколько ответов о том, как использовать enumitemпакет для изменения полей списков:вы можете установить leftmargin=*в определенных списках, или вы можетесоздать новую пользовательскую itemizeсредуи используйте его именно внутри таблиц.

Однако я использую pandoc для преобразования Markdown в TeX, поэтому у меня нет контроля над конечным выводом TeX — я не могу добавить \begin{itemize}[leftmargin=*]или использовать пользовательский \begin{marginlessitemize}. enumitemимеет \setlistмакрос, который позволяет вам задавать глобальные настройки списка и \setlist[itemize]{leftmargin=*}удаляет левое поле из всех списков, что не идеально, поскольку я пытаюсь работать только со списками внутри таблиц.

Есть ли способ подать заявку?\setlist{...} толькодля перечисления сред, вложенных в табличные среды? В идеальном мире было бы здорово использовать какую-то логику в преамбуле: если itemizeнаходится в таблице, не использовать поле; в противном случае использовать поле.


Вот MWE…

(Неразборчивый longtableвывод получается из этой таблицы Markdown, которую pandoc преобразует в TeX):

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

Этот файл 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}

…создает этот PDF-файл:

Поля в таблице и за ее пределами

Если я добавлю это в преамбулу…

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

…левое поле в списке внутри таблицы исчезает, но оно также исчезает и в списке за пределами таблицы:

Никаких полей нигде

Если я создам пользовательскую среду детализации, я смогу использовать ее в таблице:

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

...

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

Нет входной маржи, есть выходная маржа

Это работает, но поскольку TeX генерируется автоматически, я не могу использовать пользовательскую среду без ручного редактирования преобразованного файла. Отсюда и необходимость каким-то образом автоматически устанавливать отсутствие полей для списков внутри таблиц.

решение1

Следующий код работает (только для longtable), если вы поместите его в преамбулу:

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

Полная МВЭ:

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

улучшенный интервал

Короткое пояснение: начало -окружения longtableопределяется как:

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

Итак, после оценки некоторых данных он вызывает макрос \LT@array, в который мы внедряем наш код, изменяющий itemizeсреду, и поскольку он находится внутри \begingroup...\endgroupконструкции, внесенные изменения являются локальными.

ПРАВКА: Чтобы улучшить вертикальный интервал, я добавил after=\strutк \setlist.

решение2

Вот (надеюсь) решение с enumitemи etoolbox. Если вам не нужен небольшой вертикальный промежуток между 2-й и 3-й строкой, замените after=\vspace*{\dimexpr1ex-\baselineskip}на 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} 

введите описание изображения здесь

Связанный контент