mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-09-20 06:49:56 +00:00
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:
parent
f78ada8345
commit
2c0c8fc41f
@ -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}
|
||||
|
@ -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}
|
||||
|
@ -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")
|
||||
|
@ -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).
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user