如何防止分页符并强制命令内部段落缩进?

如何防止分页符并强制命令内部段落缩进?

我正在尝试写一篇关于我过去旅行的日记,但我遇到了段落标识和分页符的问题。我写了以下命令 ( \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}

裁剪页面

相关内容