如何使用 everypar 和 vspace 将每个段落的第一行上移?

如何使用 everypar 和 vspace 将每个段落的第一行上移?

我正在尝试修改https://tex.stackexchange.com/a/399944/2066调整没有紧跟其他节标题的节标题后的间距。但是,如果我在该答案中替换为\hrule\vspace{1ex}\vspace{-\baselineskip}则使用代码

\documentclass{article}
\usepackage{lipsum}
\makeatletter
\def\@afterheading{%
  \@nobreaktrue
  \everypar{%
    \if@nobreak
    \@nobreakfalse
    \clubpenalty \@M
    \if@afterindent \else
                    {\setbox\z@\lastbox
                      \vspace{-\baselineskip}%
                    }%
                    \fi
                    \else
                    \clubpenalty \@clubpenalty
                    \everypar{}%
                    \fi}}
\makeatother
\begin{document}
\section{Test}

\subsection{Sub Test}
\lipsum[4]

\subsection{Sub Test}
\lipsum[4]


\section{Test}

\subsection{Sub Test}
\lipsum[4]


\section{Test}
\lipsum[4]
\subsection{Sub Test}

\section[optional]{Test}
\subsection[optional]{Sub Test}
\lipsum[4]

\section{blblblb}
\lipsum[4]

\end{document}

我得到了非常丑陋

在此处输入图片描述

如何使段落的第一行向上移动,而不是第二行?

答案1

您正在段落第一行后添加负空间,您需要退出水平模式以\par在第一行之前添加负空间,但随后请注意需要对“真实”段落重新进行缩进抑制。

因此,这可以达到预期目的,尽管挂钩到缩进后测试只是对后续节头进行测试的一个非常松散的近似,所以这并不适用于所有情况。

在此处输入图片描述

\documentclass{article}
\usepackage{lipsum}
\makeatletter
\def\@afterheading{%
  \@nobreaktrue
  \everypar{%
    \if@nobreak
    \@nobreakfalse
    \clubpenalty \@M
    \if@afterindent \else
                    {\setbox\z@\lastbox
                      \par\vspace{-\baselineskip}\noindent
                    }%
                    \fi
                    \else
                    \clubpenalty \@clubpenalty
                    \everypar{}%
                    \fi}}
\makeatother
\begin{document}
\section{Test}

\subsection{Sub Test}
\lipsum[4]

\subsection{Sub Test}
\lipsum[4]


\section{Test}

\subsection{Sub Test}
\lipsum[4]


\section{Test}
\lipsum[4]
\subsection{Sub Test}

\section[optional]{Test}
\subsection[optional]{Sub Test}
\lipsum[4]

\section{blblblb}
\lipsum[4]

\end{document}

相关内容