]> git.lyx.org Git - features.git/commitdiff
tex2lyx: towards beamer overlay argument support.
authorJuergen Spitzmueller <spitz@lyx.org>
Mon, 12 Mar 2018 13:50:19 +0000 (14:50 +0100)
committerJuergen Spitzmueller <spitz@lyx.org>
Mon, 12 Mar 2018 13:56:28 +0000 (14:56 +0100)
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)

src/tex2lyx/Parser.h
src/tex2lyx/TODO.txt
src/tex2lyx/tex2lyx.h
src/tex2lyx/text.cpp

index ca1edebfa2d658295f96debb73632db83eead415..08d07c1af1d6f960a6d4fc291929de61fc50c96e 100644 (file)
@@ -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
 };
 
 
index 5b654fbfb3db69e2472fe99cfe5fbdd7cdb95f85..8ab67dfbd848f8c2855fdcbfa4c328793e92bdb1 100644 (file)
@@ -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<arg>, \begin{env}<arg>
-452    beamer block arguments               InsetArgument
-       \begin{block}<overlay>{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<overlay>[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
index a8ee7dfb45edaa41f813d5975ab780e06d4d5344..224541f9ed318c0477e378ce18a4a88da59bf307 100644 (file)
@@ -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.
index bdf90926e859297787a427c9f6cab34c6994691a..737569080ffcc66911e9c2a1daf018696032004f 100644 (file)
@@ -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);
@@ -2583,7 +2605,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;
@@ -2660,6 +2682,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.