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
This commit is contained in:
Uwe Stöhr 2011-11-07 21:57:49 +00:00
parent 0ca0b3ca94
commit ec3b686f8e
4 changed files with 62 additions and 29 deletions

View File

@ -61,7 +61,6 @@ Format LaTeX feature LyX feature
390 forward/reverse search \forward_search, \forward_macro 390 forward/reverse search \forward_search, \forward_macro
391 decimal alignment in tables InsetTabular 391 decimal alignment in tables InsetTabular
392 new beamer format InsetLayout 392 new beamer format InsetLayout
394 \makebox InsetBox use_makebox
396 nameref.sty InsetRef 396 nameref.sty InsetRef
399 automatic mathdots loading \use_mathdots 399 automatic mathdots loading \use_mathdots
401 feyn.sty InsetMathDiagram 401 feyn.sty InsetMathDiagram

View File

@ -102,32 +102,32 @@ blabla \begin{framed}\begin{framed}nested framed\end{framed}\end{framed} blabla
blabla \fbox{fbox} 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]{framebox 2} blabla
blabla \framebox[3cm][l]{framebox 3} blabla blabla \framebox[3cm][l]{framebox 3} blabla
Dies ist ein Beispieltext. % This is an example text. %
\framebox{% \framebox{%
\begin{minipage}[c][1\totalheight][s]{0.2\columnwidth}% \begin{minipage}[c][1\totalheight][s]{0.2\columnwidth}%
\begin{center} \begin{center}
Der Boxinhalt The box content
\par\end{center} \par\end{center}
\begin{center} \begin{center}
ist über die is evenly distributed
\par\end{center} \par\end{center}
\begin{center} \begin{center}
Boxhöhe over the
\par\end{center} \par\end{center}
\begin{center} \begin{center}
gleichmäßig verteilt. box height.
\par\end{center}% \par\end{center}%
\end{minipage}} \end{minipage}}
Dies ist ein Beispieltext. This is an example text.
blabla \ovalbox{ovalbox} blabla blabla \ovalbox{ovalbox} blabla

View File

@ -735,16 +735,29 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags,
string height_unit = "in"; string height_unit = "in";
string height_special = "totalheight"; string height_special = "totalheight";
string latex_height; string latex_height;
string width_value;
string width_unit;
string latex_width;
string width_special = "none";
if (!inner_type.empty() && p.hasOpt()) { 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") { if (position != "t" && position != "c" && position != "b") {
cerr << "invalid position " << position << " for " cerr << "invalid position " << position << " for "
<< inner_type << endl; << inner_type << endl;
position = "c"; position = "c";
} }
if (p.hasOpt()) { if (p.hasOpt()) {
latex_height = p.getArg('[', ']'); if (inner_type != "makebox") {
translate_box_len(latex_height, height_value, height_unit, height_special); latex_height = p.getArg('[', ']');
translate_box_len(latex_height, height_value, height_unit, height_special);
} else
hor_pos = p.getArg('[', ']');
if (p.hasOpt()) { if (p.hasOpt()) {
inner_pos = p.getArg('[', ']'); 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 (inner_type.empty()) {
if (special.empty()) if (special.empty() && outer_type != "framebox")
latex_width = "\\columnwidth"; latex_width = "1\\columnwidth";
else { else {
Parser p2(special); Parser p2(special);
latex_width = p2.getArg('[', ']'); 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(); 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); translate_len(latex_width, width_value, width_unit);
bool shadedparbox = false; bool shadedparbox = false;
if (inner_type == "shaded") { if (inner_type == "shaded") {
eat_whitespace(p, os, parent_context, false); eat_whitespace(p, os, parent_context, false);
@ -819,6 +837,16 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags,
} }
p.popPosition(); 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) { if (use_ert) {
ostringstream ss; ostringstream ss;
if (!outer_type.empty()) { if (!outer_type.empty()) {
@ -867,6 +895,9 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags,
if (outer_flags & FLAG_END) if (outer_flags & FLAG_END)
handle_ert(os, "\\end{" + outer_type + '}', handle_ert(os, "\\end{" + outer_type + '}',
parent_context); parent_context);
else if (inner_type.empty() && outer_type == "framebox")
// in this case it is already closed later
;
else else
handle_ert(os, "}", parent_context); handle_ert(os, "}", parent_context);
} }
@ -877,8 +908,6 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags,
position = "c"; position = "c";
if (inner_pos.empty()) if (inner_pos.empty())
inner_pos = position; inner_pos = position;
// FIXME: Support makebox
bool const use_makebox = false;
parent_context.check_layout(os); parent_context.check_layout(os);
begin_inset(os, "Box "); begin_inset(os, "Box ");
if (outer_type == "framed") 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 << "has_inner_box " << !inner_type.empty() << "\n";
os << "inner_pos \"" << inner_pos << "\"\n"; os << "inner_pos \"" << inner_pos << "\"\n";
os << "use_parbox " << (inner_type == "parbox" || shadedparbox) os << "use_parbox " << (inner_type == "parbox" || shadedparbox)
<< '\n'; << '\n';
os << "use_makebox " << use_makebox << '\n'; os << "use_makebox " << (inner_type == "makebox") << '\n';
os << "width \"" << width_value << width_unit << "\"\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 \"" << height_value << height_unit << "\"\n";
os << "height_special \"" << height_special << "\"\n"; os << "height_special \"" << height_special << "\"\n";
os << "status open\n\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 // InsetBox::forcePlainLayout() is hard coded and does not
// use the inset layout. Apart from that do we call parse_text // use the inset layout. Apart from that do we call parse_text
// up to two times, but need only one check_end_layout. // up to two times, but need only one check_end_layout.
bool const forcePlainLayout = bool const forcePlainLayout =
(!inner_type.empty() || use_makebox) && (!inner_type.empty() || inner_type == "makebox") &&
outer_type != "shaded" && outer_type != "framed"; outer_type != "shaded" && outer_type != "framed";
Context context(true, parent_context.textclass); Context context(true, parent_context.textclass);
if (forcePlainLayout) if (forcePlainLayout)
@ -2668,7 +2696,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
begin_inset(os, "Phantom VPhantom\n"); begin_inset(os, "Phantom VPhantom\n");
os << "status open\n"; os << "status open\n";
parse_text_in_inset(p, os, FLAG_ITEM, outer, context, parse_text_in_inset(p, os, FLAG_ITEM, outer, context,
"Phantom"); "Phantom");
end_inset(os); 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 //\makebox{} will be parsed by parse_box when bug 2956 is fixed
else if (t.cs() == "makebox") { else if (t.cs() == "makebox") {
string arg = t.asInput(); string arg = t.asInput();
if (p.next_token().character() == '(') if (p.next_token().character() == '(') {
//the syntax is: \makebox(x,y)[position]{content} //the syntax is: \makebox(x,y)[position]{content}
arg += p.getFullParentheseArg(); arg += p.getFullParentheseArg();
else
//the syntax is: \makebox[width][position]{content}
arg += p.getFullOpt(); 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" || else if (t.cs() == "smallskip" ||

View File

@ -70,6 +70,8 @@ What's new
* Subfloats (\subfloat). * Subfloats (\subfloat).
* Frameless boxes (\makebox). (\mbox is not yet supported by LyX.)
* Command \date{} in the preamble to suppress the date output. * 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 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 - Store the autosave files of unnamed buffers in the correct directory
and make sure they are not left behind after saving (bug 7793). and make sure they are not left behind after saving (bug 7793).