"smallcaps", "up", 0};
/// Known special characters which need skip_spaces_braces() afterwards
-char const * const known_special_chars[] = {"ldots", "lyxarrow",
-"textcompwordmark", "slash", 0};
+char const * const known_special_chars[] = {"ldots",
+"lyxarrow", "textcompwordmark",
+"slash", "textasciitilde", "textasciicircum", "textbackslash", 0};
/// the same as known_special_chars with .lyx names
-char const * const known_coded_special_chars[] = {"ldots{}", "menuseparator",
-"textcompwordmark{}", "slash{}", 0};
+char const * const known_coded_special_chars[] = {"\\SpecialChar \\ldots{}\n",
+"\\SpecialChar \\menuseparator\n", "\\SpecialChar \\textcompwordmark{}\n",
+"\\SpecialChar \\slash{}\n", "~", "^", "\n\\backslash\n", 0};
/*!
* Graphics file extensions known by the dvips driver of the graphics package.
width_unit = "in";
width_special = "width";
} else if (latex_width.empty() && outer_type == "framebox") {
- use_ert = true;
+ outer_type == "fbox";
+ width_value = "-999";
+ width_unit = "col%";
+ width_special = "none";
}
if (use_ert) {
ostringstream ss;
if (outer_flags & FLAG_END)
output_ert_inset(os, "\\end{" + outer_type + '}',
parent_context);
- else if (inner_type.empty() && outer_type == "framebox")
- // in this case it is already closed later
- ;
else
output_ert_inset(os, "}", parent_context);
}
begin_inset(os, "Box ");
if (outer_type == "framed")
os << "Framed\n";
- else if (outer_type == "framebox")
+ else if (outer_type == "framebox" || outer_type == "fbox")
os << "Boxed\n";
else if (outer_type == "shadowbox")
os << "Shadowbox\n";
preamble.registerAutomaticallyLoadedPackage("color");
} else if (outer_type == "doublebox")
os << "Doublebox\n";
- else if (outer_type.empty())
+ else if (outer_type.empty() || outer_type == "mbox")
os << "Frameless\n";
else
os << outer_type << '\n';
os << "position \"" << position << "\"\n";
os << "hor_pos \"" << hor_pos << "\"\n";
- os << "has_inner_box " << !inner_type.empty() << "\n";
+ if (outer_type == "mbox")
+ os << "has_inner_box 1\n";
+ else
+ os << "has_inner_box " << !inner_type.empty() << "\n";
os << "inner_pos \"" << inner_pos << "\"\n";
os << "use_parbox " << (inner_type == "parbox" || shadedparbox)
<< '\n';
- os << "use_makebox " << (inner_type == "makebox") << '\n';
- os << "width \"" << width_value << width_unit << "\"\n";
+ if (outer_type == "mbox")
+ os << "use_makebox 1\n";
+ else
+ os << "use_makebox " << (inner_type == "makebox") << '\n';
+ if (outer_type == "fbox" || outer_type == "mbox")
+ os << "width \"-999col%\"\n";
+ else
+ os << "width \"" << width_value << width_unit << "\"\n";
os << "special \"" << width_special << "\"\n";
os << "height \"" << height_value << height_unit << "\"\n";
os << "height_special \"" << height_special << "\"\n";
p.skip_spaces(true);
}
}
- if (outer_type == "shaded") {
+ if (outer_type == "shaded" || outer_type == "fbox"
+ || outer_type == "mbox") {
// These boxes never have an inner box
;
} else if (p.next_token().asInput() == "\\parbox") {
// set catcodes to verbatim early, just in case.
p.setCatcodes(VERBATIM_CATCODES);
string delim = p.get_token().asInput();
- s = p.verbatimStuff(delim);
+ //FIXME: handler error condition
+ s = p.verbatimStuff(delim).second;
// context.new_paragraph(os);
} else
s = p.verbatimEnvironment("lstlisting");
/// Parse a NoWeb Chunk section. The initial "<<" is already parsed.
-void parse_noweb(Parser & p, ostream & os, Context & context)
+bool parse_noweb(Parser & p, ostream & os, Context & context)
{
- // assemble the rest of the keyword
- string name("<<");
- bool chunk = false;
- while (p.good()) {
- Token const & t = p.get_token();
- if (t.asInput() == ">" && p.next_token().asInput() == ">") {
- name += ">>";
- p.get_token();
- chunk = (p.good() && p.next_token().asInput() == "=");
- if (chunk)
- name += p.get_token().asInput();
- break;
- }
- name += t.asInput();
+ // check whether a chunk is possible here.
+ if (!context.new_layout_allowed ||
+ !context.textclass.hasLayout(from_ascii("Chunk"))) {
+ return false;
}
- if (!chunk || !context.new_layout_allowed ||
- !context.textclass.hasLayout(from_ascii("Chunk"))) {
- cerr << "Warning: Could not interpret '" << name
- << "'. Ignoring it." << endl;
- return;
+ p.pushPosition();
+
+ // read the parameters
+ Parser::Arg stuff = p.verbatimStuff(">>=", false);
+ if (!stuff.first) {
+ p.popPosition();
+ return false;
+ }
+ string chunk = "<<" + stuff.second + ">>="
+ + p.verbatimStuff("\n").second + '\n';
+
+ stuff = p.verbatimStuff("\n@");
+ if (!stuff.first) {
+ p.popPosition();
+ return false;
+ }
+ chunk += stuff.second + "\n@";
+ string post_chunk = p.verbatimStuff("\n").second + '\n';
+ if (post_chunk[0] != ' ' && post_chunk[0] != '\n') {
+ p.popPosition();
+ return false;
}
+ chunk += post_chunk;
- // We use new_paragraph instead of check_end_layout because the stuff
- // following the noweb chunk needs to start with a \begin_layout.
- // This may create a new paragraph even if there was none in the
- // noweb file, but the alternative is an invalid LyX file. Since
- // 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[from_ascii("Chunk")]);
- newcontext.check_layout(os);
- os << name;
- while (p.good()) {
- Token const & t = p.get_token();
- // We abuse the parser a bit, because this is no TeX syntax
- // at all.
- if (t.cat() == catEscape)
- os << subst(t.asInput(), "\\", "\n\\backslash\n");
- else {
- ostringstream oss;
- Context tmp(false, context.textclass,
- &context.textclass[from_ascii("Chunk")]);
- tmp.need_end_layout = true;
- tmp.check_layout(oss);
- os << subst(t.asInput(), "\n", oss.str());
- }
- // The chunk is ended by an @ at the beginning of a line.
- // After the @ the line may contain a comment and/or
- // whitespace, but nothing else.
- if (t.asInput() == "@" && p.prev_token().cat() == catNewline &&
- (p.next_token().cat() == catSpace ||
- p.next_token().cat() == catNewline ||
- p.next_token().cat() == catComment)) {
- while (p.good() && p.next_token().cat() == catSpace)
- os << p.get_token().asInput();
- if (p.next_token().cat() == catComment)
- // The comment includes a final '\n'
- os << p.get_token().asInput();
- else {
- if (p.next_token().cat() == catNewline)
- p.get_token();
- os << '\n';
- }
- break;
- }
- }
- newcontext.check_end_layout(os);
+ output_ert(os, chunk, newcontext);
+
+ p.dropPosition();
+ return true;
}
}
else if (t.asInput() == "<"
- && p.next_token().asInput() == "<" && noweb_mode) {
- p.get_token();
- parse_noweb(p, os, context);
- }
+ && p.next_token().asInput() == "<") {
+ bool has_noweb = false;
+ if (noweb_mode) {
+ p.pushPosition();
+ p.get_token();
+ has_noweb = parse_noweb(p, os, context);
+ if (!has_noweb)
+ p.popPosition();
+ }
- else if (t.asInput() == "<" && p.next_token().asInput() == "<") {
- context.check_layout(os);
- begin_inset(os, "Quotes ");
- os << "ard";
- end_inset(os);
- p.get_token();
- skip_braces(p);
+ if (!has_noweb) {
+ context.check_layout(os);
+ begin_inset(os, "Quotes ");
+ //FIXME: this is a right danish quote;
+ // why not a left french quote?
+ os << "ard";
+ end_inset(os);
+ p.get_token();
+ skip_braces(p);
+ }
}
else if (t.cat() == catSpace || (t.cat() == catNewline && ! p.isParagraph()))
Token const prev = p.prev_token();
p.get_token();
if (p.next_token().character() == '`' ||
- (prev.character() == '-' &&
- p.next_token().character() == '-'))
+ (prev.character() == '-' &&
+ p.next_token().character() == '-'))
; // ignore it in {}`` or -{}-
else
output_ert_inset(os, "{}", context);
if (!s.empty()) {
context.check_layout(os);
os << to_utf8(s);
+ if (!rem.empty())
+ output_ert_inset(os,
+ to_utf8(rem), context);
+ for (set<string>::const_iterator it = req.begin();
+ it != req.end(); ++it)
+ preamble.registerAutomaticallyLoadedPackage(*it);
} else
// we did not find a non-ert version
output_ert_inset(os, name, context);
// control sequences
//
- else if (t.cs() == "(") {
+ else if (t.cs() == "(" || t.cs() == "[") {
+ bool const simple = t.cs() == "(";
context.check_layout(os);
begin_inset(os, "Formula");
- os << " \\(";
- parse_math(p, os, FLAG_SIMPLE2, MATH_MODE);
- os << "\\)";
+ os << " \\" << t.cs();
+ parse_math(p, os, simple ? FLAG_SIMPLE2 : FLAG_EQUATION, MATH_MODE);
+ os << '\\' << (simple ? ')' : ']');
end_inset(os);
- }
-
- else if (t.cs() == "[") {
- context.check_layout(os);
- begin_inset(os, "Formula");
- os << " \\[";
- parse_math(p, os, FLAG_EQUATION, MATH_MODE);
- os << "\\]";
- end_inset(os);
- // Prevent the conversion of a line break to a space
- // (bug 7668). This does not change the output, but
- // looks ugly in LyX.
- eat_whitespace(p, os, context, false);
+ if (!simple) {
+ // Prevent the conversion of a line break to a
+ // space (bug 7668). This does not change the
+ // output, but looks ugly in LyX.
+ eat_whitespace(p, os, context, false);
+ }
}
else if (t.cs() == "begin")
}
else if (t.cs() == "caption") {
+ bool starred = false;
+ if (p.next_token().asInput() == "*") {
+ p.get_token();
+ starred = true;
+ }
p.skip_spaces();
context.check_layout(os);
p.skip_spaces();
- begin_inset(os, "Caption Standard\n");
+ if (starred)
+ begin_inset(os, "Caption LongTableNoNumber\n");
+ else
+ begin_inset(os, "Caption Standard\n");
Context newcontext(true, context.textclass, 0, 0, context.font);
newcontext.check_layout(os);
// FIXME InsetArgument is now properly implemented in InsetLayout
preamble.registerAutomaticallyLoadedPackage("listings");
}
- else if (t.cs() == "listoffigures") {
+ else if (t.cs() == "listoffigures" || t.cs() == "listoftables") {
context.check_layout(os);
- begin_inset(os, "FloatList figure\n");
- end_inset(os);
- skip_spaces_braces(p);
- }
-
- else if (t.cs() == "listoftables") {
- context.check_layout(os);
- begin_inset(os, "FloatList table\n");
+ if (t.cs() == "listoffigures")
+ begin_inset(os, "FloatList figure\n");
+ else
+ begin_inset(os, "FloatList table\n");
end_inset(os);
skip_spaces_braces(p);
}
p.skip_spaces();
}
- // the TIPA Combining diacritical marks
- else if (is_known(t.cs(), known_tipa_marks) || t.cs() == "textvertline") {
- preamble.registerAutomaticallyLoadedPackage("tipa");
- preamble.registerAutomaticallyLoadedPackage("tipx");
- context.check_layout(os);
- if (t.cs() == "textvertline") {
- os << "|";
- skip_braces(p);
- continue;
- }
- // try to see whether the string is in unicodesymbols
- bool termination;
- docstring rem;
- string content = trimSpaceAndEol(p.verbatim_item());
- string command = t.asInput() + "{" + content + "}";
- set<string> req;
- docstring s = encodings.fromLaTeXCommand(from_utf8(command),
- Encodings::TEXT_CMD | Encodings::MATH_CMD,
- termination, rem, &req);
- if (!s.empty()) {
- if (!rem.empty())
- cerr << "When parsing " << command
- << ", result is " << to_utf8(s)
- << "+" << to_utf8(rem) << endl;
- os << content << to_utf8(s);
- } else
- // we did not find a non-ert version
- output_ert_inset(os, command, context);
+ else if (t.cs() == "textvertline") {
+ // FIXME: This is not correct, \textvertline is higher than |
+ os << "|";
+ skip_braces(p);
+ continue;
}
else if (t.cs() == "tone" ) {
Encodings::TEXT_CMD | Encodings::MATH_CMD,
termination, rem, &req);
if (!s.empty()) {
- if (!rem.empty())
- cerr << "When parsing " << command
- << ", result is " << to_utf8(s)
- << "+" << to_utf8(rem) << endl;
os << to_utf8(s);
+ if (!rem.empty())
+ output_ert_inset(os, to_utf8(rem), context);
+ for (set<string>::const_iterator it = req.begin();
+ it != req.end(); ++it)
+ preamble.registerAutomaticallyLoadedPackage(*it);
} else
// we did not find a non-ert version
output_ert_inset(os, command, context);
skip_spaces_braces(p);
}
- else if ((where = is_known(t.cs(), known_ref_commands))) {
- // \eqref can also occur if refstyle is used
- if (t.cs() == "eqref" && preamble.refstyle() == "1") {
- context.check_layout(os);
- begin_command_inset(os, "ref", "formatted");
- os << "reference \"eq:"
- << convert_command_inset_arg(p.verbatim_item())
- << "\"\n";
- end_inset(os);
- preamble.registerAutomaticallyLoadedPackage("refstyle");
- } else {
- string const opt = p.getOpt();
- if (opt.empty()) {
- context.check_layout(os);
- begin_command_inset(os, "ref",
- known_coded_ref_commands[where - known_ref_commands]);
- os << "reference \""
- << convert_command_inset_arg(p.verbatim_item())
- << "\"\n";
- end_inset(os);
- if (t.cs() == "vref" || t.cs() == "vpageref")
- preamble.registerAutomaticallyLoadedPackage("varioref");
- } else {
- // LyX does not yet support optional arguments of ref commands
- output_ert_inset(os, t.asInput() + '[' + opt + "]{" +
- p.verbatim_item() + "}", context);
- }
- }
- }
-
- else if ((where = is_known(t.cs(), known_refstyle_commands))) {
+ // handle refstyle first to catch \eqref which can also occur
+ // without refstyle. Only recognize these commands if
+ // refstyle.sty was found in the preamble (otherwise \eqref
+ // and user defined ref commands could be misdetected).
+ else if ((where = is_known(t.cs(), known_refstyle_commands)) &&
+ preamble.refstyle()) {
context.check_layout(os);
- // \eqref can also occur if refstyle is not used
- // this case is already handled in the previous else if
begin_command_inset(os, "ref", "formatted");
os << "reference \"";
os << known_refstyle_prefixes[where - known_refstyle_commands]
preamble.registerAutomaticallyLoadedPackage("refstyle");
}
+ // if refstyle is used, we must not convert \prettyref to a
+ // formatted reference, since that would result in a refstyle command.
+ else if ((where = is_known(t.cs(), known_ref_commands)) &&
+ (t.cs() != "prettyref" || !preamble.refstyle())) {
+ string const opt = p.getOpt();
+ if (opt.empty()) {
+ context.check_layout(os);
+ begin_command_inset(os, "ref",
+ known_coded_ref_commands[where - known_ref_commands]);
+ os << "reference \""
+ << convert_command_inset_arg(p.verbatim_item())
+ << "\"\n";
+ end_inset(os);
+ if (t.cs() == "vref" || t.cs() == "vpageref")
+ preamble.registerAutomaticallyLoadedPackage("varioref");
+ else if (t.cs() == "prettyref")
+ preamble.registerAutomaticallyLoadedPackage("prettyref");
+ } else {
+ // LyX does not yet support optional arguments of ref commands
+ output_ert_inset(os, t.asInput() + '[' + opt + "]{" +
+ p.verbatim_item() + '}', context);
+ }
+ }
+
else if (use_natbib &&
is_known(t.cs(), known_natbib_commands) &&
((t.cs() != "citefullauthor" &&
else if ((where = is_known(t.cs(), known_special_chars))) {
context.check_layout(os);
- os << "\\SpecialChar \\"
- << known_coded_special_chars[where - known_special_chars]
- << '\n';
+ os << known_coded_special_chars[where - known_special_chars];
skip_spaces_braces(p);
}
- else if (t.cs() == "nobreakdash" && p.next_token().asInput() == "-") {
+ else if ((t.cs() == "nobreakdash" && p.next_token().asInput() == "-") ||
+ (t.cs() == "@" && p.next_token().asInput() == ".")) {
context.check_layout(os);
- os << "\\SpecialChar \\nobreakdash-\n";
- p.get_token();
+ os << "\\SpecialChar \\" << t.cs()
+ << p.get_token().asInput() << '\n';
}
else if (t.cs() == "textquotedbl") {
skip_braces(p);
}
- else if (t.cs() == "@" && p.next_token().asInput() == ".") {
- context.check_layout(os);
- os << "\\SpecialChar \\@.\n";
- p.get_token();
- }
-
- else if (t.cs() == "-") {
- context.check_layout(os);
- os << "\\SpecialChar \\-\n";
- }
-
- else if (t.cs() == "textasciitilde") {
- context.check_layout(os);
- os << '~';
- skip_spaces_braces(p);
- }
-
- else if (t.cs() == "textasciicircum") {
- context.check_layout(os);
- os << '^';
- skip_spaces_braces(p);
- }
-
- else if (t.cs() == "textbackslash") {
- context.check_layout(os);
- os << "\n\\backslash\n";
- skip_spaces_braces(p);
- }
-
else if (t.cs() == "_" || t.cs() == "&" || t.cs() == "#"
|| t.cs() == "$" || t.cs() == "{" || t.cs() == "}"
- || t.cs() == "%") {
+ || t.cs() == "%" || t.cs() == "-") {
context.check_layout(os);
- os << t.cs();
+ if (t.cs() == "-")
+ os << "\\SpecialChar \\-\n";
+ else
+ os << t.cs();
}
else if (t.cs() == "char") {
// set catcodes to verbatim early, just in case.
p.setCatcodes(VERBATIM_CATCODES);
string delim = p.get_token().asInput();
- string const arg = p.verbatimStuff(delim);
- output_ert_inset(os, "\\verb" + delim + arg + delim, context);
+ Parser::Arg arg = p.verbatimStuff(delim);
+ if (arg.first)
+ output_ert_inset(os, "\\verb" + delim
+ + arg.second + delim, context);
+ else
+ cerr << "invalid \\verb command. Skipping" << endl;
}
// Problem: \= creates a tabstop inside the tabbing environment
else if (t.cs() == "=" && (flags & FLAG_TABBING))
output_ert_inset(os, t.asInput(), context);
- // 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
- bool termination;
- docstring rem;
- string command = t.asInput() + "{"
- + trimSpaceAndEol(p.verbatim_item())
- + "}";
- set<string> req;
- docstring s = encodings.fromLaTeXCommand(from_utf8(command),
- Encodings::TEXT_CMD | Encodings::MATH_CMD,
- termination, rem, &req);
- if (!s.empty()) {
- if (!rem.empty())
- cerr << "When parsing " << command
- << ", result is " << to_utf8(s)
- << "+" << to_utf8(rem) << endl;
- os << to_utf8(s);
- for (set<string>::const_iterator it = req.begin(); it != req.end(); ++it)
- preamble.registerAutomaticallyLoadedPackage(*it);
- } else
- // we did not find a non-ert version
- output_ert_inset(os, command, context);
- }
-
else if (t.cs() == "\\") {
context.check_layout(os);
if (p.hasOpt())
"", "", t.cs());
}
- else if (t.cs() == "ovalbox" || t.cs() == "Ovalbox" ||
+ else if (t.cs() == "fbox" || t.cs() == "mbox" ||
+ t.cs() == "ovalbox" || t.cs() == "Ovalbox" ||
t.cs() == "shadowbox" || t.cs() == "doublebox")
parse_outer_box(p, os, FLAG_ITEM, outer, context, t.cs(), "");
parse_text(p, os, FLAG_ITEM, outer, context);
output_ert_inset(os, "}", context);
} else {
+ //the syntax is: \framebox[width][position]{content}
string special = p.getFullOpt();
special += p.getOpt();
- // LyX does not yet support \framebox without any option
- if (!special.empty())
- parse_outer_box(p, os, FLAG_ITEM, outer,
- context, t.cs(), special);
- else {
- eat_whitespace(p, os, context, false);
- output_ert_inset(os, "\\framebox{", context);
- parse_text(p, os, FLAG_ITEM, outer, context);
- output_ert_inset(os, "}", context);
- }
+ parse_outer_box(p, os, FLAG_ITEM, outer,
+ context, t.cs(), special);
}
}
string delim = p.get_token().asInput();
if (delim != "{")
cerr << "Warning: bad delimiter for command " << t.asInput() << endl;
- string const arg = p.verbatimStuff("}");
+ //FIXME: handle error condition
+ string const arg = p.verbatimStuff("}").second;
Context newcontext(true, context.textclass);
if (newinsetlayout->forcePlainLayout())
newcontext.layout = &context.textclass.plainLayout();
// try to see whether the string is in unicodesymbols
// Only use text mode commands, since we are in text mode here,
// and math commands may be invalid (bug 6797)
- bool termination;
- docstring rem;
- set<string> req;
string name = t.asInput();
// handle the dingbats and Cyrillic
if (name == "\\ding" || name == "\\textcyr")
name = name + '{' + p.getArg('{', '}') + '}';
// handle the ifsym characters
- if (name == "\\textifsymbol") {
+ else if (name == "\\textifsymbol") {
string const optif = p.getFullOpt();
string const argif = p.getArg('{', '}');
name = name + optif + '{' + argif + '}';
// handle the \ascii characters
// the case of \ascii within braces, as LyX outputs it, is already
// handled for t.cat() == catBegin
- if (name == "\\ascii") {
+ else if (name == "\\ascii") {
// the code is "\asci\xxx"
name = "{" + name + p.get_token().asInput() + "}";
skip_braces(p);
}
// handle some TIPA special characters
- if (name == "\\textglobfall") {
- name = "End";
- skip_braces(p);
- }
- if (name == "\\textdoublevertline") {
- name = "\\textbardbl";
- skip_braces(p);
- }
- if (name == "\\!" ) {
- if (p.next_token().asInput() == "b") {
- p.get_token(); // eat 'b'
- name = "\\texthtb";
+ else if (preamble.isPackageUsed("tipa")) {
+ if (name == "\\textglobfall") {
+ name = "End";
skip_braces(p);
- }
- if (p.next_token().asInput() == "d") {
- p.get_token();
- name = "\\texthtd";
- skip_braces(p);
- }
- if (p.next_token().asInput() == "g") {
- p.get_token();
- name = "\\texthtg";
- skip_braces(p);
- }
- if (p.next_token().asInput() == "G") {
+ } else if (name == "\\s") {
+ // fromLaTeXCommand() does not yet
+ // recognize tipa short cuts
+ name = "\\textsyllabic";
+ } else if (name == "\\=" &&
+ p.next_token().asInput() == "*") {
+ // fromLaTeXCommand() does not yet
+ // recognize tipa short cuts
p.get_token();
- name = "\\texthtscg";
- skip_braces(p);
- }
- if (p.next_token().asInput() == "j") {
- p.get_token();
- name = "\\texthtbardotlessj";
- skip_braces(p);
- }
- if (p.next_token().asInput() == "o") {
- p.get_token();
- name = "\\textbullseye";
+ name = "\\b";
+ } else if (name == "\\textdoublevertline") {
+ // FIXME: This is not correct,
+ // \textvertline is higher than \textbardbl
+ name = "\\textbardbl";
skip_braces(p);
+ } else if (name == "\\!" ) {
+ if (p.next_token().asInput() == "b") {
+ p.get_token(); // eat 'b'
+ name = "\\texthtb";
+ skip_braces(p);
+ } else if (p.next_token().asInput() == "d") {
+ p.get_token();
+ name = "\\texthtd";
+ skip_braces(p);
+ } else if (p.next_token().asInput() == "g") {
+ p.get_token();
+ name = "\\texthtg";
+ skip_braces(p);
+ } else if (p.next_token().asInput() == "G") {
+ p.get_token();
+ name = "\\texthtscg";
+ skip_braces(p);
+ } else if (p.next_token().asInput() == "j") {
+ p.get_token();
+ name = "\\texthtbardotlessj";
+ skip_braces(p);
+ } else if (p.next_token().asInput() == "o") {
+ p.get_token();
+ name = "\\textbullseye";
+ skip_braces(p);
+ }
+ } else if (name == "\\*" ) {
+ if (p.next_token().asInput() == "k") {
+ p.get_token();
+ name = "\\textturnk";
+ skip_braces(p);
+ } else if (p.next_token().asInput() == "r") {
+ p.get_token(); // eat 'b'
+ name = "\\textturnr";
+ skip_braces(p);
+ } else if (p.next_token().asInput() == "t") {
+ p.get_token();
+ name = "\\textturnt";
+ skip_braces(p);
+ } else if (p.next_token().asInput() == "w") {
+ p.get_token();
+ name = "\\textturnw";
+ skip_braces(p);
+ }
}
}
- if (name == "\\*" ) {
- if (p.next_token().asInput() == "k") {
- p.get_token();
- name = "\\textturnk";
- skip_braces(p);
- }
- if (p.next_token().asInput() == "r") {
- p.get_token(); // eat 'b'
- name = "\\textturnr";
- skip_braces(p);
- }
- if (p.next_token().asInput() == "t") {
- p.get_token();
- name = "\\textturnt";
- skip_braces(p);
- }
- if (p.next_token().asInput() == "w") {
- p.get_token();
- name = "\\textturnw";
- skip_braces(p);
- }
+ if ((name.size() == 2 &&
+ contains("\"'.=^`bcdHkrtuv~", name[1]) &&
+ p.next_token().asInput() != "*") ||
+ is_known(name.substr(1), known_tipa_marks)) {
+ // name is a command that corresponds to a
+ // combining character in unicodesymbols.
+ // Append the argument, fromLaTeXCommand()
+ // will either convert it to a single
+ // character or a combining sequence.
+ name += '{' + p.verbatim_item() + '}';
}
// now get the character from unicodesymbols
+ bool termination;
+ docstring rem;
+ set<string> req;
docstring s = encodings.fromLaTeXCommand(from_utf8(name),
Encodings::TEXT_CMD, termination, rem, &req);
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);
+ if (!rem.empty())
+ output_ert_inset(os, to_utf8(rem), context);
if (termination)
skip_spaces_braces(p);
for (set<string>::const_iterator it = req.begin(); it != req.end(); ++it)
output_ert_inset(os, s + ' ', context);
*/
else {
- string name2 = t.asInput();
- if (p.next_token().asInput() == "*") {
+ if (t.asInput() == name &&
+ p.next_token().asInput() == "*") {
// Starred commands like \vspace*{}
p.get_token(); // Eat '*'
- name2 += '*';
+ name += '*';
}
- if (!parse_command(name2, p, os, outer, context))
- output_ert_inset(os, name2, context);
+ if (!parse_command(name, p, os, outer, context))
+ output_ert_inset(os, name, context);
}
}