我想根据我定义的自定义命令来操作垂直空间。我该怎么做?
(这么多年我其实从未研究过这个问题……)
图片
平均能量损失
\documentclass{scrartcl}
\usepackage{
setspace,
lipsum
}
\newcommand{\something}[1]{\begin{flushleft}\large\sffamily{#1}\end{flushleft}}
\begin{document}
\onehalfspacing
\lipsum[1]
\something{Words}
\lipsum[2]
\end{document}
解决方案
\makeatletter
\newcommand{\something}[1]{%
\par\addvspace{\topsep}%
\noindent\begingroup\raggedright\sffamily#1\par\nobreak\addvspace{0.15\baselineskip}\endgroup
\@afterheading\@afterindentfalse
}
答案1
您不想使用flushright
,而只是\raggedright
;而且您还缺少一个\nopagebreak
。
\documentclass{scrartcl}
\usepackage{lipsum}
\newcommand{\something}[1]{%
\par\addvspace{\topsep}%
\noindent\begingroup\raggedright\sffamily#1\par\endgroup
\nopagebreak
\noindent\ignorespaces
}
\begin{document}
\lipsum[1]
\something{Words}
\lipsum[2]
\end{document}
不要在\something{...}
和后面的文本之间留下任何空行。
我删除了它,\onehalfspacing
因为它违背了我的宗教信仰。;-)
如果你真的要破坏你的文档,那就添加它。;-)
\something{...}
一个可能更好的解决方案是,在使用节标题后使用的内部构件之后,还允许出现空行。
\documentclass{scrartcl}
\usepackage{lipsum}
\makeatletter
\newcommand{\something}[1]{%
\par\addvspace{\topsep}%
\noindent\begingroup\raggedright\sffamily#1\par\nobreak\endgroup
\@afterheading\@afterindentfalse
}
\makeatother
\begin{document}
\lipsum[1]
\something{Words}
\lipsum[2]
\end{document}
答案2
flushleft
定义为trivlist
,因此它使用topsep
、\partopsep
和\parskip
长度(添加!)作为到下一个文本内容的顶部和底部间距。为了减少下面的间距,最好将此弹性长度设置为0pt
一对以内\begingroup...\endgroup
,但\vspace{\topsep}
在之前发出,以便与上面的文本保持一定的距离。
\documentclass{scrartcl}
\usepackage{setspace,
lipsum%
}
\newcommand{\something}[1]{\begingroup
\vspace{\topsep}% Use the old top distance
\setlength\partopsep{0pt}\setlength\topsep{0pt}\setlength\parskip{0pt}% Set the top seps to zero
\begin{flushleft}\large\sffamily{#1}%
\end{flushleft}\endgroup%
}%
\begin{document}
\onehalfspacing
\lipsum[1]
\something{Words}
\lipsum[2]
\something{Other Words}
\lipsum[3]
\end{document}