From 31c293dec38a8910764e40b7f3851dc4284164a3 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Mon, 12 Mar 2018 14:50:19 +0100 Subject: [PATCH] tex2lyx: towards beamer overlay argument support. Implemented: Overlay and standard overlay arguments for commands and environments. Still missing: * List item overlay * itemcommand overlay (\overprint) * overlay via LatexParam (e.g., Flex:ArticleMode) Needs fixing: * General list argument (\begin{itemize}[arg]) * nested content in a frame with no title (empty par) (cherry picked from commit 949de66956309ea787b86d69a00b72d154b4d4db) --- src/tex2lyx/Parser.h | 3 ++- src/tex2lyx/TODO.txt | 7 ----- src/tex2lyx/tex2lyx.h | 5 ++-- src/tex2lyx/text.cpp | 62 ++++++++++++++++++++++++++++++++----------- 4 files changed, 52 insertions(+), 25 deletions(-) diff --git a/src/tex2lyx/Parser.h b/src/tex2lyx/Parser.h index ca1edebfa2..08d07c1af1 100644 --- a/src/tex2lyx/Parser.h +++ b/src/tex2lyx/Parser.h @@ -67,7 +67,8 @@ enum { FLAG_OPTION = 1 << 11, // read [...] style option FLAG_BRACED = 1 << 12, // read {...} style argument FLAG_CELL = 1 << 13, // read table cell - FLAG_TABBING = 1 << 14 // We are inside a tabbing environment + FLAG_TABBING = 1 << 14, // We are inside a tabbing environment + FLAG_RDELIM = 1 << 15, // next right delimiter ends the parsing }; diff --git a/src/tex2lyx/TODO.txt b/src/tex2lyx/TODO.txt index 9588691285..b42ea3fd28 100644 --- a/src/tex2lyx/TODO.txt +++ b/src/tex2lyx/TODO.txt @@ -52,10 +52,6 @@ Format LaTeX feature LyX feature 415 automatic undertilde loading \use_package undertilde 443 unicode-math.sty InsetMath* 448 -451 beamer overlay arguments InsetArgument - \command, \begin{env} -452 beamer block arguments InsetArgument - \begin{block}{title} 453 automatic stmaryrd loading \use_package stmaryrd 454 beamer overprint environment InsetArgument, layout Overprint \begin{overprint}[maxlength] @@ -64,9 +60,6 @@ Format LaTeX feature LyX feature 455 beamer frametitle command \begin_layout FrameTitle \frametitle[short]{long} 457 automatic stackrel loading \use_package stackrel -459 beamer: \begin{frame}, \begin_layout Frame - \begin{frame}[plain], \begin_layout PlainFrame - \begin{frame}[fragile] \begin_layout FragileFrame 466 Powerdot updates: \pause[] layout Pause \onslide{}{} InsetFlex, InsetArgument diff --git a/src/tex2lyx/tex2lyx.h b/src/tex2lyx/tex2lyx.h index c830b0531f..34da5902b0 100644 --- a/src/tex2lyx/tex2lyx.h +++ b/src/tex2lyx/tex2lyx.h @@ -48,7 +48,7 @@ extern std::string rgbcolor2code(std::string const & name); std::string translate_len(std::string const &); void parse_text(Parser & p, std::ostream & os, unsigned flags, bool outer, - Context & context); + Context & context, std::string const rdelim = std::string()); void check_comment_bib(std::ostream & os, Context & context); void fix_child_filename(std::string & name); @@ -67,7 +67,8 @@ std::string find_file(std::string const & name, std::string const & path, */ void parse_text_in_inset(Parser & p, std::ostream & os, unsigned flags, bool outer, Context const & context, - InsetLayout const * layout = 0); + InsetLayout const * layout = 0, + std::string const rdelim = std::string()); /// Guess document language from \p p if CJK is used. /// \p lang is used for all non-CJK contents. diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp index f0b4aedace..a36b7558f1 100644 --- a/src/tex2lyx/text.cpp +++ b/src/tex2lyx/text.cpp @@ -54,7 +54,8 @@ void output_arguments(ostream &, Parser &, bool, bool, bool, Context &, void parse_text_in_inset(Parser & p, ostream & os, unsigned flags, bool outer, - Context const & context, InsetLayout const * layout) + Context const & context, InsetLayout const * layout, + string const rdelim) { bool const forcePlainLayout = layout ? layout->forcePlainLayout() : false; @@ -66,7 +67,7 @@ void parse_text_in_inset(Parser & p, ostream & os, unsigned flags, bool outer, if (layout) output_arguments(os, p, outer, false, false, newcontext, layout->latexargs()); - parse_text(p, os, flags, outer, newcontext); + parse_text(p, os, flags, outer, newcontext, rdelim); if (layout) output_arguments(os, p, outer, false, true, newcontext, layout->postcommandargs()); @@ -77,14 +78,15 @@ void parse_text_in_inset(Parser & p, ostream & os, unsigned flags, bool outer, namespace { void parse_text_in_inset(Parser & p, ostream & os, unsigned flags, bool outer, - Context const & context, string const & name) + Context const & context, string const & name, + string const rdelim = string()) { InsetLayout const * layout = 0; DocumentClass::InsetLayouts::const_iterator it = context.textclass.insetLayouts().find(from_ascii(name)); if (it != context.textclass.insetLayouts().end()) layout = &(it->second); - parse_text_in_inset(p, os, flags, outer, context, layout); + parse_text_in_inset(p, os, flags, outer, context, layout, rdelim); } /// parses a paragraph snippet, useful for example for \\emph{...} @@ -764,7 +766,15 @@ void output_arguments(ostream & os, Parser & p, bool outer, bool need_layout, bo if (lait->second.mandatory) { if (p.next_token().cat() != catBegin) break; - p.get_token(); // eat '{' + string ldelim = to_utf8(lait->second.ldelim); + string rdelim = to_utf8(lait->second.rdelim); + if (ldelim.empty()) + ldelim = "{"; + if (rdelim.empty()) + rdelim = "}"; + p.get_token(); // eat ldelim + if (ldelim.size() > 1) + p.get_token(); // eat ldelim if (need_layout) { context.check_layout(os); need_layout = false; @@ -773,13 +783,24 @@ void output_arguments(ostream & os, Parser & p, bool outer, bool need_layout, bo if (post) os << "post:"; os << i << "\nstatus collapsed\n\n"; - parse_text_in_inset(p, os, FLAG_BRACE_LAST, outer, context); + parse_text_in_inset(p, os, FLAG_RDELIM, outer, context, 0, rdelim); end_inset(os); } else { - if (p.next_token().cat() == catEscape || - p.next_token().character() != '[') + string ldelim = to_utf8(lait->second.ldelim); + string rdelim = to_utf8(lait->second.rdelim); + if (ldelim.empty()) + ldelim = "["; + if (rdelim.empty()) + rdelim = "]"; + string tok = p.next_token().asInput(); + // we only support delimiters with max 2 chars for now. + if (ldelim.size() > 1) + tok += p.next_next_token().asInput(); + if (p.next_token().cat() == catEscape || tok != ldelim) continue; - p.get_token(); // eat '[' + p.get_token(); // eat ldelim + if (ldelim.size() > 1) + p.get_token(); // eat ldelim if (need_layout) { context.check_layout(os); need_layout = false; @@ -788,7 +809,7 @@ void output_arguments(ostream & os, Parser & p, bool outer, bool need_layout, bo if (post) os << "post:"; os << i << "\nstatus collapsed\n\n"; - parse_text_in_inset(p, os, FLAG_BRACK_LAST, outer, context); + parse_text_in_inset(p, os, FLAG_RDELIM, outer, context, 0, rdelim); end_inset(os); } eat_whitespace(p, os, context, false); @@ -2060,10 +2081,11 @@ void parse_environment(Parser & p, ostream & os, bool outer, } context.check_deeper(os); // handle known optional and required arguments - // Unfortunately LyX can't handle arguments of list arguments (bug 7468): - // It is impossible to place anything after the environment name, - // but before the first \\item. - if (context.layout->latextype == LATEX_ENVIRONMENT) + // FIXME: for item environments, this is currently + // placed wrongly (in an empty paragraph). It has to go to + // the first \item par instead. + if (context.layout->latextype == LATEX_ENVIRONMENT + || context.layout->latextype == LATEX_ITEM_ENVIRONMENT) output_arguments(os, p, outer, false, false, context, context.layout->latexargs()); parse_text(p, os, FLAG_END, outer, context); @@ -2579,7 +2601,7 @@ void fix_child_filename(string & name) void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, - Context & context) + Context & context, string const rdelim) { Layout const * newlayout = 0; InsetLayout const * newinsetlayout = 0; @@ -2654,6 +2676,16 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, return; if (t.cat() == catEnd && (flags & FLAG_BRACE_LAST)) return; + string tok = t.asInput(); + // we only support delimiters with max 2 chars for now. + if (rdelim.size() > 1) + tok += p.next_token().asInput(); + if (t.cat() != catEscape && !rdelim.empty() + && tok == rdelim && (flags & FLAG_RDELIM)) { + if (rdelim.size() > 1) + p.get_token(); // eat rdelim + return; + } // If there is anything between \end{env} and \begin{env} we // don't need to output a separator.