举个例子,如何使用减少垂直空间itemize
?
\addtolength{\itemsep}{-0.5em}
我可以在每个项目的开头插入代码:我可以定义并使用新环境:
\newenvironment{myItemize}{ \begin{itemize} \addtolength{\itemsep}{-0.5em} }{ \end{itemize} }
myItemize
但是如果不替换全部,我该如何调用呢itemize
?
\vspace{-0.5em}
我想对插入开始和结束环境的方程式做同样的事情equation
。
答案1
有多种方法可以实现这一点。首先,通过重新定义itemize
工作方式。为此,让我们看看itemize
环境是什么样子的(从 LaTeX 内核开始,latex.ltx
):
\def\itemize{%
\ifnum \@itemdepth >\thr@@\@toodeep\else
\advance\@itemdepth\@ne
\edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
\expandafter
\list
\csname\@itemitem\endcsname
{\def\makelabel##1{\hss\llap{##1}}}%
\fi}
\let\enditemize =\endlist
注意
\begin{itemize}
<your list of items>
\end{itemize}
大致翻译为
\begingroup
\itemize
<your list of items>
\enditemize
\endgroup
因此,你可以将 的定义复制\itemize
到你的序言中,然后根据你的需要进行更改。下面是一个示例,说明了文档中间的更改:
\documentclass{article}
\begin{document}
\begin{itemize}
\item First
\item Second
\item Third
\item Last
\end{itemize}
% Redefine \itemize (\def will overwrite the definition)
\makeatletter
\def\itemize{%
\ifnum \@itemdepth >\thr@@\@toodeep\else
\advance\@itemdepth\@ne
\edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
\expandafter
\list
\csname\@itemitem\endcsname
{\def\makelabel##1{\hss\llap{##1}}%
\addtolength{\itemsep}{-0.5em}}% <- Added changes...
\fi}
\makeatother
\begin{itemize}
\item First
\item Second
\item Third
\item Last
\end{itemize}
\end{document}
另一种方法是将 的定义复制\itemize
到不同的宏(比如\tempitemize
)中,然后重新定义\itemize
为调用\tempitemize
,然后插入内容:
\documentclass{article}
\begin{document}
\begin{itemize}
\item First
\item Second
\item Third
\item Last
\end{itemize}
% Copy and redefine \itemize
\let\tempitemize\itemize % Store/copy \itemize in \tempitemize
\def\itemize{%
\tempitemize % Original definition of \itemize
\addtolength{\itemsep}{-0.5em}% <- Added changes...
}
\begin{itemize}
\item First
\item Second
\item Third
\item Last
\end{itemize}
\end{document}
重新定义稍微简单一些,但依赖于插入发生的事实后的(完整)执行\itemize
。
也许你不想在那个层面上摆弄东西。也许,你可以\itemize
使用搜索和替换功能进行修改etoolbox
的\patchcmd
。
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\begin{itemize}
\item First
\item Second
\item Third
\item Last
\end{itemize}
% Patch \itemize to insert some code
% \patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
\patchcmd{\itemize} % <cmd>
{\fi} % <search>
{\addtolength{\itemsep}{-0.5em}\fi} % <replace>
{}{} % <success><failure>
\begin{itemize}
\item First
\item Second
\item Third
\item Last
\end{itemize}
\end{document}
上述补丁类似于\itemize
将 的原始定义更改为:
\def\itemize{%
\ifnum \@itemdepth >\thr@@\@toodeep\else
\advance\@itemdepth\@ne
\edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
\expandafter
\list
\csname\@itemitem\endcsname
{\def\makelabel##1{\hss\llap{##1}}}%
\addtolength{\itemsep}{-0.5em}% <- Added changes...
\fi}
虽然这与第一个和第二个选项略有不同,但结果是一样的。此解决方案依赖于您知道要修补的命令的结构。也就是说,\fi
必须在内\itemize
才能使补丁起作用,否则什么也不会发生。此外,第一的的出现\fi
以 为前缀\addtolength{\itemsep}{-0.5em}
,因此如果其中有多个\fi
s就会出现问题\itemize
(比如说)。
最后,您可以使用可扩展的方法enumitem
包裹:
\documentclass{article}
\usepackage{enumitem}
\begin{document}
\begin{itemize}
\item First
\item Second
\item Third
\item Last
\end{itemize}
\setlist[itemize]{before = {\addtolength{\itemsep}{-0.5em}}}
\begin{itemize}
\item First
\item Second
\item Third
\item Last
\end{itemize}
\end{document}
当然,你也可以\itemsep
使用itemsep = <value>
键值方法指定一个新值
\setlist[itemize]{itemsep = <value>}
equation
请注意,通过调整以下值可以更好地插入此前/后环境:
\abovedisplayskip
- 在显示方程式上方显示长度,该方程式前面有一行短文本;\abovedisplayshortskip
- 在显示方程式上方显示一长行文本的长度;\belowdisplayskip
- 与显示方程类似\abovedisplayskip
,但低于显示方程;\belowdisplayshortskip
- 与显示方程类似,\abovedisplayshortskip
但低于显示方程。
有关更多信息,请参阅