两次尝试均未成功

两次尝试均未成功

两次尝试均未成功

这里有 2 个不起作用的例子。每次尝试都写在上面% Not works

\PassOptionsToPackage{brazil,main=english}{babel}
\documentclass[10pt,a5paper,twoside]{abntex2}
\pdfstringdefDisableCommands{\let\uppercase\relax}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage[
style=abnt,
language=english,
backref=true,
backend=biber,
citecounter=true
]{biblatex}
\addbibresource{references.bib}
\usepackage{csquotes}

\makeatletter 
\let\orig@listi\@listi
\def\@listi{\orig@listi\topsep=0pt} % Not works
\makeatother

\begin{document}

    Test
    \begin{citacao}\setlength{\topsep}{0pt} % Not works
        Test
    \end{citacao}
    Test

\end{document}

环境citacao实现于:

  1. https://github.com/abntex/abntex2/blob/8f2109ac2ef986b15d97d0bfc489b251918f1761/tex/latex/abntex2/abntex2.cls#L961-L978

    \newenvironment*{citacao}[1][default]{%
       \list{}%
       \ABNTEXfontereduzida%
       \addtolength{\leftskip}{\ABNTEXcitacaorecuo}%
       \item[]%
       \begin{SingleSpace}%
       \ifthenelse{\not\equal{#1}{default}}{\itshape\selectlanguage{#1}}{}%
     }{%
       \end{SingleSpace}%
       \endlist}%
    % ---
    

两次尝试均成功

这里有两个确实有效的例子。第一个是通过更新环境,另一个是通过在我的计算机上打开 abntex2 文件并更改实现。

  1. 我可以改变其实现,添加{\topsep=0pt}如下内容:

    \newenvironment*{citacao}[1][default]{%
       \list{}{\topsep=0pt}%
       \ABNTEXfontereduzida%
       \addtolength{\leftskip}{\ABNTEXcitacaorecuo}%
       \item[]%
       \begin{SingleSpace}%
       \ifthenelse{\not\equal{#1}{default}}{\itshape\selectlanguage{#1}}{}%
     }{%
       \end{SingleSpace}%
       \endlist}%
    
  2. 或者在我的文档中更新环境,如下所示:

    \renewenvironment*{citacao}[1][default]{%
       \list{}{\topsep=0pt}%
       \ABNTEXfontereduzida%
       \addtolength{\leftskip}{\ABNTEXcitacaorecuo}%
       \item[]%
       \begin{SingleSpace}%
       \ifthenelse{\not\equal{#1}{default}}{\itshape\selectlanguage{#1}}{}%
     }{%
       \end{SingleSpace}%
       \endlist}%
    

问题

但我不想完全复制他们的实现,也不想做一个添加的拉取请求{\topsep=0pt}。我可以做类似下面的事情来修补环境吗?

\pretocmd{\citacao}{\let\oldtopsep\topsep \setlength{\topsep}{0pt}}{}{}
\xapptocmd{\citacaoend}{\let\topsep\oldtopsep}{}{}

为什么这不在帖子开头的代码中?

因为我无法通过手动添加来使它工作,\setlength{\topsep}{0pt}所以xpatch如果我不知道如何修补,加载将无济于事。 这些都不起作用:

% First attempt
\makeatletter 
\let\orig@listi\@listi
\def\@listi{\orig@listi\topsep=0pt} % Not works
\makeatother

...
    % Second attempt
    \begin{citacao}\setlength{\topsep}{0pt} % Not works
        Test
    \end{citacao}

相关问题:

  1. 在没有包的列表中更改 \topsep
  2. 在自定义环境周围添加垂直空间(\vspace)
  3. \topsep、\itemsep、\partopsep 和 \parsep - 它们各自代表什么意思(底部又代表什么意思)?

答案1

不仅\topsep在标准列表环境(itemize、enumerate、description)中设置是硬编码的,而且从这样的环境内部来纠正顶部使用为时已晚,并且更改\topsep不会影响底部使用。

假设不能直接定制\list用法,可以尝试这样做:

\documentclass{article}

\usepackage{color}
\begin{document}

\setlength{\topsep}{40pt}% useless

BEFORE

\begin{itemize}
\item \the\topsep
\item A
\item B
\item C
\end{itemize}

AFTER

\color{blue}

BEFORE

\begin{itemize}\kern-\topsep
\makeatletter\advance\@topsepadd-\topsep\makeatother
\item \the\topsep
\item A
\item B
\item C
\end{itemize}

AFTER

\end{document}

在此处输入图片描述

相关内容