From ec3b686f8e14f625251a0fd99588c784e3899482 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Uwe=20St=C3=B6hr?= Date: Mon, 7 Nov 2011 21:57:49 +0000 Subject: [PATCH] backporting tex2lyx: - support for \makebox - fix import of boxes without an inner box (the on-screen display was broken because of wrong default width setting) - fix parsing of \framebox{content}, which LyX does not support yet - we have to use ERT git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_2_0_X@40157 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/tex2lyx/TODO.txt | 1 - .../test/box-color-size-space-align.tex | 14 ++-- src/tex2lyx/text.cpp | 72 +++++++++++++------ status.20x | 4 ++ 4 files changed, 62 insertions(+), 29 deletions(-) diff --git a/src/tex2lyx/TODO.txt b/src/tex2lyx/TODO.txt index eda127abe7..9fb7afc53c 100644 --- a/src/tex2lyx/TODO.txt +++ b/src/tex2lyx/TODO.txt @@ -61,7 +61,6 @@ Format LaTeX feature LyX feature 390 forward/reverse search \forward_search, \forward_macro 391 decimal alignment in tables InsetTabular 392 new beamer format InsetLayout -394 \makebox InsetBox use_makebox 396 nameref.sty InsetRef 399 automatic mathdots loading \use_mathdots 401 feyn.sty InsetMathDiagram diff --git a/src/tex2lyx/test/box-color-size-space-align.tex b/src/tex2lyx/test/box-color-size-space-align.tex index 094242804e..4a6e4be0ea 100644 --- a/src/tex2lyx/test/box-color-size-space-align.tex +++ b/src/tex2lyx/test/box-color-size-space-align.tex @@ -102,32 +102,32 @@ blabla \begin{framed}\begin{framed}nested framed\end{framed}\end{framed} blabla blabla \fbox{fbox} blabla -blabla \framebox{framebox 1} blabla +blabla \framebox{fr\textcolor{blue}{ame}box 1} blabla blabla \framebox[3cm]{framebox 2} blabla blabla \framebox[3cm][l]{framebox 3} blabla -Dies ist ein Beispieltext. % +This is an example text. % \framebox{% \begin{minipage}[c][1\totalheight][s]{0.2\columnwidth}% \begin{center} - Der Boxinhalt + The box content \par\end{center} \begin{center} - ist über die + is evenly distributed \par\end{center} \begin{center} - Boxhöhe + over the \par\end{center} \begin{center} - gleichmäßig verteilt. + box height. \par\end{center}% \end{minipage}} -Dies ist ein Beispieltext. +This is an example text. blabla \ovalbox{ovalbox} blabla diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp index de4b9cb8c3..c1572f0bc0 100644 --- a/src/tex2lyx/text.cpp +++ b/src/tex2lyx/text.cpp @@ -735,16 +735,29 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, string height_unit = "in"; string height_special = "totalheight"; string latex_height; + string width_value; + string width_unit; + string latex_width; + string width_special = "none"; if (!inner_type.empty() && p.hasOpt()) { - position = p.getArg('[', ']'); + if (inner_type != "makebox") + position = p.getArg('[', ']'); + else { + latex_width = p.getArg('[', ']'); + translate_box_len(latex_width, width_value, width_unit, width_special); + position = "t"; + } if (position != "t" && position != "c" && position != "b") { cerr << "invalid position " << position << " for " << inner_type << endl; position = "c"; } if (p.hasOpt()) { - latex_height = p.getArg('[', ']'); - translate_box_len(latex_height, height_value, height_unit, height_special); + if (inner_type != "makebox") { + latex_height = p.getArg('[', ']'); + translate_box_len(latex_height, height_value, height_unit, height_special); + } else + hor_pos = p.getArg('[', ']'); if (p.hasOpt()) { inner_pos = p.getArg('[', ']'); @@ -758,12 +771,9 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, } } } - string width_value; - string width_unit; - string latex_width; if (inner_type.empty()) { - if (special.empty()) - latex_width = "\\columnwidth"; + if (special.empty() && outer_type != "framebox") + latex_width = "1\\columnwidth"; else { Parser p2(special); latex_width = p2.getArg('[', ']'); @@ -778,9 +788,17 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, } } } - } else + } else if (inner_type != "makebox") latex_width = p.verbatim_item(); + // if e.g. only \ovalbox{content} was used, set the width to 1\columnwidth + // as this is LyX's standard for such cases (except for makebox) + // \framebox is special and handled below + if (latex_width.empty() && inner_type != "makebox" + && outer_type != "framebox") + latex_width = "1\\columnwidth"; + translate_len(latex_width, width_value, width_unit); + bool shadedparbox = false; if (inner_type == "shaded") { eat_whitespace(p, os, parent_context, false); @@ -819,6 +837,16 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, } p.popPosition(); } + // if only \makebox{content} was used we can set its width to 1\width + // because this identic and also identic to \mbox + // this doesn't work for \framebox{content}, thus we have to use ERT for this + if (latex_width.empty() && inner_type == "makebox") { + width_value = "1"; + width_unit = "in"; + width_special = "width"; + } else if (latex_width.empty() && outer_type == "framebox") { + use_ert = true; + } if (use_ert) { ostringstream ss; if (!outer_type.empty()) { @@ -867,6 +895,9 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, if (outer_flags & FLAG_END) handle_ert(os, "\\end{" + outer_type + '}', parent_context); + else if (inner_type.empty() && outer_type == "framebox") + // in this case it is already closed later + ; else handle_ert(os, "}", parent_context); } @@ -877,8 +908,6 @@ 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") @@ -902,10 +931,10 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, os << "has_inner_box " << !inner_type.empty() << "\n"; os << "inner_pos \"" << inner_pos << "\"\n"; os << "use_parbox " << (inner_type == "parbox" || shadedparbox) - << '\n'; - os << "use_makebox " << use_makebox << '\n'; + << '\n'; + os << "use_makebox " << (inner_type == "makebox") << '\n'; os << "width \"" << width_value << width_unit << "\"\n"; - os << "special \"none\"\n"; + os << "special \"" << width_special << "\"\n"; os << "height \"" << height_value << height_unit << "\"\n"; os << "height_special \"" << height_special << "\"\n"; os << "status open\n\n"; @@ -914,9 +943,8 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags, // 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) && + (!inner_type.empty() || inner_type == "makebox") && outer_type != "shaded" && outer_type != "framed"; Context context(true, parent_context.textclass); if (forcePlainLayout) @@ -2668,7 +2696,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, begin_inset(os, "Phantom VPhantom\n"); os << "status open\n"; parse_text_in_inset(p, os, FLAG_ITEM, outer, context, - "Phantom"); + "Phantom"); end_inset(os); } @@ -3433,13 +3461,15 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, //\makebox{} will be parsed by parse_box when bug 2956 is fixed else if (t.cs() == "makebox") { string arg = t.asInput(); - if (p.next_token().character() == '(') + if (p.next_token().character() == '(') { //the syntax is: \makebox(x,y)[position]{content} arg += p.getFullParentheseArg(); - else - //the syntax is: \makebox[width][position]{content} arg += p.getFullOpt(); - handle_ert(os, arg + p.getFullOpt(), context); + handle_ert(os, arg + p.get_token().asInput(), context); + } else + //the syntax is: \makebox[width][position]{content} + parse_box(p, os, 0, FLAG_ITEM, outer, context, + "", "", t.cs()); } else if (t.cs() == "smallskip" || diff --git a/status.20x b/status.20x index c54e73538c..0c5b0e0ca4 100644 --- a/status.20x +++ b/status.20x @@ -70,6 +70,8 @@ What's new * Subfloats (\subfloat). + * Frameless boxes (\makebox). (\mbox is not yet supported by LyX.) + * Command \date{} in the preamble to suppress the date output. @@ -162,6 +164,8 @@ What's new - Fix LaTeX import of tabular environment with optional argument. +- Fix tex2lyx handling of framed boxes without inner box. + - Store the autosave files of unnamed buffers in the correct directory and make sure they are not left behind after saving (bug 7793). -- 2.39.5