X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2Ftext.cpp;h=f49012a55941e2760996d1f3ee760a593ce798e6;hb=e43dc9d38cb8919c4acd03bd9cbb1016e980661b;hp=aa5e7fcb29d6589b2aff1e18db343d85cb4792bd;hpb=fc6ce7cd08562fd7bab4427880b46390bb7d2f07;p=lyx.git diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp index aa5e7fcb29..f49012a559 100644 --- a/src/tex2lyx/text.cpp +++ b/src/tex2lyx/text.cpp @@ -3,7 +3,7 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author André Pönitz + * \author André Pönitz * \author Jean-Marc Lasgouttes * * Full author contact details are available in file CREDITS. @@ -14,14 +14,16 @@ #include #include "tex2lyx.h" + #include "Context.h" #include "FloatList.h" -#include "lengthcommon.h" +#include "Layout.h" +#include "Length.h" + #include "support/lstrings.h" #include "support/convert.h" #include "support/filetools.h" -#include #include #include @@ -29,6 +31,15 @@ #include #include +using std::cerr; +using std::endl; + +using std::map; +using std::ostream; +using std::ostringstream; +using std::istringstream; +using std::string; +using std::vector; namespace lyx { @@ -42,18 +53,6 @@ using support::suffixIs; using support::contains; using support::subst; -using std::cerr; -using std::endl; - -using std::map; -using std::ostream; -using std::ostringstream; -using std::istringstream; -using std::string; -using std::vector; - -namespace fs = boost::filesystem; - void parse_text_in_inset(Parser & p, ostream & os, unsigned flags, bool outer, Context const & context) @@ -105,8 +104,9 @@ string parse_text_snippet(Parser & p, unsigned flags, const bool outer, } -char const * const known_latex_commands[] = { "ref", "cite", "label", "index", -"printindex", "pageref", "url", "vref", "vpageref", "prettyref", "eqref", 0 }; +char const * const known_latex_commands[] = { "ref", "cite", "label", "href", + "index", "printindex", "pageref", "url", "vref", "vpageref", "prettyref", + "eqref", 0 }; /*! * natbib commands. @@ -359,7 +359,7 @@ string find_file(string const & name, string const & path, // expects utf8) for (char const * const * what = extensions; *what; ++what) { string const trial = addExtension(name, *what); - if (fs::exists(makeAbsPath(trial, path).toFilesystemEncoding())) + if (makeAbsPath(trial, path).exists()) return trial; } return string(); @@ -434,10 +434,10 @@ void handle_comment(ostream & os, string const & s, Context & context) } -class isLayout : public std::unary_function { +class isLayout : public std::unary_function { public: isLayout(string const name) : name_(name) {} - bool operator()(LyXLayout_ptr const & ptr) const { + bool operator()(LayoutPtr const & ptr) const { return ptr->latexname() == name_; } private: @@ -445,16 +445,16 @@ private: }; -LyXLayout_ptr findLayout(LyXTextClass const & textclass, +LayoutPtr findLayout(TextClass const & textclass, string const & name) { - LyXTextClass::const_iterator beg = textclass.begin(); - LyXTextClass::const_iterator end = textclass.end(); + TextClass::const_iterator beg = textclass.begin(); + TextClass::const_iterator end = textclass.end(); - LyXTextClass::const_iterator + TextClass::const_iterator it = std::find_if(beg, end, isLayout(name)); - return (it == end) ? LyXLayout_ptr() : *it; + return (it == end) ? LayoutPtr() : *it; } @@ -463,7 +463,7 @@ void eat_whitespace(Parser &, ostream &, Context &, bool); void output_command_layout(ostream & os, Parser & p, bool outer, Context & parent_context, - LyXLayout_ptr newlayout) + LayoutPtr newlayout) { parent_context.check_end_layout(os); Context context(true, parent_context.textclass, newlayout, @@ -591,9 +591,11 @@ void parse_box(Parser & p, ostream & os, unsigned flags, bool outer, { string position; string inner_pos; - string height_value = "0"; - string height_unit = "pt"; - string height_special = "none"; + // We need to set the height to the LaTeX default of 1\\totalheight + // for the case when no height argument is given + string height_value = "1"; + string height_unit = "in"; + string height_special = "totalheight"; string latex_height; if (p.next_token().asInput() == "[") { position = p.getArg('[', ']'); @@ -717,7 +719,7 @@ void parse_unknown_environment(Parser & p, string const & name, ostream & os, void parse_environment(Parser & p, ostream & os, bool outer, Context & parent_context) { - LyXLayout_ptr newlayout; + LayoutPtr newlayout; string const name = p.getArg('{', '}'); const bool is_starred = suffixIs(name, '*'); string const unstarred_name = rtrim(name, "*"); @@ -1025,7 +1027,7 @@ void fix_relative_filename(string & name) // FIXME UNICODE encoding of name may be wrong (makeAbsPath expects // utf8) name = to_utf8(makeRelPath(from_utf8(makeAbsPath(name, getMasterFilePath()).absFilename()), - from_utf8(getParentFilePath()))); + from_utf8(getParentFilePath()))); } @@ -1049,7 +1051,7 @@ void parse_noweb(Parser & p, ostream & os, Context & context) } if (!scrap || !context.new_layout_allowed || - !context.textclass.hasLayout("Scrap")) { + !context.textclass.hasLayout(from_ascii("Scrap"))) { cerr << "Warning: Could not interpret '" << name << "'. Ignoring it." << endl; return; @@ -1062,7 +1064,8 @@ void parse_noweb(Parser & p, ostream & os, Context & context) // noweb code chunks are implemented with a layout style in LyX they // always must be in an own paragraph. context.new_paragraph(os); - Context newcontext(true, context.textclass, context.textclass["Scrap"]); + Context newcontext(true, context.textclass, + context.textclass[from_ascii("Scrap")]); newcontext.check_layout(os); os << name; while (p.good()) { @@ -1102,7 +1105,7 @@ void parse_noweb(Parser & p, ostream & os, Context & context) void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, Context & context) { - LyXLayout_ptr newlayout; + LayoutPtr newlayout; // Store the latest bibliographystyle (needed for bibtex inset) string bibliographystyle; bool const use_natbib = used_packages.find("natbib") != used_packages.end(); @@ -1193,7 +1196,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, check_space(p, os, context); else if (t.character() == '[' && noweb_mode && - p.next_token().character() == '[') { + p.next_token().character() == '[') { // These can contain underscores p.putback(); string const s = p.getFullOpt() + ']'; @@ -1424,9 +1427,44 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, context.check_layout(os); eat_whitespace(p, os, context, false); string name = p.get_token().cs(); - while (p.next_token().cat() != catBegin) - name += p.get_token().asString(); - handle_ert(os, "\\def\\" + name + '{' + p.verbatim_item() + '}', context); + eat_whitespace(p, os, context, false); + + // parameter text + bool simple = true; + string paramtext; + int arity = 0; + while (p.next_token().cat() != catBegin) { + if (p.next_token().cat() == catParameter) { + // # found + p.get_token(); + paramtext += "#"; + + // followed by number? + if (p.next_token().cat() == catOther) { + char c = p.getChar(); + paramtext += c; + // number = current arity + 1? + if (c == arity + '0' + 1) + ++arity; + else + simple = false; + } else + paramtext += p.get_token().asString(); + } else { + paramtext += p.get_token().asString(); + simple = false; + } + } + + // only output simple (i.e. compatible) macro as FormulaMacros + string ert = "\\def\\" + name + ' ' + paramtext + '{' + p.verbatim_item() + '}'; + if (simple) { + context.check_layout(os); + begin_inset(os, "FormulaMacro"); + os << "\n" << ert; + end_inset(os); + } else + handle_ert(os, ert, context); } else if (t.cs() == "noindent") { @@ -1477,6 +1515,15 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, p.skip_spaces(); } + // Special handling for \caption + // FIXME: remove this when InsetCaption is supported. + else if (context.new_layout_allowed && + t.cs() == captionlayout->latexname()) { + output_command_layout(os, p, outer, context, + captionlayout); + p.skip_spaces(); + } + else if (t.cs() == "includegraphics") { bool const clip = p.next_token().asInput() == "*"; if (clip) @@ -1491,7 +1538,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, // therefore path is only used for testing // FIXME UNICODE encoding of name and path may be // wrong (makeAbsPath expects utf8) - if (!fs::exists(makeAbsPath(name, path).toFilesystemEncoding())) { + if (!makeAbsPath(name, path).exists()) { // The file extension is probably missing. // Now try to find it out. string const dvips_name = @@ -1523,7 +1570,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, // FIXME UNICODE encoding of name and path may be // wrong (makeAbsPath expects utf8) - if (fs::exists(makeAbsPath(name, path).toFilesystemEncoding())) + if (makeAbsPath(name, path).exists()) fix_relative_filename(name); else cerr << "Warning: Could not find graphics file '" @@ -1647,7 +1694,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, p.skip_spaces(); context.check_layout(os); string const s = p.verbatim_item(); - if (s == "±" || s == "³" || s == "²" || s == "µ") + if (s == "\xb1" || s == "\xb3" || s == "\xb2" || s == "\xb5") os << s; else handle_ert(os, "\\ensuremath{" + s + "}", @@ -2081,12 +2128,12 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, else if (t.cs() == "\"") { context.check_layout(os); string const name = p.verbatim_item(); - if (name == "a") os << 'ä'; - else if (name == "o") os << 'ö'; - else if (name == "u") os << 'ü'; - else if (name == "A") os << 'Ä'; - else if (name == "O") os << 'Ö'; - else if (name == "U") os << 'Ü'; + if (name == "a") os << '\xe4'; + else if (name == "o") os << '\xf6'; + else if (name == "u") os << '\xfc'; + else if (name == "A") os << '\xc4'; + else if (name == "O") os << '\xd6'; + else if (name == "U") os << '\xdc'; else handle_ert(os, "\"{" + name + "}", context); } @@ -2104,7 +2151,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, // subset of LaTeX, so don't parse anything here, // but use the raw argument. // Otherwise we would convert \~{\i} wrongly. - // This will of course not translate \~{\ss} to \~{ß}, + // This will of course not translate \~{\ss} to \~{ß}, // but that does at least compile and does only look // strange on screen. context.check_layout(os); @@ -2115,12 +2162,12 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, else if (t.cs() == "ss") { context.check_layout(os); - os << "ß"; + os << "\xdf"; skip_braces(p); // eat {} } else if (t.cs() == "i" || t.cs() == "j" || t.cs() == "l" || - t.cs() == "L") { + t.cs() == "L") { context.check_layout(os); os << "\\i \\" << t.cs() << "{}\n"; skip_braces(p); // eat {} @@ -2154,8 +2201,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, // therefore path is only used for testing // FIXME UNICODE encoding of filename and path may be // wrong (makeAbsPath expects utf8) - if (t.cs() == "include" && - !fs::exists(makeAbsPath(filename, path).toFilesystemEncoding())) { + if ((t.cs() == "include" || t.cs() == "input") && + !makeAbsPath(filename, path).exists()) { // The file extension is probably missing. // Now try to find it out. string const tex_name = @@ -2166,7 +2213,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, } // FIXME UNICODE encoding of filename and path may be // wrong (makeAbsPath expects utf8) - if (fs::exists(makeAbsPath(filename, path).toFilesystemEncoding())) { + if (makeAbsPath(filename, path).exists()) { string const abstexname = makeAbsPath(filename, path).absFilename(); string const abslyxname = @@ -2269,7 +2316,11 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, string const ert = name + '{' + command + '}' + opt1 + opt2 + '{' + p.verbatim_item() + '}'; - handle_ert(os, ert, context); + + context.check_layout(os); + begin_inset(os, "FormulaMacro"); + os << "\n" << ert; + end_inset(os); } else if (t.cs() == "vspace") {