僅刪除表格內的清單邊距

僅刪除表格內的清單邊距

我正在嘗試設定itemize表格環境中出現的清單的樣式(特別是在 a 中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

完整的 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}

改善間距

簡短說明:longtable-environment 的開始定義為:

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。如果您不希望第二行和第三行之間有較小的垂直空間,請替換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} 

在此輸入影像描述

相關內容