我正在尝试写一篇关于我过去旅行的日记,但我遇到了段落标识和分页符的问题。我写了以下命令 ( \EntradaDiario
)
\newcommand{\Separador}{
{\noindent\begin{center}
$\ast~\ast$
\end{center}}
}
\newcommand{\EntradaDiario}[7]{
%% Header section -----------------------------------------------------------------
{\footnotesize \mbox{\textit{#6} : #2 $\xrightarrow{#3~\text{km.}}$
#5.}\hfill\makebox[1.6cm][r]{\textit{#4~km.}}}
% <-------- Page breaks allowed here?
%% Body of the diary for one day: -------------------------------------------------
\textbf{#1~}$\rightarrowtail$~#7
\Separador
}
使用时,结果如下:
\EntradaDiario{Title}{Location1}{10}{20}{Location2}{Date}{\lipsum[1]}
我确实希望标题和正文部分的第一行没有缩进,而其余文本(即使有几个段落)必须缩进。我的问题是标题和正文部分之间的换行符会导致分页,我想避免这种情况。防止此行为的最佳方法是什么?
另外,我怎样才能强制正文部分(实际文本)内的新段落也使第一行具有与其余文本相同的缩进?
答案1
我用xgalley
在下面的示例中格式化页面布局。
为了将“标题”和“正文第一行”放在一起,我使用needspace
,要求至少有2\baselineskip
。您可能需要稍微更改这一点,具体取决于您的布局以及 的高度如何\xrightarrow
垂直跨越,但原则是正确的。
\documentclass{article}
\usepackage{xgalley,amsmath,amssymb,needspace}
\usepackage{lipsum,geometry}% Just for this example
\geometry{showframe,paperheight=25\baselineskip}
% http://river-valley.zeeba.tv/media/conferences/tug-2015/0302-Joseph-Wright/
\ExplSyntaxOn
\cs_new_eq:NN \SetAbsMargins \galley_margins_set_absolute:nn % left, right
\cs_new_eq:NN \SetRelMargins \galley_margins_set_relative:nn % left, right
\cs_new_eq:NN \SetAllShape \galley_parshape_set_multi:nnnN % Normal, left, right, resume
\cs_new_eq:NN \SetOneShape \galley_parshape_set_single:nnnN % Normal, left, right, resume
\cs_new_eq:NN \CutoutLeft \galley_cutout_left:nn % Normal, indents
\cs_new_eq:NN \CutoutRight \galley_cutout_right:nn % Normal, indents
\cs_new_eq:NN \True \c_true_bool
\cs_new_eq:NN \False \c_false_bool
\ExplSyntaxOff
\newcommand{\Separador}{%
\noindent\hfill$\ast~\ast$\hfill\mbox{}%
}
\newenvironment{EntradaDiario}[6]{{%
\par
\Needspace{2\baselineskip}
\hspace*{-3em}% Indent into margin
%% Header section -----------------------------------------------------------------
{\footnotesize \mbox{\textit{#6} : #2 $\xrightarrow{#3~\text{km.}}$
#5.}\hfill\makebox[1.6cm][r]{\textit{#4~km.}}}
\par\nobreak
%% Body of the diary for one day: -------------------------------------------------
\hspace*{-3em}\textbf{#1~}$\rightarrowtail$~\ignorespaces
}}{\unskip\par\nobreak\Separador\par\medskip}
\setlength{\parindent}{0pt}
\AtBeginDocument{%
\SetAbsMargins{3em}{0pt}
}
\begin{document}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[7]
\end{EntradaDiario}
\end{document}
您还会看到我已将其转换EntradaDiaro
为环境而不是宏。这更有意义,因为它可能包含(多)段落文本。
答案2
这是一个相对无包的方法。通过用一个大的支柱覆盖前三行,可以防止三行分页。我不知道它是如何needspace
工作的,但已经使用这个技巧有一段时间了。
悬挂缩进是使用\leftskip
负号\hspace
(\hangindent
仅影响一个段落)实现的。出于与 Werner 相同的原因,我将其更改为环境。我进行了简化,\Separador
只是为了将其放入一行中。
\documentclass{article}
\usepackage{showframe}
\usepackage{amsmath,amssymb}
\usepackage{lipsum}
\newcommand{\Separador}{\par\noindent\hfil{$\ast~\ast$}\par}
\newenvironment{EntradaDiario}[6]{\par\rule{0pt}{3\baselineskip}\vspace{-3\baselineskip}\newline
\leftskip=\bibindent
\hspace*{-\leftskip}%
%% Header section -----------------------------------------------------------------
{\footnotesize\mbox{\textit{#6} : #2 $\xrightarrow{#3~\text{km.}}$
#5.}\hfill\makebox[1.6cm][r]{\textit{#4~km.}}}\linebreak
%% Body of the diary for one day: -------------------------------------------------
\hspace*{-\leftskip}\textbf{#1~}$\rightarrowtail$~\ignorespaces}
{\Separador}
\begin{document}
\rule{1pt}{43\baselineskip}\par% test page breaking
\begin{EntradaDiario}{Title}{Location1}{10}{20}{Location2}{Date}
\lipsum[1-2]
\end{EntradaDiario}
\end{document}