在R Markdown中使用enumitem的nosep选项无法消除列表前后间距
问题描述
在纯LaTeX文件中使用enumitem包的nosep选项,可移除列表前后及项间的所有间距,但将相同配置迁移到R Markdown文件后,仅列表项间间距生效,列表与前后文本的间距未改变,与纯LaTeX输出差异明显。
纯LaTeX示例代码:
\documentclass[a4paper]{article} \usepackage{lipsum} \usepackage[shortlabels]{enumitem} \setlist{nosep} \begin{document} \lipsum[11] \begin{enumerate} \item Each $T \in \mathcal{T}$ is either an even face or contains exactly 2 faces in its interior; \item the interiors of distinct $T \in \mathcal{T}$ are disjoint. \end{enumerate} \lipsum[47] \end{document}
R Markdown示例代码:
--- documentclass: article classoption: a4paper output: pdf_document: latex_engine: pdflatex header-includes: - \usepackage{lipsum} - \usepackage[shortlabels]{enumitem} - \setlist{nosep} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE)
\lipsum[11]
\begin{enumerate}
\item Each $T \in \mathcal{T}$ is either an even face or contains exactly 2 faces in its interior;
\item the interiors of distinct $T \in \mathcal{T}$ are disjoint.
\end{enumerate}
\lipsum[47]
# 原因及解决方案 问题出在R Markdown的`pdf_document`输出默认加载了`parskip`包,该包会给段落之间添加额外间距,而`enumitem`的`nosep`选项仅能移除LaTeX原生的列表前后间距(`\topsep`、`\parsep`等),无法抵消`parskip`带来的段落间距。 有两种可行的解决方法: - **方法一:抵消parskip的额外间距** 修改`header-includes`中的`\setlist`命令,添加`before`和`after`参数抵消`parskip`的影响: ```yaml header-includes: - \usepackage{lipsum} - \usepackage[shortlabels]{enumitem} - \setlist{nosep, before=\vspace{-\parskip}, after=\vspace{-\parskip}}
- 方法二:禁用parskip
在YAML的classoption中添加parskip=false,彻底关闭parskip的段落间距设置:
--- documentclass: article classoption: a4paper, parskip=false output: pdf_document: latex_engine: pdflatex header-includes: - \usepackage{lipsum} - \usepackage[shortlabels]{enumitem} - \setlist{nosep} ---
两种方法都能让R Markdown生成的PDF列表间距与纯LaTeX效果一致。
内容的提问来源于stack exchange,提问作者John Stone
相关产品推荐
相关产品推荐

