From f8d655d4e2a3f4e668a36aa20daf55f999257100 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Uwe=20St=C3=B6hr?= Date: Thu, 11 Jun 2009 23:46:41 +0000 Subject: [PATCH] tex2lyx/text.cpp: tex2lyx supports now fileformat 252 git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@30059 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/tex2lyx/text.cpp | 153 +++++++++++++++++++++++++++++++------------ 1 file changed, 111 insertions(+), 42 deletions(-) diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp index b56b56b9df..81605f3efc 100644 --- a/src/tex2lyx/text.cpp +++ b/src/tex2lyx/text.cpp @@ -90,14 +90,11 @@ 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_ref_commands[] = { "ref", "pageref", "vref", + "vpageref", "prettyref", "eqref", 0 }; /*! * natbib commands. - * We can't put these into known_latex_commands because the argument order - * is reversed in lyx if there are 2 arguments. * The starred forms are also known. */ char const * const known_natbib_commands[] = { "cite", "citet", "citep", @@ -106,8 +103,6 @@ char const * const known_natbib_commands[] = { "cite", "citet", "citep", /*! * jurabib commands. - * We can't put these into known_latex_commands because the argument order - * is reversed in lyx if there are 2 arguments. * No starred form other than "cite*" known. */ char const * const known_jurabib_commands[] = { "cite", "citet", "citep", @@ -359,12 +354,22 @@ void begin_inset(ostream & os, string const & name) os << "\n\\begin_inset " << name; } +void begin_Cinset(ostream & os, string const & name) +{ + os << "\n\\begin_inset CommandInset " << name; +} + void end_inset(ostream & os) { os << "\n\\end_inset\n\n"; } +void LatexCommand(ostream & os, string const & name) +{ + os << "\nLatexCommand " << name << "\n"; +} + void skip_braces(Parser & p) { @@ -1462,9 +1467,11 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, else if (t.cs() == "bibitem") { context.set_item(); context.check_layout(os); - os << "\\bibitem "; + begin_Cinset(os, "bibitem"); + LatexCommand(os, "bibitem"); os << p.getOpt(); - os << '{' << p.verbatim_item() << '}' << "\n"; + os << "key " << '"' << p.verbatim_item() << '"' << "\n"; + end_inset(os); } else if (t.cs() == "def") { @@ -1781,7 +1788,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, else if (t.cs() == "tableofcontents") { p.skip_spaces(); context.check_layout(os); - begin_inset(os, "LatexCommand \\tableofcontents\n"); + begin_Cinset(os, "toc"); + LatexCommand(os, "tableofcontents"); end_inset(os); skip_braces(p); // swallow this } @@ -1917,6 +1925,17 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, os << "\\lyxline"; } + else if (is_known(t.cs(), known_ref_commands)) { + context.check_layout(os); + begin_Cinset(os, "ref"); + LatexCommand(os, t.cs()); + // lyx cannot handle newlines in a latex command + // FIXME: Move the substitution into parser::getOpt()? + os << subst(p.getOpt(), "\n", " "); + os << "reference " << '"' << subst(p.verbatim_item(), "\n", " ") << '"' << "\n"; + end_inset(os); + } + else if (use_natbib && is_known(t.cs(), known_natbib_commands) && ((t.cs() != "citefullauthor" && @@ -1924,19 +1943,14 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, t.cs() != "citeyearpar") || p.next_token().asInput() != "*")) { context.check_layout(os); - // tex lyx - // \citet[before][after]{a} \citet[after][before]{a} - // \citet[before][]{a} \citet[][before]{a} - // \citet[after]{a} \citet[after]{a} - // \citet{a} \citet{a} - string command = '\\' + t.cs(); + string command = t.cs(); if (p.next_token().asInput() == "*") { command += '*'; p.get_token(); } - if (command == "\\citefullauthor") + if (command == "citefullauthor") // alternative name for "\\citeauthor*" - command = "\\citeauthor*"; + command = "citeauthor*"; // text before the citation string before; @@ -1944,14 +1958,14 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, string after; get_cite_arguments(p, true, before, after); - if (command == "\\cite") { + if (command == "cite") { // \cite without optional argument means // \citet, \cite with at least one optional // argument means \citep. if (before.empty() && after.empty()) - command = "\\citet"; + command = "citet"; else - command = "\\citep"; + command = "citep"; } if (before.empty() && after == "[]") // avoid \citet[]{a} @@ -1961,16 +1975,27 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, before.erase(); after.erase(); } - begin_inset(os, "LatexCommand "); - os << command << after << before - << '{' << p.verbatim_item() << "}\n"; + // remove the brackets around after and before + if (!after.empty()) { + after.erase(0, 1); + after.erase(after.length() - 1, 1); + } + if (!before.empty()) { + before.erase(0, 1); + before.erase(before.length() - 1, 1); + } + begin_Cinset(os, "citation"); + LatexCommand(os, command); + os << "after " << '"' << after << '"' << "\n"; + os << "before " << '"' << before << '"' << "\n"; + os << "key " << '"' << p.verbatim_item() << '"' << "\n"; end_inset(os); } else if (use_jurabib && is_known(t.cs(), known_jurabib_commands)) { context.check_layout(os); - string const command = '\\' + t.cs(); + string const command = t.cs(); char argumentOrder = '\0'; vector const & options = used_packages["jurabib"]; if (find(options.begin(), options.end(), @@ -1996,24 +2021,69 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, "package options if you used an\n" "earlier jurabib version." << endl; } + if (!after.empty()) { + after.erase(0, 1); + after.erase(after.length() - 1, 1); + } + if (!before.empty()) { + before.erase(0, 1); + before.erase(before.length() - 1, 1); + } + begin_Cinset(os, "citation"); + LatexCommand(os, command); + os << "after " << '"' << after << '"' << "\n"; + os << "before " << '"' << before << '"' << "\n"; + os << "key " << '"' << citation << '"' << "\n"; + end_inset(os); + } + + else if (t.cs() == "cite") { + context.check_layout(os); + // lyx cannot handle newlines in a latex command + string after = subst(p.getOpt(), "\n", " "); + if (!after.empty()) { + after.erase(0, 1); + after.erase(after.length() - 1, 1); + } + begin_Cinset(os, "citation"); + LatexCommand(os, t.cs()); + os << "after " << '"' << after << '"' << "\n"; + os << "key " << '"' << subst(p.verbatim_item(), "\n", " ") << '"' << "\n"; + end_inset(os); + } + + else if (t.cs() == "index") { + context.check_layout(os); begin_inset(os, "LatexCommand "); - os << command << after << before - << '{' << citation << "}\n"; + os << t.cs() << "\n";; + // lyx cannot handle newlines in a latex command + os << "name " << '"' << subst(p.verbatim_item(), "\n", " ") << '"' << "\n"; + end_inset(os); + } + + else if (t.cs() == "label") { + context.check_layout(os); + begin_Cinset(os, t.cs()); + LatexCommand(os, t.cs()); + // lyx cannot handle newlines in a latex command + os << "name " << '"' << subst(p.verbatim_item(), "\n", " ") << '"' << "\n"; + end_inset(os); + } + + else if (t.cs() == "printindex") { + context.check_layout(os); + begin_Cinset(os, "index_print"); + LatexCommand(os, t.cs()); end_inset(os); + skip_braces(p); } - else if (is_known(t.cs(), known_latex_commands)) { - // This needs to be after the check for natbib and - // jurabib commands, because "cite" has different - // arguments with natbib and jurabib. + else if (t.cs() == "url") { context.check_layout(os); begin_inset(os, "LatexCommand "); - os << '\\' << t.cs(); + os << t.cs() << "\n";; // lyx cannot handle newlines in a latex command - // FIXME: Move the substitution into parser::getOpt()? - os << subst(p.getOpt(), "\n", " "); - os << subst(p.getOpt(), "\n", " "); - os << '{' << subst(p.verbatim_item(), "\n", " ") << "}\n"; + os << "target " << '"' << subst(p.verbatim_item(), "\n", " ") << '"' << "\n"; end_inset(os); } @@ -2342,13 +2412,12 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, else if (t.cs() == "bibliography") { context.check_layout(os); - begin_inset(os, "LatexCommand "); - os << "\\bibtex"; + begin_Cinset(os, "bibtex"); + LatexCommand(os, "bibtex"); + os << "bibfiles " << '"' << p.verbatim_item() << '"' << "\n"; // Do we have a bibliographystyle set? - if (!bibliographystyle.empty()) { - os << '[' << bibliographystyle << ']'; - } - os << '{' << p.verbatim_item() << "}\n"; + if (!bibliographystyle.empty()) + os << "options " << '"' << bibliographystyle << '"' << "\n"; end_inset(os); } -- 2.39.2