我正在尝试为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=*}
...表格内列表的左边距消失了,但表格外列表的左边距也消失了:
如果我创建自定义 itemize 环境,我可以在表中使用它:
\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
定义为:
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}