我创建了一个宏来插入类似日记的右对齐段落。
\newcommand{\diarydate}[1]{\begin{flushright}\textit{#1}\end{flushright}}
例子:
\diarydate{New York, August 1992}
这在页面顶部看起来不错,但如果前面有一个段落,那就不行了。因此,如果日记日期文本位于两个段落之间,我想在它前面添加垂直间距,但如果它位于页面顶部或标题之后,则不需要。
是否有一个简单的命令或宏可以涵盖所有这些用例?
答案1
您需要使用分段命令,以确保日记日期和以下文本之间不会出现分页符。例如
\documentclass{article}
\usepackage[pass,showframe]{geometry} % to show the page frame
\usepackage{lipsum}
\makeatletter
\newcounter{diary} % to keep LaTeX happy
\newcommand{\diarymark}[1]{} % ditto
\newcommand\diarydate{%
\@startsection{diary}%
{10}% level for secnumdepth and tocdepth
{\z@}% indentation
{\topsep}% space before
{\topsep}% space below
{\raggedleft\normalfont\itshape}% format of the text
}
\makeatother
\begin{document}
\lipsum[2]
\diarydate{New York, August 1992}
\lipsum[2]
\section{A section}
\diarydate{New York, August 1992}
\lipsum[2]
\section{B section}
\lipsum[2]
\newpage
\diarydate{New York, August 1992}
\lipsum[2]
\end{document}
\section
后跟的空格\diarydate
与节标题和普通文本之间的空格相同。
如果你将“空格前”行改为
{-\topsep}% space before
之后的第一行将\diarydate
不会缩进。我使用它\topsep
作为 使用的垂直空间flushright
。
以下是图片。
第一页
第二页
如果您确实想抑制标题后的垂直间距,可以分两步进行:
\makeatletter
\newcounter{diary} % to keep LaTeX happy
\newcommand{\diarymark}[1]{} % ditto
\newcommand\@diarydate{%
\@startsection{diary}%
{10}%
{\z@}%
{\topsep}%
{\topsep}%
{\raggedleft\normalfont\itshape}%
}
\newcommand{\diarydate}{%
\par % ensure vertical mode
\if@nobreak % we're after a heading
\vskip-\lastskip % suppress the space added by the heading
\vskip-\topsep % suppress the space added by \@diarydate
\fi
\@diarydate}
\makeatother
\diarydate
并像以前一样使用。