我正在嘗試設定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}