- if ((style == next_layout
- && !style.parbreak_is_newline
- && style.latextype != LATEX_ITEM_ENVIRONMENT
- && style.latextype != LATEX_LIST_ENVIRONMENT
- && style.align == par.getAlign()
- && nextpar->getDepth() == par.getDepth()
- && nextpar->getAlign() == par.getAlign())
- || (!next_layout.isEnvironment()
- && nextpar->getDepth() > par.getDepth()
- && nextpar->getAlign() == par.getAlign())) {
- os << '\n';
+ // A newline '\n' is always output before a command,
+ // so avoid doubling it.
+ if (!next_layout.isCommand()) {
+ // Here we now try to avoid spurious empty lines by
+ // outputting a paragraph break only if: (case 1) the
+ // paragraph style allows parbreaks and no \begin, \end
+ // or \item tags are going to follow (i.e., if the next
+ // isn't the first or the current isn't the last
+ // paragraph of an environment or itemize) and the
+ // depth and alignment of the following paragraph is
+ // unchanged, or (case 2) the following is a
+ // non-environment paragraph whose depth is increased
+ // but whose alignment is unchanged, or (case 3) the
+ // paragraph is not an environment and the next one is a
+ // non-itemize-like env at lower depth, or (case 4) the
+ // paragraph is a command not followed by an environment
+ // and the alignment of the current and next paragraph
+ // is unchanged, or (case 5) the current alignment is
+ // changed and a standard paragraph follows.
+ DocumentClass const & tclass = bparams.documentClass();
+ if ((style == next_layout
+ && !style.parbreak_is_newline
+ && style.latextype != LATEX_ITEM_ENVIRONMENT
+ && style.latextype != LATEX_LIST_ENVIRONMENT
+ && style.align == par.getAlign()
+ && nextpar->getDepth() == par.getDepth()
+ && nextpar->getAlign() == par.getAlign())
+ || (!next_layout.isEnvironment()
+ && nextpar->getDepth() > par.getDepth()
+ && nextpar->getAlign() == par.getAlign())
+ || (!style.isEnvironment()
+ && next_layout.latextype == LATEX_ENVIRONMENT
+ && nextpar->getDepth() < par.getDepth())
+ || (style.isCommand()
+ && !next_layout.isEnvironment()
+ && style.align == par.getAlign()
+ && next_layout.align == nextpar->getAlign())
+ || (style.align != par.getAlign()
+ && tclass.isDefaultLayout(next_layout))) {
+ os << '\n';
+ }