我在 Latex 中使用 markdown 包(https://ctan.math.utah.edu/ctan/tex-archive/macros/generic/markdown/markdown.pdf)
我的文档包含很多列表(我使用 markdown 的主要动机),我想对它们的呈现方式有更多的控制。主要是,我想在主文本和列表之间添加额外的空白(我使用 tightLists 包选项)
我尝试了两种解决方案:
- 创建一个命令,环绕 markdown 环境并添加空格。这根本不会渲染文本(即仅渲染空格)
\newcommand\md[1]{ \vspace{2mm} \begin{markdown} #1 \end{markdown} \vspace{2mm} } \md{Hello world} % renders no text, only white space
2.重新定义渲染列表的 markdown 包命令。这可行,但会在嵌套列表中的项目之间产生额外的空间——我只希望最外层的块中有空格。
\newcommand\listspace{\vspace{2mm}}
\renewcommand\markdownRendererOlBeginTight{%
\listspace%
\markdownRendererOlBeginTightPrototype%
}%
\renewcommand\markdownRendererOlEndTight{%
\markdownRendererOlEndTightPrototype%
\listspace%
}%
\renewcommand\markdownRendererUlBeginTight{%
\listspace%
\markdownRendererUlBeginTightPrototype%
}%
\renewcommand\markdownRendererUlEndTight{%
\markdownRendererUlEndTightPrototype%
\listspace%
}%
答案1
这是实现您想要的一种方法。诀窍是在嵌套列表时更改渲染器的定义:
- 我们从名为 的定义开始
outer
。 top-inner
我们切换到以顶级列表的开头命名的定义。inner
我们切换到以二级列表的开头命名的定义。
\begingroup
当我们从嵌套列表中向上冒泡时,我们将通过用和括住列表来自动恢复以前的定义\endgroup
。
\documentclass{article}
\usepackage{markdown}
\newcommand\listspace{\vspace{2mm}}
% The default top-level definitions
\markdownSetupSnippet{outer}{
renderers = {
ulBeginTight = {%
\listspace
\markdownRendererUlBeginTightPrototype
\begingroup
\markdownSetup{snippet = top-inner}
},
olBeginTight = {
\listspace
\markdownRendererOlBeginTightPrototype
\begingroup
\markdownSetup{snippet = top-inner}
},
},
}
% Definitions after the beginning of the top-level list
\markdownSetupSnippet{top-inner}{
renderers = {
ulBeginTight = {%
\markdownRendererUlBeginTightPrototype
\begingroup
\markdownSetup{snippet = inner}
},
olBeginTight = {%
\markdownRendererOlBeginTightPrototype
\begingroup
\markdownSetup{snippet = inner}
},
ulEndTight = {%
\endgroup
\markdownRendererUlEndTightPrototype
\listspace
},
olEndTight = {%
\endgroup
\markdownRendererOlEndTightPrototype
\listspace
},
},
}
% Definitions after the beginning of the second-level list
\markdownSetupSnippet{inner}{
renderers = {
ulBeginTight = {%
\markdownRendererUlBeginTightPrototype
\begingroup
},
olBeginTight = {%
\markdownRendererOlBeginTightPrototype
\begingroup
},
ulEndTight = {%
\endgroup
\markdownRendererUlEndTightPrototype
},
olEndTight = {%
\endgroup
\markdownRendererOlEndTightPrototype
},
},
}
\markdownSetup{
tightLists = true,
hashEnumerators = true,
snippet = outer,
}
\begin{document}
\begin{markdown}
some text
- first item
- second item
- nested first item
- nested second item
- doubly nested item
- third item
#. first item
#. second item
#. nested first item
#. nested second item
#. doubly nested item
#. third item
some more text
\end{markdown}
\end{document}
Markdown 包将这些命名定义称为片段它们是 Markdown 2.10.0 (2021-08-06) 版本的一部分,另请参阅我的 TUGboat 文章介绍了一些片段。
在 2.10.0 版本之前,您必须嵌套\markdownSetup
s(或\renewcommand
s),这对于人类来说可能有点难以阅读和书写。此外,您无法命名不同的定义集,这会失去记录您的意图的机会。
答案2
您可以重新定义\markdownRendererUlBeginTight
和markdownRendererUlEndTight
以包含一些额外空间。这与您自己的方法类似,但仅影响列表的开始和结束。
MWE 显示差异:
\documentclass{article}
\usepackage[tightLists=true]{markdown}
\begin{document}
some text
\begin{markdown}
- list first item
- list second item
- list third item
\end{markdown}
some more text\\[5mm]
\def\markdownRendererUlBeginTight{\vspace{5mm}\begin{compactitem}}
\def\markdownRendererUlEndTight{\end{compactitem}\vspace{5mm}}
% and similar for ordered lists
some text
\begin{markdown}
- list first item
- list second item
- list third item
\end{markdown}
some more text
\end{document}
请注意,在实际文档中,您应该将重新定义放在序言中:
\documentclass{article}
\usepackage[tightLists=true]{markdown}
\def\markdownRendererUlBeginTight{\vspace{5mm}\begin{compactitem}}
\def\markdownRendererUlEndTight{\end{compactitem}\vspace{5mm}}
\begin{document}
[...]
并排视图显示与常规tightLists
选项相比,这不会在项目之间添加额外的空间: