From 12bd7352fd3981798ede56082afbcc07f1f21e3a Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Mon, 1 Jan 2018 12:27:08 +0100 Subject: [PATCH] Implement auto-nesting. Now layouts can specify other layouts that should be nested in and after the current one (if the layout is switched from the current one and if it follows a paragraph in the current one). This is particularly useful for things such as the beamer frames, where particular layouts are practically always nested. This is a backport from master, including all fixes. --- lib/doc/Customization.lyx | 115 +++++++++++++++++++++++++++++- lib/doc/de/Customization.lyx | 75 ++++++++++++++++++++ lib/doc/es/Customization.lyx | 131 ++++++++++++++++++++++++++++++++++- lib/doc/fr/Customization.lyx | 131 ++++++++++++++++++++++++++++++++++- lib/doc/ja/Customization.lyx | 129 ++++++++++++++++++++++++++++++++++ lib/layouts/beamer.layout | 20 +++++- lib/scripts/layout2layout.py | 11 ++- src/Layout.cpp | 48 +++++++++++++ src/Layout.h | 8 +++ src/LyXAction.cpp | 5 +- src/Text3.cpp | 18 ++++- src/TextClass.cpp | 2 +- 12 files changed, 682 insertions(+), 11 deletions(-) diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx index 02f3d92d20..462a374e19 100644 --- a/lib/doc/Customization.lyx +++ b/lib/doc/Customization.lyx @@ -124,11 +124,12 @@ logicalmkup \papercolumns 1 \papersides 2 \paperpagestyle headings -\tracking_changes false +\tracking_changes true \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict true +\author -712698321 "Jürgen Spitzmüller" \end_header \begin_body @@ -12160,6 +12161,61 @@ Argument item:1 \end_layout \end_deeper +\begin_layout Description + +\change_inserted -712698321 1514539256 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514534780 +AutoNests +\end_layout + +\end_inset + + Includes a comma-separated list of layout names that should be nested in + and after the current one. + Only makes sense for nestable layouts (such as environments). + Must be ended by +\begin_inset Quotes eld +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514538124 +EndAutoNests +\end_layout + +\end_inset + + +\begin_inset Quotes erd +\end_inset + +. + See also +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514539161 +IsAutoNestedBy +\change_unchanged + +\end_layout + +\end_inset + +. +\end_layout + \begin_layout Description \begin_inset Flex Code status collapsed @@ -12889,6 +12945,63 @@ TitleLatexName \end_inset global entries). +\change_inserted -712698321 1514539171 + +\end_layout + +\begin_layout Description + +\change_inserted -712698321 1514539282 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514539190 +IsAutoNestedBy +\end_layout + +\end_inset + + Includes a comma-separated list of layout names after which this one should + be nested. + Only makes sense with regard to nestable layouts (such as environments). + Must be ended by +\begin_inset Quotes eld +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514539279 +EndIsAutoNestedBy +\end_layout + +\end_inset + + +\begin_inset Quotes erd +\end_inset + +. + See also +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710776 +AutoNests +\end_layout + +\end_inset + +. +\change_unchanged + \end_layout \begin_layout Description diff --git a/lib/doc/de/Customization.lyx b/lib/doc/de/Customization.lyx index ff2d570194..08ae129f9a 100644 --- a/lib/doc/de/Customization.lyx +++ b/lib/doc/de/Customization.lyx @@ -10615,6 +10615,43 @@ Argument item:1 \begin_inset Flex Code status collapsed +\begin_layout Plain Layout +AutoNests +\end_layout + +\end_inset + + beinhaltet eine mit Kommata separierte Liste von Layoutnamen, welche in + und nach der aktuellen automatisch eingebettet werden sollen. + Dies ist nur für Layouts sinnvoll, die auch einbetten können (etwa Umgebungen). + Muss mit +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +EndAutoNests +\end_layout + +\end_inset + + beendet werden. + Siehe auch +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +IsAutoNestedBy +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Description +\begin_inset Flex Code +status collapsed + \begin_layout Plain Layout BabelPreamble \end_layout @@ -11401,6 +11438,44 @@ TitleLatexName \begin_inset Flex Code status collapsed +\begin_layout Plain Layout +IsAutoNestedBy +\end_layout + +\end_inset + + beinhaltet eine mit Kommata separierte Liste von Layoutnamen, nach welchen + Absätze mit dem aktuellen Layout automatisch eingebettet werden sollen. + Sinnvolle Layouts für diese Liste sind nur solche, die auch einbetten können + (etwa Umgebungen). + Muss mit +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +EndIsAutoNestedBy +\end_layout + +\end_inset + + beendet werden. + Siehe auch +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +AutoNests +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Description +\begin_inset Flex Code +status collapsed + \begin_layout Plain Layout IsTocCaption \end_layout diff --git a/lib/doc/es/Customization.lyx b/lib/doc/es/Customization.lyx index fbe53b51fe..ccfa52e70f 100644 --- a/lib/doc/es/Customization.lyx +++ b/lib/doc/es/Customization.lyx @@ -123,11 +123,12 @@ logicalmkup \papercolumns 1 \papersides 2 \paperpagestyle headings -\tracking_changes false +\tracking_changes true \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict true +\author -712698321 "Jürgen Spitzmüller" \end_header \begin_body @@ -11816,6 +11817,69 @@ Argument item:1 \end_layout \end_deeper +\begin_layout Description + +\change_inserted -712698321 1514710560 + +\lang english +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710560 + +\lang english +AutoNests +\end_layout + +\end_inset + + Includes a comma-separated list of layout names that should be nested in + and after the current one. + Only makes sense for nestable layouts (such as environments). + Must be ended by +\begin_inset Quotes eld +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710560 + +\lang english +EndAutoNests +\end_layout + +\end_inset + + +\begin_inset Quotes erd +\end_inset + +. + See also +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710560 + +\lang english +IsAutoNestedBy +\end_layout + +\end_inset + +. +\change_unchanged + +\end_layout + \begin_layout Description \begin_inset Flex Code status collapsed @@ -12600,6 +12664,71 @@ TitleLatexName \end_inset ). +\change_inserted -712698321 1514710606 + +\end_layout + +\begin_layout Description + +\change_inserted -712698321 1514710606 + +\lang english +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710606 + +\lang english +IsAutoNestedBy +\end_layout + +\end_inset + + Includes a comma-separated list of layout names after which this one should + be nested. + Only makes sense with regard to nestable layouts (such as environments). + Must be ended by +\begin_inset Quotes eld +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710606 + +\lang english +EndIsAutoNestedBy +\end_layout + +\end_inset + + +\begin_inset Quotes erd +\end_inset + +. + See also +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710757 + +\lang english +AutoNests +\end_layout + +\end_inset + +. +\change_unchanged + \end_layout \begin_layout Description diff --git a/lib/doc/fr/Customization.lyx b/lib/doc/fr/Customization.lyx index 042316c7cf..c1c8f8b75a 100644 --- a/lib/doc/fr/Customization.lyx +++ b/lib/doc/fr/Customization.lyx @@ -123,11 +123,12 @@ logicalmkup \papercolumns 1 \papersides 2 \paperpagestyle headings -\tracking_changes false +\tracking_changes true \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false +\author -712698321 "Jürgen Spitzmüller" \end_header \begin_body @@ -12540,6 +12541,69 @@ Argument item:1 \end_deeper \begin_layout Description +\change_inserted -712698321 1514710551 + +\lang english +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710551 + +\lang english +AutoNests +\end_layout + +\end_inset + + Includes a comma-separated list of layout names that should be nested in + and after the current one. + Only makes sense for nestable layouts (such as environments). + Must be ended by +\begin_inset Quotes eld +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710551 + +\lang english +EndAutoNests +\end_layout + +\end_inset + + +\begin_inset Quotes erd +\end_inset + +. + See also +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710551 + +\lang english +IsAutoNestedBy +\end_layout + +\end_inset + +. +\change_unchanged + +\end_layout + +\begin_layout Description + \lang english \begin_inset Flex Code status collapsed @@ -13388,6 +13452,71 @@ TitleLatexName \end_inset dans les paramètres généraux). +\change_inserted -712698321 1514710619 + +\end_layout + +\begin_layout Description + +\change_inserted -712698321 1514710619 + +\lang english +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710619 + +\lang english +IsAutoNestedBy +\end_layout + +\end_inset + + Includes a comma-separated list of layout names after which this one should + be nested. + Only makes sense with regard to nestable layouts (such as environments). + Must be ended by +\begin_inset Quotes eld +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710619 + +\lang english +EndIsAutoNestedBy +\end_layout + +\end_inset + + +\begin_inset Quotes erd +\end_inset + +. + See also +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710764 + +\lang english +AutoNests +\end_layout + +\end_inset + +. +\change_unchanged + \end_layout \begin_layout Description diff --git a/lib/doc/ja/Customization.lyx b/lib/doc/ja/Customization.lyx index f903867648..9940b41495 100644 --- a/lib/doc/ja/Customization.lyx +++ b/lib/doc/ja/Customization.lyx @@ -172,6 +172,7 @@ End \html_math_output 0 \html_css_as_file 0 \html_be_strict true +\author -712698321 "Jürgen Spitzmüller" \end_header \begin_body @@ -10616,6 +10617,69 @@ Argument item:1 \end_layout \end_deeper +\begin_layout Description + +\change_inserted -712698321 1514710543 + +\lang english +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710543 + +\lang english +AutoNests +\end_layout + +\end_inset + + Includes a comma-separated list of layout names that should be nested in + and after the current one. + Only makes sense for nestable layouts (such as environments). + Must be ended by +\begin_inset Quotes eld +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710543 + +\lang english +EndAutoNests +\end_layout + +\end_inset + + +\begin_inset Quotes erd +\end_inset + +. + See also +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710543 + +\lang english +IsAutoNestedBy +\end_layout + +\end_inset + +. +\change_unchanged + +\end_layout + \begin_layout Description \begin_inset Flex Code status collapsed @@ -11276,6 +11340,71 @@ TitleLatexName \end_inset も参照). +\change_inserted -712698321 1514710627 + +\end_layout + +\begin_layout Description + +\change_inserted -712698321 1514710627 + +\lang english +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710627 + +\lang english +IsAutoNestedBy +\end_layout + +\end_inset + + Includes a comma-separated list of layout names after which this one should + be nested. + Only makes sense with regard to nestable layouts (such as environments). + Must be ended by +\begin_inset Quotes eld +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710627 + +\lang english +EndIsAutoNestedBy +\end_layout + +\end_inset + + +\begin_inset Quotes erd +\end_inset + +. + See also +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1514710769 + +\lang english +AutoNests +\end_layout + +\end_inset + +. +\change_unchanged + \end_layout \begin_layout Description diff --git a/lib/layouts/beamer.layout b/lib/layouts/beamer.layout index 14e4549d54..a9c8bcf703 100644 --- a/lib/layouts/beamer.layout +++ b/lib/layouts/beamer.layout @@ -6,7 +6,7 @@ # Richard Heck , Martin Vermeer and probably others. -Format 65 +Format 66 # # GLOBAL SETTINGS @@ -487,6 +487,12 @@ Style Frame AutoInsert 1 IsTocCaption 1 EndArgument + AutoNests + Standard,Itemize,Enumerate,Description,FrameTitle,FrameSubtitle,Column, + Columns,ColumnsCenterAligned,ColumnsTopAligned,Pause,Overprint,OverlayArea,Only,Block, + ExampleBlock,AlertBlock,Bibliography,Quotation,Quote,Verse,Corollary,Definition,Definitions, + Example,Examples,Fact,Lemma,Proof,Theorem,LyX-Code + EndAutoNests End Style PlainFrame @@ -670,6 +676,11 @@ Style Columns Family Roman Color latex EndFont + AutoNests + Standard,Itemize,Enumerate,Description,Pause,Overprint,OverlayArea,Only,Block, + ExampleBlock,AlertBlock,Bibliography,Quotation,Quote,Verse,Corollary,Definition,Definitions, + Example,Examples,Fact,Lemma,Proof,Theorem,LyX-Code + EndAutoNests End Style ColumnsCenterAligned @@ -890,6 +901,10 @@ Style Block EndFont AutoInsert 1 EndArgument + AutoNests + Standard,Itemize,Enumerate,Description,Pause,Overprint,OverlayArea,Only,Quotation, + Quote,Verse,Corollary,Definition,Definitions,Example,Examples,Fact,Lemma,Proof,Theorem,LyX-Code + EndAutoNests End Style ExampleBlock @@ -1233,6 +1248,9 @@ Style Corollary LabelString "Additional Theorem Text" Tooltip "Additional text appended to the theorem header" EndArgument + AutoNests + Standard,Itemize,Enumerate,Description,Pause,Overprint,OverlayArea,Only,LyX-Code + EndAutoNests End Style Definition diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index 2cf54c5e14..d13f8bf105 100644 --- a/lib/scripts/layout2layout.py +++ b/lib/scripts/layout2layout.py @@ -11,7 +11,7 @@ # This script will update a .layout file to current format # The latest layout format is also defined in src/TextClass.cpp -currentFormat = 65 +currentFormat = 66 # Incremented to format 4, 6 April 2007, lasgouttes @@ -220,6 +220,10 @@ currentFormat = 65 # Incremented to format 65, 16 October 2017 by spitz # Color collapsable -> collapsible +# Incremented to format 66, 28 December 2017 by spitz +# New Layout tags "AutoNests ... EndAutoNests" and +# "IsAutoNestedBy ... EndIsAutoNestedBy" + # Do not forget to document format change in Customization # Manual (section "Declaring a new text class"). @@ -469,6 +473,11 @@ def convert(lines, end_format): i += 1 continue + if format == 65: + # nothing to do. + i += 1 + continue + if format == 64: match = re.compile(b'(\\s*Color\\s+)(\\w+)', re.IGNORECASE).match(lines[i]) if not match: diff --git a/src/Layout.cpp b/src/Layout.cpp index ec23e57f1e..0a783d0aad 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -40,6 +40,8 @@ enum LayoutTags { LT_ALIGN = 1, LT_ALIGNPOSSIBLE, LT_ARGUMENT, + LT_AUTONESTS, + LT_AUTONESTEDBY, LT_MARGIN, LT_BOTTOMSEP, LT_CATEGORY, @@ -191,6 +193,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) { "align", LT_ALIGN }, { "alignpossible", LT_ALIGNPOSSIBLE }, { "argument", LT_ARGUMENT }, + { "autonests", LT_AUTONESTS }, { "babelpreamble", LT_BABELPREAMBLE }, { "bottomsep", LT_BOTTOMSEP }, { "category", LT_CATEGORY }, @@ -217,6 +220,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) { "innertag", LT_INNERTAG }, { "inpreamble", LT_INPREAMBLE }, { "intitle", LT_INTITLE }, + { "isautonestedby", LT_AUTONESTEDBY }, { "istoccaption", LT_ISTOCCAPTION }, { "itemcommand", LT_ITEMCOMMAND }, { "itemsep", LT_ITEMSEP }, @@ -592,6 +596,30 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) break; } + case LT_AUTONESTS: { + docstring const autonest = + subst(subst(subst(lex.getLongString(from_ascii("EndAutoNests")), + from_ascii("\n"), docstring()), + from_ascii(" "), docstring()), + from_ascii("\t"), docstring()); + vector const autonests = + getVectorFromString(autonest); + autonests_.insert(autonests.begin(), autonests.end()); + break; + } + + case LT_AUTONESTEDBY: { + docstring const autonest = + subst(subst(subst(lex.getLongString(from_ascii("EndIsAutoNestedBy")), + from_ascii("\n"), docstring()), + from_ascii(" "), docstring()), + from_ascii("\t"), docstring()); + vector const autonests = + getVectorFromString(autonest); + autonested_by_.insert(autonests.begin(), autonests.end()); + break; + } + case LT_REFPREFIX: { docstring arg; lex >> arg; @@ -1387,6 +1415,26 @@ void Layout::write(ostream & os) const } os << '\n'; } + if (!autonests_.empty()) { + os << "\tAutoNests\n\t"; + for (set::const_iterator it = autonests_.begin(); + it != autonests_.end(); ++it) { + if (it != autonests_.begin()) + os << ','; + os << to_utf8(*it); + } + os << "\n\tEndAutoNests\n"; + } + if (!autonested_by_.empty()) { + os << "\tIsAutoNestedBy\n\t"; + for (set::const_iterator it = autonested_by_.begin(); + it != autonested_by_.end(); ++it) { + if (it != autonested_by_.begin()) + os << ','; + os << to_utf8(*it); + } + os << "\n\tIsAutoNestedBy\n"; + } if (refprefix.empty()) os << "\tRefPrefix OFF\n"; else diff --git a/src/Layout.h b/src/Layout.h index 90d1b2e8ed..04f184f3a4 100644 --- a/src/Layout.h +++ b/src/Layout.h @@ -149,6 +149,10 @@ public: /// std::set const & requires() const { return requires_; } /// + std::set const & autonests() const { return autonests_; } + /// + std::set const & isAutonestedBy() const { return autonested_by_; } + /// std::string const & latexparam() const { return latexparam_; } /// docstring leftdelim() const { return leftdelim_; } @@ -468,6 +472,10 @@ private: bool par_group_; /// Packages needed for this layout std::set requires_; + /// Layouts that are by default nested after this one + std::set autonests_; + /// Layouts that by auto-nest this one + std::set autonested_by_; /// LaTeXArgMap latexargs_; /// diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp index 29052d2468..952602821e 100644 --- a/src/LyXAction.cpp +++ b/src/LyXAction.cpp @@ -2300,8 +2300,9 @@ void LyXAction::init() /*! * \var lyx::FuncCode lyx::LFUN_LAYOUT * \li Action: Sets the layout (that is, environment) for the current paragraph. - * \li Syntax: layout - * \li Params: : the layout to use + * \li Syntax: layout [ignorenests] + * \li Params: : the layout to use\n + ignorenests: If specified, nesting advices will be ignored. * \endvar */ { LFUN_LAYOUT, "layout", Noop, Layout }, diff --git a/src/Text3.cpp b/src/Text3.cpp index 4b2f90af4b..999b960fc4 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -1407,7 +1407,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) break; case LFUN_LAYOUT: { - docstring layout = cmd.argument(); + bool const ignoreautonests = cmd.getArg(1) == "ignoreautonests"; + docstring layout = ignoreautonests ? from_utf8(cmd.getArg(0)) : cmd.argument(); LYXERR(Debug::INFO, "LFUN_LAYOUT: (arg) " << to_utf8(layout)); Paragraph const & para = cur.paragraph(); @@ -1461,8 +1462,18 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } } - if (change_layout) + if (change_layout) { setLayout(cur, layout); + if (cur.pit() > 0 && !ignoreautonests) { + set const & autonests = + pars_[cur.pit() - 1].layout().autonests(); + set const & autonested = + pars_[cur.pit()].layout().isAutonestedBy(); + if (autonests.find(layout) != autonests.end() + || autonested.find(old_layout) != autonested.end()) + lyx::dispatch(FuncRequest(LFUN_DEPTH_INCREMENT)); + } + } Layout::LaTeXArgMap args = tclass[layout].args(); Layout::LaTeXArgMap::const_iterator lait = args.begin(); @@ -3141,7 +3152,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_LAYOUT: { DocumentClass const & tclass = cur.buffer()->params().documentClass(); - docstring layout = cmd.argument(); + bool const ignoreautonests = cmd.getArg(1) == "ignoreautonests"; + docstring layout = ignoreautonests ? from_utf8(cmd.getArg(0)) : cmd.argument(); if (layout.empty()) layout = tclass.defaultLayoutName(); enable = !owner_->forcePlainLayout() && tclass.hasLayout(layout); diff --git a/src/TextClass.cpp b/src/TextClass.cpp index f63632471c..d4b7d81370 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -62,7 +62,7 @@ namespace lyx { // You should also run the development/tools/updatelayouts.py script, // to update the format of all of our layout files. // -int const LAYOUT_FORMAT = 65; //spitz: Color collapsable -> collapsible. +int const LAYOUT_FORMAT = 66; //spitz: New layout tag AutoNests // Layout format for the current lyx file format. Controls which format is