]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/text.cpp
* doxy
[lyx.git] / src / tex2lyx / text.cpp
index 4c44dfd395cc8b3223d7c59921a126213baad6bb..b70e1e4686b0787906bbf64c94b4e809a252c774 100644 (file)
@@ -3,9 +3,9 @@
  * 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
- * \author Uwe Stöhr
+ * \author Uwe Stöhr
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -17,6 +17,7 @@
 #include "tex2lyx.h"
 
 #include "Context.h"
+#include "Encoding.h"
 #include "FloatList.h"
 #include "Layout.h"
 #include "Length.h"
@@ -89,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",
@@ -105,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",
@@ -256,7 +252,7 @@ bool splitLatexLength(string const & len, string & value, string & unit)
 }
 
 
-/// A simple function to translate a latex length to something lyx can
+/// A simple function to translate a latex length to something LyX can
 /// understand. Not perfect, but rather best-effort.
 bool translate_len(string const & length, string & valstring, string & unit)
 {
@@ -344,8 +340,6 @@ void translate_box_len(string const & length, string & value, string & unit, str
 string find_file(string const & name, string const & path,
                 char const * const * extensions)
 {
-       // FIXME UNICODE encoding of name and path may be wrong (makeAbsPath
-       // expects utf8)
        for (char const * const * what = extensions; *what; ++what) {
                string const trial = addExtension(name, *what);
                if (makeAbsPath(trial, path).exists())
@@ -360,6 +354,14 @@ void begin_inset(ostream & os, string const & name)
        os << "\n\\begin_inset " << name;
 }
 
+/*// use this void when format 288 is supported
+void begin_command_inset(ostream & os, string const & name,
+                                                string const & latexname)
+{
+       os << "\n\\begin_inset CommandInset " << name;
+       os << "\nLatexCommand " << latexname << "\n";
+}*/
+
 
 void end_inset(ostream & os)
 {
@@ -437,20 +439,6 @@ Layout const * findLayout(TextClass const & textclass, string const & name)
 void eat_whitespace(Parser &, ostream &, Context &, bool);
 
 
-Layout * captionlayout()
-{
-       static Layout * lay = 0;
-       if (!lay) {
-               lay = new Layout;
-               lay->name_ = from_ascii("Caption");
-               lay->latexname_ = "caption";
-               lay->latextype = LATEX_COMMAND;
-               lay->optionalargs = 1;
-       }
-       return lay;
-}
-
-
 void output_command_layout(ostream & os, Parser & p, bool outer,
                           Context & parent_context,
                           Layout const * newlayout)
@@ -509,7 +497,7 @@ void output_command_layout(ostream & os, Parser & p, bool outer,
  * The drawback is that the logic inside the function becomes
  * complicated, and that is the reason why it is not implemented.
  */
-void check_space(Parser const & p, ostream & os, Context & context)
+void check_space(Parser & p, ostream & os, Context & context)
 {
        Token const next = p.next_token();
        Token const curr = p.curr_token();
@@ -657,7 +645,7 @@ void parse_box(Parser & p, ostream & os, unsigned flags, bool outer,
                parse_text_in_inset(p, os, flags, outer, parent_context);
                end_inset(os);
 #ifdef PRESERVE_LAYOUT
-               // lyx puts a % after the end of the minipage
+               // LyX puts a % after the end of the minipage
                if (p.next_token().cat() == catNewline && p.next_token().cs().size() > 1) {
                        // new paragraph
                        //handle_comment(os, "%dummy", parent_context);
@@ -810,9 +798,9 @@ void parse_environment(Parser & p, ostream & os, bool outer,
        // can be ended by another switches, but also by commands like \footnote or
        // \parbox. So the only safe way is to leave them untouched.
        else if (name == "center" || name == "centering" ||
-               name == "flushleft" || name == "flushright" ||
-               name == "singlespace" || name == "onehalfspace" ||
-               name == "doublespace" || name == "spacing") {
+                name == "flushleft" || name == "flushright" ||
+                name == "singlespace" || name == "onehalfspace" ||
+                name == "doublespace" || name == "spacing") {
                eat_whitespace(p, os, parent_context, false);
                // We must begin a new paragraph if not already done
                if (! parent_context.atParagraphStart()) {
@@ -1050,12 +1038,9 @@ string const normalize_filename(string const & name)
 /// convention (relative to .lyx file) if it is relative
 void fix_relative_filename(string & name)
 {
-       FileName fname(name);
-       if (fname.isAbsolute())
+       if (FileName::isAbsolute(name))
                return;
 
-       // FIXME UNICODE encoding of name may be wrong (makeAbsPath expects
-       // utf8)
        name = to_utf8(makeRelPath(from_utf8(makeAbsPath(name, getMasterFilePath()).absFilename()),
                                   from_utf8(getParentFilePath())));
 }
@@ -1136,8 +1121,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                Context & context)
 {
        Layout const * newlayout = 0;
-       // store the current selectlanguage to be used after \foreignlanguage
-       string selectlang;
        // Store the latest bibliographystyle (needed for bibtex inset)
        string bibliographystyle;
        bool const use_natbib = used_packages.find("natbib") != used_packages.end();
@@ -1262,7 +1245,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                               t.cat() == catParameter) {
                        // This translates "&" to "\\&" which may be wrong...
                        context.check_layout(os);
-                       os << t.character();
+                       os << t.cs();
                }
 
                else if (p.isParagraph()) {
@@ -1281,7 +1264,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                else
                                        os << "\\InsetSpace ~\n";
                        } else
-                               os << t.character();
+                               os << t.cs();
                }
 
                else if (t.cat() == catBegin &&
@@ -1309,7 +1292,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                            next.character() == '*') {
                                p.get_token();
                                if (p.next_token().cat() == catEnd) {
-                                       os << next.character();
+                                       os << next.cs();
                                        p.get_token();
                                } else {
                                        p.putback();
@@ -1449,7 +1432,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        }
                        if (optarg) {
                                if (context.layout->labeltype != LABEL_MANUAL) {
-                                       // lyx does not support \item[\mybullet]
+                                       // LyX does not support \item[\mybullet]
                                        // in itemize environments
                                        handle_ert(os, "[", context);
                                        os << s;
@@ -1466,9 +1449,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 ";
-                       os << p.getOpt();
-                       os << '{' << p.verbatim_item() << '}' << "\n";
+                       begin_inset(os, "LatexCommand ");
+                       os << t.cs() << "\n";
+                       os << "label \"" << p.getOptContent() << "\"\n";
+                       os << "key \"" << p.verbatim_item() << "\"\n";
+                       end_inset(os);
                }
 
                else if (t.cs() == "def") {
@@ -1497,9 +1482,9 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                                else
                                                        simple = false;
                                        } else
-                                               paramtext += p.get_token().asString();
+                                               paramtext += p.get_token().cs();
                                } else {
-                                       paramtext += p.get_token().asString();
+                                       paramtext += p.get_token().cs();
                                        simple = false;
                                }
                        }
@@ -1552,8 +1537,9 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        TeXFont const oldFont = context.font;
                        // save the current font size
                        string const size = oldFont.size;
-                       // reset the font size to default, because the font size switches don't
-                       // affect section headings and the like
+                       // reset the font size to default, because the
+                       // font size switches don't affect section
+                       // headings and the like
                        context.font.size = known_coded_sizes[0];
                        output_font_change(os, oldFont, context.font);
                        // write the layout
@@ -1584,13 +1570,33 @@ 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());
+               else if (t.cs() == "caption") {
+                       // FIXME: this should get some cleanup. All
+                       // the \begin_layout:s are output by the
+                       // Context class!
+                       p.skip_spaces();
+                       context.check_layout(os);
+                       p.skip_spaces();
+                       begin_inset(os, "Caption\n\n");
+                       os << "\\begin_layout " 
+                          << to_utf8(context.textclass.defaultLayout().name()) 
+                          << '\n';
+                       if (p.next_token().character() == '[') {
+                               p.get_token(); // eat '['
+                               begin_inset(os, "OptArg\n");
+                               os << "status collapsed\n";
+                               parse_text_in_inset(p, os, FLAG_BRACK_LAST, outer, context);
+                               end_inset(os);
+                               eat_whitespace(p, os, context, false);
+                       }
+                       parse_text(p, os, FLAG_ITEM, outer, context);
+                       context.check_end_layout(os);
+                       // We don't need really a new paragraph, but
+                       // we must make sure that the next item gets a \begin_layout.
+                       context.new_paragraph(os);
+                       end_inset(os);
                        p.skip_spaces();
+                       os << "\\end_layout\n";
                }
 
                else if (t.cs() == "includegraphics") {
@@ -1605,8 +1611,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        string const path = getMasterFilePath();
                        // We want to preserve relative / absolute filenames,
                        // therefore path is only used for testing
-                       // FIXME UNICODE encoding of name and path may be
-                       // wrong (makeAbsPath expects utf8)
                        if (!makeAbsPath(name, path).exists()) {
                                // The file extension is probably missing.
                                // Now try to find it out.
@@ -1637,8 +1641,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                        name = pdftex_name;
                        }
 
-                       // FIXME UNICODE encoding of name and path may be
-                       // wrong (makeAbsPath expects utf8)
                        if (makeAbsPath(name, path).exists())
                                fix_relative_filename(name);
                        else
@@ -1763,6 +1765,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();
+                       //FIXME: this never triggers in UTF8
                        if (s == "\xb1" || s == "\xb3" || s == "\xb2" || s == "\xb5")
                                os << s;
                        else
@@ -1787,7 +1790,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_inset(os, "LatexCommand ");
+                       os << t.cs() << "\n";
                        end_inset(os);
                        skip_braces(p); // swallow this
                }
@@ -1810,7 +1814,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
 
                else if (t.cs() == "listof") {
                        p.skip_spaces(true);
-                       string const name = p.get_token().asString();
+                       string const name = p.get_token().cs();
                        if (context.textclass.floats().typeExist(name)) {
                                context.check_layout(os);
                                begin_inset(os, "FloatList ");
@@ -1923,6 +1927,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_inset(os, "LatexCommand ");
+                       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 << "reference " << '"' << subst(p.verbatim_item(), "\n", " ") << '"' << "\n";
+                       end_inset(os);
+               }
+
                else if (use_natbib &&
                         is_known(t.cs(), known_natbib_commands) &&
                         ((t.cs() != "citefullauthor" &&
@@ -1930,19 +1945,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;
@@ -1950,14 +1960,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}
@@ -1967,16 +1977,27 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                before.erase();
                                after.erase();
                        }
+                       // 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_inset(os, "LatexCommand ");
-                       os << command << after << before
-                          << '{' << p.verbatim_item() << "}\n";
+                       os << t.cs() << "\n";
+                       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<string> const & options = used_packages["jurabib"];
                        if (find(options.begin(), options.end(),
@@ -2002,24 +2023,86 @@ 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_inset(os, "LatexCommand ");
-                       os << command << after << before
-                          << '{' << citation << "}\n";
+                       os << t.cs() << "\n";
+                       os << "after " << '"' << after << '"' << "\n";
+                       os << "before " << '"' << before << '"' << "\n";
+                       os << "key " << '"' << citation << '"' << "\n";
                        end_inset(os);
                }
 
-               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() == "cite") {
                        context.check_layout(os);
+                       // LyX cannot handle newlines in a latex command
+                       string after = subst(p.getOptContent(), "\n", " ");
                        begin_inset(os, "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 << subst(p.getOpt(), "\n", " ");
-                       os << '{' << subst(p.verbatim_item(), "\n", " ") << "}\n";
+                       os << t.cs() << "\n";
+                       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 << 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() == "nomenclature") {
+                       context.check_layout(os);
+                       begin_inset(os, "LatexCommand ");
+                       os << t.cs() << "\n";
+                       // LyX cannot handle newlines in a latex command
+                       string prefix = subst(p.getOptContent(), "\n", " ");
+                       if (!prefix.empty())
+                               os << "prefix " << '"' << prefix << '"' << "\n";
+                       os << "symbol " << '"' << subst(p.verbatim_item(), "\n", " ") << '"' << "\n";
+                       os << "description " << '"' << subst(p.verbatim_item(), "\n", " ") << '"' << "\n";
+                       end_inset(os);
+               }
+               
+               else if (t.cs() == "label") {
+                       context.check_layout(os);
+                       begin_inset(os, "LatexCommand ");
+                       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() == "printindex") {
+                       context.check_layout(os);
+                       begin_inset(os, "LatexCommand ");
+                       os << t.cs() << "\n";
+                       end_inset(os);
+                       skip_braces(p);
+               }
+
+               else if (t.cs() == "printnomenclature") {
+                       context.check_layout(os);
+                       begin_inset(os, "LatexCommand ");
+                       os << t.cs() << "\n";
+                       end_inset(os);
+                       skip_braces(p);
+               }
+
+               else if (t.cs() == "url") {
+                       context.check_layout(os);
+                       begin_inset(os, "LatexCommand ");
+                       os << t.cs() << "\n";
+                       // LyX cannot handle newlines in a latex command
+                       os << "target " << '"' << subst(p.verbatim_item(), "\n", " ") << '"' << "\n";
                        end_inset(os);
                }
 
@@ -2127,25 +2210,30 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
 
                else if (t.cs() == "selectlanguage") {
                        context.check_layout(os);
-                       // save the language for the case that a \foreignlanguage is used 
-                       selectlang = subst(p.verbatim_item(), "\n", " ");
-                       os << "\\lang " << selectlang << "\n";
-                       
+                       // save the language for the case that a
+                       // \foreignlanguage is used 
+
+                       context.font.language = subst(p.verbatim_item(), "\n", " ");
+                       os << "\\lang " << context.font.language << "\n";
                }
 
                else if (t.cs() == "foreignlanguage") {
                        context.check_layout(os);
                        os << "\n\\lang " << subst(p.verbatim_item(), "\n", " ") << "\n";
                        os << subst(p.verbatim_item(), "\n", " ");
+                       // FIXME: the second argument of selectlanguage
+                       // has to be parsed (like for \textsf, for
+                       // example). 
                        // set back to last selectlanguage
-                       os << "\n\\lang " << selectlang << "\n";
+                       os << "\n\\lang " << context.font.language << "\n";
+               }
+
+               else if (t.cs() == "inputencoding") {
+                       // nothing to write here
+                       string const enc = subst(p.verbatim_item(), "\n", " ");
+                       p.setEncoding(enc);
                }
 
-               else if (t.cs() == "inputencoding")
-                       // write nothing because this is done by LyX using the "\lang"
-                       // information given by selectlanguage and foreignlanguage
-                       subst(p.verbatim_item(), "\n", " ");
-               
                else if (t.cs() == "LyX" || t.cs() == "TeX"
                         || t.cs() == "LaTeX") {
                        context.check_layout(os);
@@ -2238,52 +2326,31 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        handle_ert(os, oss.str(), context);
                }
 
-               else if (t.cs() == "\"") {
-                       context.check_layout(os);
-                       string const name = p.verbatim_item();
-                            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);
-               }
-
                // Problem: \= creates a tabstop inside the tabbing environment
                // and else an accent. In the latter case we really would want
                // \={o} instead of \= o.
                else if (t.cs() == "=" && (flags & FLAG_TABBING))
                        handle_ert(os, t.asInput(), context);
 
-               else if (t.cs() == "H" || t.cs() == "c" || t.cs() == "^"
-                        || t.cs() == "'" || t.cs() == "`"
-                        || t.cs() == "~" || t.cs() == "." || t.cs() == "=") {
-                       // we need the trim as the LyX parser chokes on such spaces
-                       // The argument of InsetLatexAccent is parsed as a
-                       // 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 \~{ß},
-                       // but that does at least compile and does only look
-                       // strange on screen.
-                       context.check_layout(os);
-                       os << "\\i \\" << t.cs() << "{"
-                          << trim(p.verbatim_item(), " ")
-                          << "}\n";
-               }
-
-               else if (t.cs() == "ss") {
-                       context.check_layout(os);
-                       os << "\xdf";
-                       skip_braces(p); // eat {}
-               }
-
-               else if (t.cs() == "i" || t.cs() == "j" || t.cs() == "l" ||
-                        t.cs() == "L") {
-                       context.check_layout(os);
-                       os << "\\i \\" << t.cs() << "{}\n";
-                       skip_braces(p); // eat {}
+               // accents (see Table 6 in Comprehensive LaTeX Symbol List)
+               else if (t.cs().size() == 1 
+                        && contains("\"'.=^`bcdHkrtuv~", t.cs())) {
+                       context.check_layout(os);
+                       // try to see whether the string is in unicodesymbols
+                       docstring rem;
+                       string command = t.asInput() + "{" 
+                               + trim(p.verbatim_item())
+                               + "}";
+                       docstring s = encodings.fromLaTeXCommand(from_utf8(command), rem);
+                       if (!s.empty()) {
+                               if (!rem.empty())
+                                       cerr << "When parsing " << command 
+                                            << ", result is " << to_utf8(s)
+                                            << "+" << to_utf8(rem) << endl;
+                               os << to_utf8(s);
+                       } else
+                               // we did not find a non-ert version
+                               handle_ert(os, command, context);
                }
 
                else if (t.cs() == "\\") {
@@ -2300,8 +2367,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        }
                }
 
-               else if (t.cs() == "newline" ||
-                       t.cs() == "linebreak") {
+               else if (t.cs() == "newline") {
                        context.check_layout(os);
                        os << "\n\\" << t.cs() << "\n";
                        skip_braces(p); // eat {}
@@ -2319,8 +2385,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        string const path = getMasterFilePath();
                        // We want to preserve relative / absolute filenames,
                        // therefore path is only used for testing
-                       // FIXME UNICODE encoding of filename and path may be
-                       // wrong (makeAbsPath expects utf8)
                        if ((t.cs() == "include" || t.cs() == "input") &&
                            !makeAbsPath(filename, path).exists()) {
                                // The file extension is probably missing.
@@ -2331,8 +2395,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                if (!tex_name.empty())
                                        filename = tex_name;
                        }
-                       // FIXME UNICODE encoding of filename and path may be
-                       // wrong (makeAbsPath expects utf8)
                        if (makeAbsPath(filename, path).exists()) {
                                string const abstexname =
                                        makeAbsPath(filename, path).absFilename();
@@ -2342,7 +2404,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                string const lyxname =
                                        changeExtension(filename, ".lyx");
                                if (t.cs() != "verbatiminput" &&
-                                   tex2lyx(abstexname, FileName(abslyxname))) {
+                                   tex2lyx(abstexname, FileName(abslyxname),
+                                           p.getEncoding())) {
                                        os << name << '{' << lyxname << "}\n";
                                } else {
                                        os << name << '{' << filename << "}\n";
@@ -2367,12 +2430,11 @@ 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";
+                       os << "bibtex" << "\n";
+                       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);
                }
 
@@ -2423,7 +2485,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                }
 
                else if (t.cs() == "newpage" ||
-                       t.cs() == "pagebreak" ||
                        t.cs() == "clearpage" ||
                        t.cs() == "cleardoublepage") {
                        context.check_layout(os);
@@ -2537,6 +2598,19 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                }
 
                else {
+                       // try to see whether the string is in unicodesymbols
+                       docstring rem;
+                       docstring s = encodings.fromLaTeXCommand(from_utf8(t.asInput()), rem);
+                       if (!s.empty()) {
+                               if (!rem.empty())
+                                       cerr << "When parsing " << t.cs() 
+                                            << ", result is " << to_utf8(s)
+                                            << "+" << to_utf8(rem) << endl;
+                               context.check_layout(os);
+                               os << to_utf8(s);
+                               p.skip_spaces();
+                               skip_braces(p); // eat {}
+                       }
                        //cerr << "#: " << t << " mode: " << mode << endl;
                        // heuristic: read up to next non-nested space
                        /*
@@ -2550,14 +2624,16 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        cerr << "found ERT: " << s << endl;
                        handle_ert(os, s + ' ', context);
                        */
-                       string name = t.asInput();
-                       if (p.next_token().asInput() == "*") {
-                               // Starred commands like \vspace*{}
-                               p.get_token();                          // Eat '*'
-                               name += '*';
+                       else {
+                               string name = t.asInput();
+                               if (p.next_token().asInput() == "*") {
+                                       // Starred commands like \vspace*{}
+                                       p.get_token();  // Eat '*'
+                                       name += '*';
+                               }
+                               if (!parse_command(name, p, os, outer, context))
+                                       handle_ert(os, name, context);
                        }
-                       if (! parse_command(name, p, os, outer, context))
-                               handle_ert(os, name, context);
                }
 
                if (flags & FLAG_LEAVE) {