如何从命令中删除连续的垂直空格

如何从命令中删除连续的垂直空格

我希望能够编写近似 CSS 行为的宏margin

例如考虑以下情况:

\newcommand{\marginspace}[1]{
  % Defines some combinable margin
  % This is what I'd like to know how to do
  % A naive implementation would just be:
  % \par\vspace{#1}
}

\newcommand{\lorem}{
  \marginspace{\baselineskip}
  Lorem
  \marginspace{\baselineskip}
}

\newcommand{\ipsum}{
  \marginspace{\baselineskip}
  Ipsum
  \marginspace{\baselineskip}
}

那么这个文档:

Foo

\lorem

\ipsum

Bar

将会呈现如下内容:

Foo

Lorem

Ipsum

Bar

一种简单的实现\marginspace就是\par\vspace{#1},但这会在“Lorem”和“Ipsum”之间添加一行,我希望将它们合并在一起:

Foo

Lorem


Ipsum

Bar

如果上面已经有足够的空白,有什么方法可以忽略空白吗?

答案1

我认为您正在寻找\addvspace而不是\vspace,但这可能取决于您究竟要用它做什么。

\documentclass{article}

\newcommand{\marginspace}[1]{%
  \par\addvspace{#1}%
}

\newcommand{\lorem}{%
  \marginspace{\baselineskip}%
  Lorem
  \marginspace{\baselineskip}%
}

\newcommand{\ipsum}{%
  \marginspace{\baselineskip}%
  Ipsum
  \marginspace{\baselineskip}%
}

\begin{document}

Foo

\lorem

\ipsum

Bar

\end{document}

在此处输入图片描述

答案2

如果您的两个宏协同工作……也就是说,如果\lorem知道要注意什么(在这种情况下\ipsum),那么\lorem可以吸收一些参数并对其进行测试\ipsum

\documentclass{article}
\newcommand{\marginspace}[1]{
  \par\vspace{#1}
}
\newcommand{\lorem}[2]{
  \marginspace{\baselineskip}
  Lorem
  \ifx\par#1
    \ifx\ipsum#2\else
      \marginspace{\baselineskip}
    \fi
  \else
    \ifx\ipsum#1\else
      \marginspace{\baselineskip}
    \fi
  \fi
  #1#2%
}
\newcommand{\ipsum}{
  \marginspace{\baselineskip}
  Ipsum
  \marginspace{\baselineskip}
}
\begin{document}
Foo

\lorem

baz

\ipsum

Bar

\hrulefill

Foo

\lorem

\ipsum

Bar

\hrulefill

Foo
\lorem
\ipsum
Bar
\end{document}

在此处输入图片描述

相关内容