如何在环境前后插入一段代码?

如何在环境前后插入一段代码?

举个例子,如何使用减少垂直空间itemize

  1. \addtolength{\itemsep}{-0.5em}我可以在每个项目的开头插入代码:

  2. 我可以定义并使用新环境:

    \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到你的序言中,然后根据你的需要进行更改。下面是一个示例,说明了文档中间的更改:

enter image description here

\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,然后插入内容:

enter image description here

\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

enter image description here

\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},因此如果其中有多个\fis就会出现问题\itemize(比如说)。

最后,您可以使用可扩展的方法enumitem包裹

enter image description here

\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但低于显示方程。

有关更多信息,请参阅

相关内容