我希望能够编写近似 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}