From aaaae562dbac181ab2b9d2caac2d2cf1c8881dab Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Thu, 7 Jan 2021 11:53:35 +0100 Subject: [PATCH] Fix nesting issue in environment-split (#11971) --- src/Text3.cpp | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/Text3.cpp b/src/Text3.cpp index bd6c256448..5e64801a68 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -1645,7 +1645,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) if (para.layout().isEnvironment()) layout = para.layout().name(); depth_type split_depth = cur.paragraph().params().depth(); - depth_type nextpar_depth = 0; + vector nextpars_depth; if (outer || previous) { // check if we have an environment in our scope pit_type pit = cur.pit(); @@ -1670,9 +1670,20 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } } if ((outer || normal) && cur.pit() < cur.lastpit()) { - // save nesting of following paragraph - Paragraph cpar = pars_[cur.pit() + 1]; - nextpar_depth = cpar.params().depth(); + // save nesting of following paragraphs if they are deeper + // or same depth + pit_type offset = 1; + depth_type cur_depth = pars_[cur.pit()].params().depth(); + while (cur.pit() + offset <= cur.lastpit()) { + Paragraph cpar = pars_[cur.pit() + offset]; + depth_type nextpar_depth = cpar.params().depth(); + if (cur_depth <= nextpar_depth) { + nextpars_depth.push_back(nextpar_depth); + cur_depth = nextpar_depth; + ++offset; + } else + break; + } } if (before) cur.top().setPitPos(cur.pit(), 0); @@ -1700,17 +1711,20 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) else lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK, "inverse")); lyx::dispatch(FuncRequest(LFUN_LAYOUT, layout)); - if ((outer || normal) && nextpar_depth > 0) { - // restore nesting of following paragraph + if ((outer || normal) && !nextpars_depth.empty()) { + // restore nesting of following paragraphs DocIterator scur = cur; - depth_type const max_depth = cur.paragraph().params().depth() + 1; - cur.forwardPar(); - while (cur.paragraph().params().depth() < min(nextpar_depth, max_depth)) { - depth_type const olddepth = cur.paragraph().params().depth(); - lyx::dispatch(FuncRequest(LFUN_DEPTH_INCREMENT)); - if (olddepth == cur.paragraph().params().depth()) - // leave loop if no incrementation happens - break; + depth_type max_depth = cur.paragraph().params().depth() + 1; + for (auto nextpar_depth : nextpars_depth) { + cur.forwardPar(); + while (cur.paragraph().params().depth() < min(nextpar_depth, max_depth)) { + depth_type const olddepth = cur.paragraph().params().depth(); + lyx::dispatch(FuncRequest(LFUN_DEPTH_INCREMENT)); + if (olddepth == cur.paragraph().params().depth()) + // leave loop if no incrementation happens + break; + } + max_depth = cur.paragraph().params().depth() + 1; } cur.setCursor(scur); } -- 2.39.2