\addvspace{x}\noindent … \addvspace{x} 不起作用

\addvspace{x}\noindent … \addvspace{x} 不起作用

的组合\addvspace{x}\addvspace{x}将导致跳过x,但\addvspace{x}\noindent \addvspace{x}会给出 2 次x跳过。

\documentclass{scrartcl}

\newenvironment{env}{%
    \par\addvspace{2\baselineskip}%
    \hspace*{2em}%
    \begin{minipage}{0.5\textwidth}%
}{%
    \end{minipage}%
    \par\addvspace{2\baselineskip}%
    \noindent\ignorespacesafterend%
}

\begin{document}
Line of text Line of text Line of text Line of text and
\begin{env}
--- \verb+env+ ---
\end{env}
no indent here. Line of text Line of text Line of text.

Next par (with indent). Line of text Line of text Line of text.
\begin{env}
--- \verb+env+ ---
\end{env}

Next par (with indent). Line of text Line of text Line of text.

\begin{env}
--- Two \verb+env+s following ---
\end{env}
\begin{env}
--- dont work with \verb+\addvspace+ ---
\end{env}
\end{document}

此示例给出了双倍的空格。如果我注释掉\noindent\ignorespacesafterend%定义中的行{env},则会出现一个空格,这是所需的结果,但随后该行将no indent here ...缩进,我认为这是不正确的。

是否有可能使其{env}表现得像例如{equation}

答案1

开始\noindent一个段落,如果紧接着一个空行,它将是一个空段落,但仍会阻止\addvspace向后查看前一个\addvspace。因此,这不是抑制段落缩进的正确方法。

你应该做的是\@endparenv设置一个布尔开关来发出内部特殊处理的信号\end{...}。即,

\makeatletter
\newenvironment{env}{%
    \par\addvspace{2\baselineskip}%
    \hspace*{2em}%
    \begin{minipage}{0.5\textwidth}%
}{%
    \end{minipage}%
    \par\addvspace{2\baselineskip}%
    \@endpetrue                       % <-- this is needed
}
\makeatother

正如评论中提到的那样,使这种“最终魔法”发挥作用的处理过程得到了很好的解释这里

相关内容