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
This commit is contained in:
Uwe Stöhr 2011-11-06 15:15:13 +00:00
parent f78ada8345
commit 2c0c8fc41f
4 changed files with 157 additions and 26 deletions

View File

@ -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}

View File

@ -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}

View File

@ -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")

View File

@ -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).