From 2c0c8fc41faf06113fe83acd6a21215e4183102b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20St=C3=B6hr?= Date: Sun, 6 Nov 2011 15:15:13 +0000 Subject: [PATCH] backporting tex2lyx: fix bug #7843 git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_2_0_X@40137 a592a061-630c-0410-9148-cb99ea01b6c8 --- .../test/box-color-size-space-align.tex | 8 +- src/tex2lyx/test/test-structure.tex | 5 + src/tex2lyx/text.cpp | 168 +++++++++++++++--- status.20x | 2 + 4 files changed, 157 insertions(+), 26 deletions(-) diff --git a/src/tex2lyx/test/box-color-size-space-align.tex b/src/tex2lyx/test/box-color-size-space-align.tex index f0ece400d7..094242804e 100644 --- a/src/tex2lyx/test/box-color-size-space-align.tex +++ b/src/tex2lyx/test/box-color-size-space-align.tex @@ -19,6 +19,8 @@ \usepackage{framed} \usepackage{calc} \usepackage{fancybox} +\PassOptionsToPackage{normalem}{ulem} +\usepackage{ulem} \setlength{\parskip}{3mm} \setlength{\parindent}{0sp} @@ -36,6 +38,8 @@ \definecolor{darkgreen}{cmyk}{0.5, 0, 1, 0.5} +\color[rgb]{0,0,0} + \usepackage{ifpdf} % part of the hyperref bundle \ifpdf % if pdflatex is used @@ -223,9 +227,11 @@ Wavy underbar: \uwave{test} Strike out: \sout{test} +Crossed out: \xout{test} + Noun: \noun{test} -Underbar, ephasized, stikreout: \emph{\uline{\sout{test}}} +Underbar, emphasized, strikeout: \emph{\uline{\sout{test}}} \section{Paragraph spacing} diff --git a/src/tex2lyx/test/test-structure.tex b/src/tex2lyx/test/test-structure.tex index f698ca4d33..ba4bbce724 100644 --- a/src/tex2lyx/test/test-structure.tex +++ b/src/tex2lyx/test/test-structure.tex @@ -25,10 +25,13 @@ \addtolength{\leftmargin}{\labelsep} \renewcommand{\makelabel}[1]{##1\hfil}}} {\end{list}} +\newcommand{\strong}[1]{\textbf{#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. \newenvironment{foo}{==[}{]==} +\usepackage{fixltx2e} % this should cause the fixltx2e module to be loaded + \date{} \@ifundefined{showcaptionsetup}{}{% @@ -78,6 +81,8 @@ an unknown environment \section[Hello!]{A section with optional argument} +This causes the \strong{logikalmkup} module to be loaded. + \begin{quote} An environment \end{quote} diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp index dcbb64a223..d3bb2b49b4 100644 --- a/src/tex2lyx/text.cpp +++ b/src/tex2lyx/text.cpp @@ -781,6 +781,23 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, } else latex_width = p.verbatim_item(); translate_len(latex_width, width_value, width_unit); + bool shadedparbox = false; + if (inner_type == "shaded") { + eat_whitespace(p, os, parent_context, false); + if (outer_type == "parbox") { + // Eat '{' + if (p.next_token().cat() == catBegin) + p.get_token(); + eat_whitespace(p, os, parent_context, false); + shadedparbox = true; + } + p.get_token(); + p.getArg('{', '}'); + } + // If we already read the inner box we have to push the inner env + if (!outer_type.empty() && !inner_type.empty() && + (inner_flags & FLAG_END)) + active_environments.push_back(inner_type); // LyX can't handle length variables bool use_ert = contains(width_unit, '\\') || contains(height_unit, '\\'); if (!use_ert && !outer_type.empty() && !inner_type.empty()) { @@ -793,8 +810,9 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, else p.verbatim_item(); p.skip_spaces(true); - if ((outer_type == "framed" && p.next_token().asInput() != "\\end") || - (outer_type != "framed" && p.next_token().cat() != catEnd)) { + bool const outer_env(outer_type == "framed" || outer_type == "minipage"); + if ((outer_env && p.next_token().asInput() != "\\end") || + (!outer_env && p.next_token().cat() != catEnd)) { // something is between the end of the inner box and // the end of the outer box, so we need to use ERT. use_ert = true; @@ -813,10 +831,12 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, } } if (!inner_type.empty()) { - if (inner_flags & FLAG_END) - ss << "\\begin{" << inner_type << '}'; - else - ss << '\\' << inner_type; + if (inner_type != "shaded") { + if (inner_flags & FLAG_END) + ss << "\\begin{" << inner_type << '}'; + else + ss << '\\' << inner_type; + } if (!position.empty()) ss << '[' << position << ']'; if (!latex_height.empty()) @@ -827,6 +847,8 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, if (!(inner_flags & FLAG_END)) ss << '{'; } + if (inner_type == "shaded") + ss << "\\begin{shaded}"; handle_ert(os, ss.str(), parent_context); if (!inner_type.empty()) { parse_text(p, os, inner_flags, outer, parent_context); @@ -837,6 +859,10 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, handle_ert(os, "}", parent_context); } if (!outer_type.empty()) { + // If we already read the inner box we have to pop + // the inner env + if (!inner_type.empty() && (inner_flags & FLAG_END)) + active_environments.pop_back(); parse_text(p, os, outer_flags, outer, parent_context); if (outer_flags & FLAG_END) handle_ert(os, "\\end{" + outer_type + '}', @@ -851,6 +877,8 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, position = "c"; if (inner_pos.empty()) inner_pos = position; + // FIXME: Support makebox + bool const use_makebox = false; parent_context.check_layout(os); begin_inset(os, "Box "); if (outer_type == "framed") @@ -859,9 +887,11 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, os << "Boxed\n"; else if (outer_type == "shadowbox") os << "Shadowbox\n"; - else if (outer_type == "shaded") + else if ((outer_type == "shaded" && inner_type.empty()) || + (outer_type == "minipage" && inner_type == "shaded") || + (outer_type == "parbox" && inner_type == "shaded")) { os << "Shaded\n"; - else if (outer_type == "doublebox") + } else if (outer_type == "doublebox") os << "Doublebox\n"; else if (outer_type.empty()) os << "Frameless\n"; @@ -871,17 +901,30 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, os << "hor_pos \"" << hor_pos << "\"\n"; os << "has_inner_box " << !inner_type.empty() << "\n"; os << "inner_pos \"" << inner_pos << "\"\n"; - os << "use_parbox " << (inner_type == "parbox") << '\n'; - os << "use_makebox 0\n"; + os << "use_parbox " << (inner_type == "parbox" || shadedparbox) + << '\n'; + os << "use_makebox " << use_makebox << '\n'; os << "width \"" << width_value << width_unit << "\"\n"; os << "special \"none\"\n"; os << "height \"" << height_value << height_unit << "\"\n"; os << "height_special \"" << height_special << "\"\n"; os << "status open\n\n"; - Context context(true, parent_context.textclass); - context.font = parent_context.font; - // If we have no inner box the contens will be read with the outer box + // Unfortunately we can't use parse_text_in_inset: + // InsetBox::forcePlainLayout() is hard coded and does not + // use the inset layout. Apart from that do we call parse_text + // up to two times, but need only one check_end_layout. + + bool const forcePlainLayout = + (!inner_type.empty() || use_makebox) && + outer_type != "shaded" && outer_type != "framed"; + Context context(true, parent_context.textclass); + if (forcePlainLayout) + context.layout = &context.textclass.plainLayout(); + else + context.font = parent_context.font; + + // If we have no inner box the contents will be read with the outer box if (!inner_type.empty()) parse_text(p, os, inner_flags, outer, context); @@ -895,6 +938,10 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, // Find end of outer box, output contents if inner_type is // empty and output possible comments if (!outer_type.empty()) { + // If we already read the inner box we have to pop + // the inner env + if (!inner_type.empty() && (inner_flags & FLAG_END)) + active_environments.pop_back(); // This does not output anything but comments if // inner_type is not empty (see use_ert) parse_text(p, os, outer_flags, outer, context); @@ -942,6 +989,22 @@ void parse_outer_box(Parser & p, ostream & os, unsigned flags, bool outer, } string inner; unsigned int inner_flags = 0; + p.pushPosition(); + if (outer_type == "minipage" || outer_type == "parbox") { + p.skip_spaces(true); + while (p.hasOpt()) { + p.getArg('[', ']'); + p.skip_spaces(true); + } + p.getArg('{', '}'); + p.skip_spaces(true); + if (outer_type == "parbox") { + // Eat '{' + if (p.next_token().cat() == catBegin) + p.get_token(); + eat_whitespace(p, os, parent_context, false); + } + } if (outer_type == "shaded") { // These boxes never have an inner box ; @@ -949,25 +1012,31 @@ void parse_outer_box(Parser & p, ostream & os, unsigned flags, bool outer, inner = p.get_token().cs(); inner_flags = FLAG_ITEM; } else if (p.next_token().asInput() == "\\begin") { - // Is this a minipage? + // Is this a minipage or shaded box? p.pushPosition(); p.get_token(); inner = p.getArg('{', '}'); p.popPosition(); - if (inner == "minipage") { + if (inner == "minipage" || inner == "shaded") + inner_flags = FLAG_END; + else + inner = ""; + } + p.popPosition(); + if (inner_flags == FLAG_END) { + if (inner != "shaded") + { p.get_token(); p.getArg('{', '}'); eat_whitespace(p, os, parent_context, false); - inner_flags = FLAG_END; - } else - inner = ""; - } - if (inner_flags == FLAG_END) { - active_environments.push_back(inner); + } parse_box(p, os, flags, FLAG_END, outer, parent_context, outer_type, special, inner); - active_environments.pop_back(); } else { + if (inner_flags == FLAG_ITEM) { + p.get_token(); + eat_whitespace(p, os, parent_context, false); + } parse_box(p, os, flags, inner_flags, outer, parent_context, outer_type, special, inner); } @@ -1136,7 +1205,29 @@ void parse_environment(Parser & p, ostream & os, bool outer, else if (name == "minipage") { eat_whitespace(p, os, parent_context, false); - parse_box(p, os, 0, FLAG_END, outer, parent_context, "", "", name); + // Test whether this is an outer box of a shaded box + p.pushPosition(); + // swallow arguments + while (p.hasOpt()) { + p.getArg('[', ']'); + p.skip_spaces(true); + } + p.getArg('{', '}'); + p.skip_spaces(true); + Token t = p.get_token(); + bool shaded = false; + if (t.asInput() == "\\begin") { + p.skip_spaces(true); + if (p.getArg('{', '}') == "shaded") + shaded = true; + } + p.popPosition(); + if (shaded) + parse_outer_box(p, os, FLAG_END, outer, + parent_context, name, "shaded"); + else + parse_box(p, os, 0, FLAG_END, outer, parent_context, + "", "", name); p.skip_spaces(); } @@ -3297,8 +3388,35 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, end_inset(os); } - else if (t.cs() == "parbox") - parse_box(p, os, 0, FLAG_ITEM, outer, context, "", "", t.cs()); + else if (t.cs() == "parbox") { + // Test whether this is an outer box of a shaded box + p.pushPosition(); + // swallow arguments + while (p.hasOpt()) { + p.getArg('[', ']'); + p.skip_spaces(true); + } + p.getArg('{', '}'); + p.skip_spaces(true); + // eat the '{' + if (p.next_token().cat() == catBegin) + p.get_token(); + p.skip_spaces(true); + Token to = p.get_token(); + bool shaded = false; + if (to.asInput() == "\\begin") { + p.skip_spaces(true); + if (p.getArg('{', '}') == "shaded") + shaded = true; + } + p.popPosition(); + if (shaded) { + parse_outer_box(p, os, FLAG_ITEM, outer, + context, "parbox", "shaded"); + } else + parse_box(p, os, 0, FLAG_ITEM, outer, context, + "", "", t.cs()); + } else if (t.cs() == "ovalbox" || t.cs() == "Ovalbox" || t.cs() == "shadowbox" || t.cs() == "doublebox") diff --git a/status.20x b/status.20x index d31a51f9a8..fec6b88e07 100644 --- a/status.20x +++ b/status.20x @@ -156,6 +156,8 @@ What's new - Fix tex2lyx handling of inputenc encoding settings (bug 7863). +- Fix (La)TeX import of shaded boxes (bug 7843). + - Store the autosave files of unnamed buffers in the correct directory and make sure they are not left behind after saving (bug 7793).