From 30b53ba4a052881413507a125c3ca057af08bdd6 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sun, 9 Dec 2012 11:04:56 +0100 Subject: [PATCH] beamer revision, part 1: support for overlay arguments --- development/FORMAT | 4 + lib/layouts/beamer.layout | 338 +++++++++++++++++-- lib/lyx2lyx/lyx_2_1.py | 665 +++++++++++++++++++++++++++++++++++++- src/tex2lyx/TODO.txt | 2 + src/version.h | 4 +- 5 files changed, 979 insertions(+), 34 deletions(-) diff --git a/development/FORMAT b/development/FORMAT index 8d0f86085b..eecac40320 100644 --- a/development/FORMAT +++ b/development/FORMAT @@ -11,6 +11,10 @@ adjustments are made to tex2lyx and bugs are fixed in lyx2lyx. ----------------------- +2012-12-09 Jürgen Spitzmüller + * Format incremented to 451: Native support for beamer action/overlay arguments. + \command => \begin_inset Argument 1 + 2012-12-04 Jürgen Spitzmüller * Format incremented to 450: Support for the URW Garamond LaTeX fonts. - \usepackage{garamondx} > \font_serif garamondx diff --git a/lib/layouts/beamer.layout b/lib/layouts/beamer.layout index 54258e9cc3..e133239b0b 100644 --- a/lib/layouts/beamer.layout +++ b/lib/layouts/beamer.layout @@ -47,6 +47,7 @@ TitleLaTeXName makebeamertitle AddToPreamble % this default might be overridden by plain title style \newcommand\makebeamertitle{\frame{\maketitle}}% + % (ERT) argument for the TOC \AtBeginDocument{% \let\origtableofcontents=\tableofcontents \def\tableofcontents{\@ifnextchar[{\origtableofcontents}{\gobbletableofcontents}} @@ -84,6 +85,18 @@ Style Itemize Argument 1 LabelString "Overlay Specifications|S" Tooltip "Overlay specifications for this list" + LeftDelim [< + RightDelim >] + EndArgument + Argument item:1 + LabelString "Custom Item|s" + Tooltip "A customized item string" + EndArgument + Argument item:2 + LabelString "Item Overlay Specifications" + Tooltip "Overlay specifications for this item" + LeftDelim < + RightDelim > EndArgument NextNoIndent 1 LeftMargin MMN @@ -104,10 +117,22 @@ Style Enumerate Argument 1 LabelString "Overlay Specifications|S" Tooltip "Overlay specifications for this list" + LeftDelim [< + RightDelim >] EndArgument Argument 2 - LabelString "Mini template" - Tooltip "Mini template for this List" + LabelString "Mini Template" + Tooltip "Mini template for this list (see beamer manual for details)" + EndArgument + Argument item:1 + LabelString "Custom Item|s" + Tooltip "A customized item string" + EndArgument + Argument item:2 + LabelString "Item Overlay Specifications" + Tooltip "Overlay specifications for this item" + LeftDelim < + RightDelim > EndArgument NextNoIndent 1 LeftMargin MMN @@ -130,10 +155,18 @@ Style Description Argument 1 LabelString "Overlay Specifications|S" Tooltip "Overlay specifications for this list" + LeftDelim [< + RightDelim >] EndArgument Argument 2 LabelString "Longest label|s" - Tooltip "The longest label in this list" + Tooltip "The longest label in this list (to determine the indendation width)" + EndArgument + Argument item:1 + LabelString "Item Overlay Specifications" + Tooltip "Overlay specifications for this item" + LeftDelim < + RightDelim > EndArgument NextNoIndent 1 LeftMargin MM @@ -161,6 +194,12 @@ Style Part LatexType Command LatexName part Argument 1 + LabelString "Mode Specification|S" + Tooltip "Specify in which mode (article, presentation etc.) this header appears" + LeftDelim < + RightDelim > + EndArgument + Argument 2 LabelString "Short Title|S" Tooltip "The part as it appears in the table of contents/running headers" EndArgument @@ -204,6 +243,12 @@ Style Section LabelString "Section \arabic{section}" RefPrefix sec Argument 1 + LabelString "Mode Specification|S" + Tooltip "Specify in which mode (article, presentation etc.) this header appears" + LeftDelim < + RightDelim > + EndArgument + Argument 2 LabelString "Short Title|S" Tooltip "The section as it appears in the table of contents/running headers" EndArgument @@ -223,9 +268,16 @@ Style Section* CopyStyle Section Category Unnumbered Margin Static - LatexName lyxframeend{}\section* + LatexName lyxframeend{}\section LabelType No_Label ResetArgs 1 + Argument 1 + LabelString "Mode Specification|S" + Tooltip "Specify in which mode (article, presentation etc.) this header appears" + LeftDelim < + RightDelim > + EndArgument + LaTeXParam * End Style Subsection @@ -246,6 +298,12 @@ Style Subsection LabelString "Subsection \arabic{section}.\arabic{subsection}" RefPrefix sub Argument 1 + LabelString "Mode Specification|S" + Tooltip "Specify in which mode (article, presentation etc.) this header appears" + LeftDelim < + RightDelim > + EndArgument + Argument 2 LabelString "Short Title|S" Tooltip "The subsection as it appears in the table of contents/running headers" EndArgument @@ -265,9 +323,16 @@ Style Subsection* CopyStyle Subsection Category Unnumbered Margin Static - LatexName lyxframeend{}\subsection* + LatexName lyxframeend{}\subsection LabelType No_Label ResetArgs 1 + Argument 1 + LabelString "Mode Specification|S" + Tooltip "Specify in which mode (article, presentation etc.) this header appears" + LeftDelim < + RightDelim > + EndArgument + LaTeXParam * End Style Subsubsection @@ -288,6 +353,12 @@ Style Subsubsection LabelString "Subsubsection \arabic{section}.\arabic{subsection}.\arabic{subsubsection}" RefPrefix sub Argument 1 + LabelString "Mode Specification|S" + Tooltip "Specify in which mode (article, presentation etc.) this header appears" + LeftDelim < + RightDelim > + EndArgument + Argument 2 LabelString "Short Title|S" Tooltip "The subsubsection as it appears in the table of contents/running headers" EndArgument @@ -307,9 +378,16 @@ Style Subsubsection* CopyStyle Subsubsection Category Unnumbered Margin Static - LatexName lyxframeend{}\subsubsection* + LatexName lyxframeend{}\subsubsection LabelType No_Label ResetArgs 1 + Argument 1 + LabelString "Mode Specification|S" + Tooltip "Specify in which mode (article, presentation etc.) this header appears" + LeftDelim < + RightDelim > + EndArgument + LaTeXParam * End @@ -398,12 +476,20 @@ Style AgainFrame Category Frames KeepEmpty 0 LatexType Command - LatexName lyxframeend{}\lyxagainframe + LatexName lyxframeend{}\againframe Argument 1 LabelString "Overlay Specifications|S" - Tooltip "Overlay specifications for this list" + Tooltip "Overlay specifications for this frame" + LeftDelim < + RightDelim > EndArgument Argument 2 + LabelString "Default Overlay Specifications" + Tooltip "Default overlay specifications within this frame" + LeftDelim [< + RightDelim >] + EndArgument + Argument 3 LabelString "Frame Options" Tooltip "Frame options (see beamer manual)" EndArgument @@ -428,13 +514,6 @@ Style AgainFrame Series Bold Size Largest EndFont - Preamble - \long\def\lyxagainframe#1{\@lyxagainframe#1\@lyxframestop}% - \def\@lyxagainframe{\@ifnextchar<{\@@lyxagainframe}{\@@lyxagainframe<*>}}% - \def\@@lyxagainframe<#1>{\@ifnextchar[{\@@@lyxagainframe<#1>}{\@@@lyxagainframe<#1>[]}} - \long\def\@@@lyxagainframe<#1>[#2]#3\@lyxframestop{% - \againframe<#1>[#2]{#3}} - EndPreamble End Style EndFrame @@ -479,6 +558,12 @@ Style FrameSubtitle Series Bold Color Blue EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument End @@ -607,6 +692,10 @@ Style Overprint Family Roman Color latex EndFont + Argument 1 + LabelString "Overprint Area Width" + Tooltip "The width of the overprint area (default: text width)" + EndArgument End Style OverlayArea @@ -628,6 +717,16 @@ Style OverlayArea Family Roman Color latex EndFont + Argument 1 + LabelString "Overlay Area Width" + Tooltip "The width of the overlay area" + Mandatory 1 + EndArgument + Argument 2 + LabelString "Overlay Area Height" + Tooltip "The height of the overlay area" + Mandatory 1 + EndArgument End Style Uncover @@ -638,7 +737,7 @@ Style Uncover ParIndent MM Align Left LabelType Static - LatexName uncoverenv}%{ + LatexName uncoverenv LabelSep xx LabelString "Uncovered on slides" ParSkip 0.5 @@ -649,6 +748,12 @@ Style Uncover Family Roman Color Latex EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument End Style Only @@ -659,7 +764,7 @@ Style Only ParIndent MM Align Left LabelType Static - LatexName onlyenv}%{ + LatexName onlyenv LabelSep xx LabelString "Only on slides" ParSkip 0.5 @@ -670,6 +775,12 @@ Style Only Family Roman Color Latex EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument End @@ -950,7 +1061,7 @@ Style Quotation Category MainText Margin Static LatexType Environment - LatexName quotation}%{ + LatexName quotation NextNoIndent 1 LeftMargin MMM RightMargin MMM @@ -962,13 +1073,19 @@ Style Quotation ParSep 0 Align Block AlignPossible Block, Left, Right, Center + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument End Style Quote Category MainText Margin Static LatexType Environment - LatexName quote}%{ + LatexName quote NextNoIndent 1 LeftMargin MMM RightMargin MMM @@ -978,6 +1095,12 @@ Style Quote Align Block AlignPossible Block, Left, Right, Center LabelType No_Label + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument End Style Verse @@ -985,7 +1108,7 @@ Style Verse # In LyX this does not make sense. Category MainText LatexType Environment - LatexName verse}%{ + LatexName verse Margin First_Dynamic NextNoIndent 1 LeftMargin MMMM @@ -997,6 +1120,12 @@ Style Verse Align Block AlignPossible Block, Left LabelType No_Label + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument End @@ -1013,7 +1142,7 @@ Style Corollary Align Left LabelType Static LabelSep xx - LatexName corollary}%{ + LatexName corollary LabelString "Corollary." ParSkip 0.5 TopSep 1 @@ -1025,23 +1154,33 @@ Style Corollary Color Blue Size Large EndFont + Argument 1 + LabelString "Action Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument + Argument 2 + LabelString "Additional Theorem Text" + Tooltip "Additional text appended to the theorem header" + EndArgument End Style Definition CopyStyle Corollary - LatexName definition}%{ + LatexName definition LabelString "Definition." End Style Definitions CopyStyle Corollary - LatexName definitions}%{ + LatexName definitions LabelString "Definitions." End Style Example CopyStyle Corollary - LatexName example}%{ + LatexName example LabelString "Example." LabelFont Series Bold @@ -1051,25 +1190,25 @@ End Style Examples CopyStyle Corollary - LatexName examples}%{ + LatexName examples LabelString "Examples." End Style Fact CopyStyle Corollary - LatexName fact}%{ + LatexName fact LabelString "Fact." End Style Proof CopyStyle Corollary - LatexName proof}%{ + LatexName proof LabelString "Proof." End Style Theorem CopyStyle Corollary - LatexName theorem}%{ + LatexName theorem LabelString "Theorem." End @@ -1154,6 +1293,12 @@ Style NoteItem Family Roman Color latex EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument End @@ -1161,6 +1306,22 @@ End # CHARSTYLES # +InsetLayout Flex:Emphasize + LyXType charstyle + LabelString Emphasize + LatexType command + LatexName emph + Font + Shape italic + EndFont + Argument 1 + LabelString "Action Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument +End + InsetLayout Flex:Alert LyXType charstyle LabelString Alert @@ -1169,6 +1330,12 @@ InsetLayout Flex:Alert Font Color red EndFont + Argument 1 + LabelString "Action Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument End InsetLayout Flex:Structure @@ -1179,11 +1346,124 @@ InsetLayout Flex:Structure Font Color blue EndFont + Argument 1 + LabelString "Action Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument +End + +InsetLayout Flex:Only + LyXType charstyle + LabelString Only + LatexType command + LatexName only + Font + Color red + EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument +End + +InsetLayout Flex:Uncover + LyXType charstyle + LabelString Uncover + LatexType command + LatexName uncover + Font + Color red + EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument +End + +InsetLayout Flex:Visible + LyXType charstyle + LabelString Visible + LatexType command + LatexName visible + Font + Color red + EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument +End + +InsetLayout Flex:Invisible + LyXType charstyle + LabelString Invisible + LatexType command + LatexName invisible + Font + Color red + EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument +End + +InsetLayout Flex:Alternative + LyXType charstyle + LabelString Alternative + LatexType command + LatexName alt + Font + Color red + EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument + Argument 2 + LabelString "Default Text" + Tooltip "Enter the default text here" + Mandatory 1 + EndArgument +End + +InsetLayout Flex:Beamer_Note + LyXType custom + LabelString Note + LatexType command + LatexName note + Decoration Classic + Font + Color blue + EndFont + Argument 1 + LabelString "Overlay Specification|S" + Tooltip "Specify the overlay settings (see beamer manual)" + LeftDelim < + RightDelim > + EndArgument + Argument 2 + LabelString "Note Options" + Tooltip "Specifiy note options (see beamer manual)" + EndArgument End InsetLayout Flex:ArticleMode LyXType custom - LatexName mode
+ LatexName mode + LatexParam
LatexType command Decoration classic LabelString Article diff --git a/lib/lyx2lyx/lyx_2_1.py b/lib/lyx2lyx/lyx_2_1.py index 91666ba4e2..358da2415a 100644 --- a/lib/lyx2lyx/lyx_2_1.py +++ b/lib/lyx2lyx/lyx_2_1.py @@ -25,12 +25,12 @@ import sys, os # Uncomment only what you need to import, please. -from parser_tools import del_token, find_token, find_token_backwards, find_end_of, \ +from parser_tools import del_token, find_token, find_token_exact, find_token_backwards, find_end_of, \ find_end_of_inset, find_end_of_layout, find_re, get_option_value, get_containing_layout, \ get_value, get_quoted_value, set_option_value #from parser_tools import find_token, find_end_of, find_tokens, \ - #find_token_exact, find_end_of_inset, find_end_of_layout, \ + #find_end_of_inset, find_end_of_layout, \ #is_in_inset, del_token, check_token from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert, get_ert @@ -1826,6 +1826,663 @@ def revert_garamondx(document): document.header[i] = "\\font_roman default" +def convert_beamerargs(document): + " Converts beamer arguments to new layout " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + shifted_layouts = ["Part", "Section", "Subsection", "Subsubsection"] + list_layouts = ["Itemize", "Enumerate", "Description"] + rx = re.compile(r'^\\begin_inset Argument (\d+)$') + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Argument", i) + if i == -1: + return + # Find containing paragraph layout + parent = get_containing_layout(document.body, i) + if parent == False: + document.warning("Malformed lyx document: Can't find parent paragraph layout") + i = i + 1 + continue + parbeg = parent[1] + parend = parent[2] + layoutname = parent[0] + for p in range(parbeg, parend): + if layoutname in shifted_layouts: + m = rx.match(document.body[p]) + if m: + argnr = int(m.group(1)) + argnr += 1 + document.body[p] = "\\begin_inset Argument %d" % argnr + if layoutname == "AgainFrame": + m = rx.match(document.body[p]) + if m: + document.body[p] = "\\begin_inset Argument 3" + if document.body[p + 4] == "\\begin_inset ERT": + if document.body[p + 9].startswith("<"): + # This is an overlay specification + # strip off the < + document.body[p + 9] = document.body[p + 9][1:] + if document.body[p + 9].endswith(">"): + # strip off the > + document.body[p + 9] = document.body[p + 9][:-1] + # Shift this one + document.body[p] = "\\begin_inset Argument 2" + if layoutname in list_layouts: + m = rx.match(document.body[p]) + if m: + if m.group(1) == "1": + if document.body[p + 4] == "\\begin_inset ERT": + if document.body[p + 9].startswith("<"): + # This is an overlay specification + # strip off the < + document.body[p + 9] = document.body[p + 9][1:] + if document.body[p + 9].endswith(">"): + # strip off the > + document.body[p + 9] = document.body[p + 9][:-1] + elif layoutname != "Itemize": + # Shift this one + document.body[p] = "\\begin_inset Argument 2" + i = i + 1 + + +def convert_againframe_args(document): + " Converts beamer AgainFrame to new layout " + + # FIXME: This currently only works if the arguments are in one single ERT + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + i = 0 + while True: + i = find_token(document.body, "\\begin_layout AgainFrame", i) + if i == -1: + break + j = find_end_of_layout(document.body, i) + if i != -1: + if document.body[i + 1] == "\\begin_inset ERT": + if document.body[i + 6].startswith("[<"): + # This is a default overlay specification + # strip off the [< + document.body[i + 6] = document.body[i + 6][2:] + if document.body[i + 6].endswith(">]"): + # strip off the >] + document.body[i + 6] = document.body[i + 6][:-2] + elif document.body[i + 6].endswith("]"): + # divide the args + tok = document.body[i + 6].find('>][') + if tok != -1: + subst = [document.body[i + 6][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 3', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[i + 6][tok + 3:-1]] + document.body[i + 6 : i + 7] = subst + # Convert to ArgInset + document.body[i + 1] = "\\begin_inset Argument 2" + i = j + continue + elif document.body[i + 6].startswith("<"): + # This is an overlay specification + # strip off the < + document.body[i + 6] = document.body[i + 6][1:] + if document.body[i + 6].endswith(">"): + # strip off the > + document.body[i + 6] = document.body[i + 6][:-1] + # Convert to ArgInset + document.body[i + 1] = "\\begin_inset Argument 1" + elif document.body[i + 6].endswith(">]"): + # divide the args + tok = document.body[i + 6].find('>[<') + if tok != -1: + document.body[i + 6 : i + 7] = [document.body[i + 6][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[i + 6][tok + 3:-2]] + # Convert to ArgInset + document.body[i + 1] = "\\begin_inset Argument 1" + elif document.body[i + 6].endswith("]"): + # divide the args + tok = document.body[i + 6].find('>[<') + if tok != -1: + # divide the args + tokk = document.body[i + 6].find('>][') + if tokk != -1: + document.body[i + 6 : i + 7] = [document.body[i + 6][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[i + 6][tok + 3:tokk], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 3', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[i + 6][tokk + 3:-1]] + else: + tokk = document.body[i + 6].find('>[') + if tokk != -1: + document.warning(document.body[i + 6][tokk + 2:-1]) + document.body[i + 6 : i + 7] = [document.body[i + 6][:tokk], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 3', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[i + 6][tokk + 2:-1]] + # Convert to ArgInset + document.body[i + 1] = "\\begin_inset Argument 1" + i = j + continue + elif document.body[i + 6].startswith("["): + # This is an ERT option + # strip off the [ + document.body[i + 6] = document.body[i + 6][1:] + if document.body[i + 6].endswith("]"): + # strip off the ] + document.body[i + 6] = document.body[i + 6][:-1] + # Convert to ArgInset + document.body[i + 1] = "\\begin_inset Argument 3" + i = j + continue + i = j + + +def convert_corollary_args(document): + " Converts beamer corrolary-style ERT arguments native InsetArgs " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + corollary_layouts = ["Corollary", "Definition", "Definitions", "Example", "Examples", "Fact", "Proof", "Theorem"] + for lay in corollary_layouts: + i = 0 + while True: + i = find_token_exact(document.body, "\\begin_layout " + lay, i) + if i == -1: + break + j = find_end_of_layout(document.body, i) + if i != -1: + if document.body[i + 1] == "\\begin_inset ERT": + if document.body[i + 6].startswith("<"): + # This is an overlay specification + # strip off the < + document.body[i + 6] = document.body[i + 6][1:] + if document.body[i + 6].endswith(">"): + # strip off the > + document.body[i + 6] = document.body[i + 6][:-1] + elif document.body[i + 6].endswith("]"): + # divide the args + tok = document.body[i + 6].find('>[') + if tok != -1: + subst = [document.body[i + 6][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[i + 6][tok + 2:-1]] + document.body[i + 6 : i + 7] = subst + # Convert to ArgInset + document.body[i + 1] = "\\begin_inset Argument 1" + i = j + continue + elif document.body[i + 6].startswith("["): + # This is an ERT option + # strip off the [ + document.body[i + 6] = document.body[i + 6][1:] + if document.body[i + 6].endswith("]"): + # strip off the ] + document.body[i + 6] = document.body[i + 6][:-1] + # Convert to ArgInset + document.body[i + 1] = "\\begin_inset Argument 2" + i = j + continue + i = j + + + +def convert_quote_args(document): + " Converts beamer quote style ERT args to native InsetArgs " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + quote_layouts = ["Uncover", "Only", "Quotation", "Quote", "Verse"] + for lay in quote_layouts: + i = 0 + while True: + i = find_token(document.body, "\\begin_layout " + lay, i) + if i == -1: + break + j = find_end_of_layout(document.body, i) + if i != -1: + if document.body[i + 1] == "\\begin_inset ERT": + if document.body[i + 6].startswith("<"): + # This is an overlay specification + # strip off the < + document.body[i + 6] = document.body[i + 6][1:] + if document.body[i + 6].endswith(">"): + # strip off the > + document.body[i + 6] = document.body[i + 6][:-1] + # Convert to ArgInset + document.body[i + 1] = "\\begin_inset Argument 1" + i = j + + +def revert_beamerargs(document): + " Reverts beamer arguments to old layout " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + i = 0 + list_layouts = ["Itemize", "Enumerate", "Description"] + headings = ["Part", "Section", "Section*", "Subsection", "Subsection*", + "Subsubsection", "Subsubsection*", "FrameSubtitle", "NoteItem"] + quote_layouts = ["Uncover", "Only", "Quotation", "Quote", "Verse"] + corollary_layouts = ["Corollary", "Definition", "Definitions", "Example", "Examples", "Fact", "Proof", "Theorem"] + rx = re.compile(r'^\\begin_inset Argument (\S+)$') + + while True: + i = find_token(document.body, "\\begin_inset Argument", i) + if i == -1: + return + # Find containing paragraph layout + parent = get_containing_layout(document.body, i) + if parent == False: + document.warning("Malformed lyx document: Can't find parent paragraph layout") + i = i + 1 + continue + parbeg = parent[1] + parend = parent[2] + layoutname = parent[0] + realparend = parend + for p in range(parbeg, parend): + if p >= realparend: + i = realparend + break + if layoutname in headings: + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "1": + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + argcontent = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + if layoutname == "FrameSubtitle": + pre = put_cmd_in_ert("\\" + layoutname.lower() + "<") + argcontent + put_cmd_in_ert(">") + elif layoutname == "NoteItem": + pre = put_cmd_in_ert("\\note<") + argcontent + put_cmd_in_ert(">[item]") + elif layoutname.endswith('*'): + pre = put_cmd_in_ert("\\lyxframeend\\" + layoutname.lower()[:-1] + "<") + argcontent + put_cmd_in_ert(">*") + else: + pre = put_cmd_in_ert("\\lyxframeend\\" + layoutname.lower() + "<") + argcontent + put_cmd_in_ert(">") + secarg = find_token(document.body, "\\begin_inset Argument 2", parbeg, parend) + if secarg != -1: + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", secarg) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, secarg) + argcontent = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[secarg : endInset + 1]) + del document.body[secarg : endInset + 1] + pre += put_cmd_in_ert("[") + argcontent + put_cmd_in_ert("]") + pre += put_cmd_in_ert("{") + document.body[parbeg] = "\\begin_layout Standard" + document.body[parbeg + 1 : parbeg + 1] = pre + pe = find_end_of_layout(document.body, parbeg) + post = put_cmd_in_ert("}") + document.body[pe : pe] = post + realparend += len(pre) + len(post) + if layoutname == "AgainFrame": + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "3": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + document.body[parbeg + 1:parbeg + 1] = subst + if layoutname == "Overprint": + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "1": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + document.body[parbeg + 1:parbeg + 1] = subst + if layoutname == "OverlayArea": + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "2": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("{") + content + put_cmd_in_ert("}") + document.body[parbeg + 1:parbeg + 1] = subst + if layoutname in list_layouts: + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "1": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("<") + content + put_cmd_in_ert(">") + document.body[parbeg + 1:parbeg + 1] = subst + elif argnr == "item:1": + j = find_end_of_inset(document.body, i) + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) + endPlain = find_end_of_layout(document.body, beginPlain) + content = document.body[beginPlain + 1 : endPlain] + del document.body[i:j+1] + subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + document.body[parbeg + 1 : parbeg + 1] = subst + elif argnr == "item:2": + j = find_end_of_inset(document.body, i) + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) + endPlain = find_end_of_layout(document.body, beginPlain) + content = document.body[beginPlain + 1 : endPlain] + del document.body[i:j+1] + subst = put_cmd_in_ert("<") + content + put_cmd_in_ert(">") + document.body[parbeg + 1:parbeg + 1] = subst + if layoutname in quote_layouts: + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "1": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("<") + content + put_cmd_in_ert(">") + document.body[parbeg + 1:parbeg + 1] = subst + if layoutname in corollary_layouts: + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "2": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + document.body[parbeg + 1:parbeg + 1] = subst + + i = realparend + + +def revert_beamerargs2(document): + " Reverts beamer arguments to old layout, step 2 " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + i = 0 + shifted_layouts = ["Part", "Section", "Subsection", "Subsubsection"] + corollary_layouts = ["Corollary", "Definition", "Definitions", "Example", "Examples", "Fact", "Proof", "Theorem"] + rx = re.compile(r'^\\begin_inset Argument (\S+)$') + + while True: + i = find_token(document.body, "\\begin_inset Argument", i) + if i == -1: + return + # Find containing paragraph layout + parent = get_containing_layout(document.body, i) + if parent == False: + document.warning("Malformed lyx document: Can't find parent paragraph layout") + i = i + 1 + continue + parbeg = parent[1] + parend = parent[2] + layoutname = parent[0] + realparend = parend + for p in range(parbeg, parend): + if p >= realparend: + i = realparend + break + if layoutname in shifted_layouts: + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "2": + document.body[p] = "\\begin_inset Argument 1" + if layoutname in corollary_layouts: + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "1": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("<") + content + put_cmd_in_ert(">") + document.body[parbeg + 1:parbeg + 1] = subst + if layoutname == "OverlayArea": + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "1": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("{") + content + put_cmd_in_ert("}") + document.body[parbeg + 1:parbeg + 1] = subst + if layoutname == "AgainFrame": + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "2": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("[<") + content + put_cmd_in_ert(">]") + document.body[parbeg + 1:parbeg + 1] = subst + i = realparend + + +def revert_beamerargs3(document): + " Reverts beamer arguments to old layout, step 3 " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + rx = re.compile(r'^\\begin_inset Argument (\S+)$') + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Argument", i) + if i == -1: + return + # Find containing paragraph layout + parent = get_containing_layout(document.body, i) + if parent == False: + document.warning("Malformed lyx document: Can't find parent paragraph layout") + i = i + 1 + continue + parbeg = parent[1] + parend = parent[2] + layoutname = parent[0] + realparend = parend + for p in range(parbeg, parend): + if p >= realparend: + i = realparend + break + if layoutname == "AgainFrame": + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "1": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + realparend = realparend - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst = put_cmd_in_ert("<") + content + put_cmd_in_ert(">") + document.body[parbeg + 1:parbeg + 1] = subst + i = realparend + + +def revert_beamerflex(document): + " Reverts beamer Flex insets " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + new_flexes = {"Emphasize" : "\\emph", "Only" : "\\only", "Uncover" : "\\uncover", + "Visible" : "\\visible", "Invisible" : "\\invisible", + "Alternative" : "\\alt", "Beamer_Note" : "\\note"} + old_flexes = {"Alert" : "\\alert", "Structure" : "\\structure"} + rx = re.compile(r'^\\begin_inset Flex (.+)$') + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Flex", i) + if i == -1: + return + m = rx.match(document.body[i]) + if m: + flextype = m.group(1) + z = find_end_of_inset(document.body, i) + if z == -1: + document.warning("Can't find end of Flex " + flextype + " inset.") + i += 1 + continue + if flextype in new_flexes: + pre = put_cmd_in_ert(new_flexes[flextype]) + arg = find_token(document.body, "\\begin_inset Argument 1", i, z) + if arg != -1: + argend = find_end_of_inset(document.body, arg) + if argend == -1: + document.warning("Can't find end of Argument!") + i += 1 + continue + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg) + endPlain = find_end_of_layout(document.body, beginPlain) + argcontent = document.body[beginPlain + 1 : endPlain] + # Adjust range end + z = z - len(document.body[arg : argend + 1]) + # Remove arg inset + del document.body[arg : argend + 1] + pre += put_cmd_in_ert("<") + argcontent + put_cmd_in_ert(">") + arg = find_token(document.body, "\\begin_inset Argument 2", i, z) + if arg != -1: + argend = find_end_of_inset(document.body, arg) + if argend == -1: + document.warning("Can't find end of Argument!") + i += 1 + continue + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg) + endPlain = find_end_of_layout(document.body, beginPlain) + argcontent = document.body[beginPlain + 1 : endPlain] + # Adjust range end + z = z - len(document.body[arg : argend + 1]) + # Remove arg inset + del document.body[arg : argend + 1] + pre += put_cmd_in_ert("[") + argcontent + put_cmd_in_ert("]") + pre += put_cmd_in_ert("{") + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) + endPlain = find_end_of_layout(document.body, beginPlain) + # Adjust range end + z = z - len(document.body[i : beginPlain + 1]) + z += len(pre) + document.body[i : beginPlain + 1] = pre + post = put_cmd_in_ert("}") + document.body[z - 2 : z + 1] = post + elif flextype in old_flexes: + pre = put_cmd_in_ert(old_flexes[flextype]) + arg = find_token(document.body, "\\begin_inset Argument 1", i, z) + if arg == -1: + i += 1 + continue + argend = find_end_of_inset(document.body, arg) + if argend == -1: + document.warning("Can't find end of Argument!") + i += 1 + continue + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg) + endPlain = find_end_of_layout(document.body, beginPlain) + argcontent = document.body[beginPlain + 1 : endPlain] + # Adjust range end + z = z - len(document.body[arg : argend + 1]) + # Remove arg inset + del document.body[arg : argend + 1] + pre += put_cmd_in_ert("<") + argcontent + put_cmd_in_ert(">") + pre += put_cmd_in_ert("{") + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) + endPlain = find_end_of_layout(document.body, beginPlain) + # Adjust range end + z = z - len(document.body[i : beginPlain + 1]) + z += len(pre) + document.body[i : beginPlain + 1] = pre + post = put_cmd_in_ert("}") + document.body[z - 2 : z + 1] = post + + i += 1 + + ## # Conversion hub # @@ -1868,10 +2525,12 @@ convert = [ [447, [convert_IEEEtran, convert_AASTeX, convert_AGUTeX, convert_IJMP, convert_SIGPLAN, convert_SIGGRAPH, convert_EuropeCV]], [448, [convert_literate]], [449, []], - [450, []] + [450, []], + [451, [convert_beamerargs, convert_againframe_args, convert_corollary_args, convert_quote_args]] ] revert = [ + [450, [revert_beamerargs, revert_beamerargs2, revert_beamerargs3, revert_beamerflex]], [449, [revert_garamondx, revert_garamondx_newtxmath]], [448, [revert_itemargs]], [447, [revert_literate]], diff --git a/src/tex2lyx/TODO.txt b/src/tex2lyx/TODO.txt index 787b29bca4..cd6d8bf188 100644 --- a/src/tex2lyx/TODO.txt +++ b/src/tex2lyx/TODO.txt @@ -85,6 +85,8 @@ Format LaTeX feature LyX feature 449 \item[] \begin_inset Argument item: 450 garamondx.sty, ugm LaTeX font, \font_roman, \font_osf, [garamondx]{newtxmath} \font_math +451 beamer overlay arguments InsetArgument + \command, \begin{env} General diff --git a/src/version.h b/src/version.h index 6577acf87a..63901246ab 100644 --- a/src/version.h +++ b/src/version.h @@ -30,8 +30,8 @@ extern char const * const lyx_version_info; // Do not remove the comment below, so we get merge conflict in // independent branches. Instead add your own. -#define LYX_FORMAT_LYX 450 // spitz: support for URW Garamond -#define LYX_FORMAT_TEX2LYX 450 // spitz: support for URW Garamond +#define LYX_FORMAT_LYX 451 // spitz: support for overlay args in beamer +#define LYX_FORMAT_TEX2LYX 451 // spitz: support for overlay args in beamer #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX #ifndef _MSC_VER -- 2.39.2