// needed to handle encodings with babel
bool one_language = true;
string h_inputencoding = "auto";
+string h_paragraph_separation = "indent";
namespace {
//add this to known_languages when updating to lyxformat 266:
-// "armenian"
+// "armenian" (needs special handling since not supported by standard babel)
//add these to known_languages when updating to lyxformat 268:
//"chinese-simplified", "chinese-traditional", "japanese", "korean"
// Both changes require first that support for non-babel languages (CJK,
// add turkmen for lyxformat 383
/**
* known babel language names (including synonyms)
- * not in standard babel: arabic, arabtex, belarusian, serbian-latin, thai
+ * not in standard babel: arabic, arabtex, armenian, belarusian, serbian-latin, thai
* not yet supported by LyX: kurmanji
* please keep this in sync with known_coded_languages line by line!
*/
"ngerman", "ngermanb", "norsk", "nynorsk", "polutonikogreek", "polish",
"portuges", "portuguese", "romanian", "russian", "russianb", "samin",
"scottish", "serbian", "serbian-latin", "slovak", "slovene", "spanish",
-"swedish", "thai", "turkish", "ukraineb", "ukrainian", "uppersorbian",
-"UKenglish", "USenglish", "usorbian", "vietnam", "welsh", 0};
+"swedish", "thai", "turkish", "turkmen", "ukraineb", "ukrainian",
+"uppersorbian", "UKenglish", "USenglish", "usorbian", "vietnam", "welsh",
+0};
/**
* the same as known_languages with .lyx names
"ngerman", "ngerman", "norsk", "nynorsk", "polutonikogreek", "polish",
"portuguese", "portuguese", "romanian", "russian", "russian", "samin",
"scottish", "serbian", "serbian-latin", "slovak", "slovene", "spanish",
-"swedish", "thai", "turkish", "ukrainian", "ukrainian", "uppersorbian",
-"uppersorbian", "english", "english", "vietnamese", "welsh", 0};
+"swedish", "thai", "turkish", "turkmen", "ukrainian", "ukrainian",
+"uppersorbian", "uppersorbian", "english", "english", "vietnamese", "welsh",
+0};
/// languages with english quotes (.lyx names)
const char * const known_english_quotes_languages[] = {"american", "bahasa",
"bahasam", "brazilian", "canadian", "chinese-simplified", "english",
"esperanto", "hebrew", "irish", "korean", "portuguese", "scottish", "thai", 0};
-//add this to known_french_quotes_languages when updating to
-//lyxformat 383: "turkmen"
/// languages with french quotes (.lyx names)
const char * const known_french_quotes_languages[] = {"albanian",
"arabic_arabi", "arabic_arabtex", "basque", "canadien", "catalan", "french",
"galician", "greek", "italian", "norsk", "nynorsk", "polutonikogreek",
-"russian", "spanish", "spanish-mexico", "turkish", "ukrainian", "vietnamese", 0};
+"russian", "spanish", "spanish-mexico", "turkish", "turkmen", "ukrainian",
+"vietnamese", 0};
/// languages with german quotes (.lyx names)
const char * const known_german_quotes_languages[] = {"austrian", "bulgarian",
"courier", "lmtt", "luximono", "fourier", "lmodern", "mathpazo", "mathptmx",
"newcent", 0};
-const char * const known_paper_sizes[] = { "a3paper", "b3paper", "a4paper",
-"b4paper", "a5paper", "b5paper", "executivepaper", "legalpaper",
-"letterpaper", 0};
+const char * const known_paper_sizes[] = { "a0paper", "b0paper", "c0paper",
+"a1paper", "b1paper", "c1paper", "a2paper", "b2paper", "c2paper", "a3paper",
+"b3paper", "c3paper", "a4paper", "b4paper", "c4paper", "a5paper", "b5paper",
+"c5paper", "a6paper", "b6paper", "c6paper", "executivepaper", "legalpaper",
+"letterpaper", "b0j", "b1j", "b2j", "b3j", "b4j", "b5j", "b6j", 0};
const char * const known_class_paper_sizes[] = { "a4paper", "a5paper",
"executivepaper", "legalpaper", "letterpaper", 0};
string h_use_default_options = "false";
string h_options;
string h_language = "english";
+string h_language_package = "default";
+string h_fontencoding = "default";
string h_font_roman = "default";
string h_font_sans = "default";
string h_font_typewriter = "default";
string h_use_geometry = "false";
string h_use_amsmath = "1";
string h_use_esint = "1";
+string h_use_mhchem = "0";
+string h_use_mathdots = "0";
string h_cite_engine = "basic";
string h_use_bibtopic = "false";
string h_paperorientation = "portrait";
+string h_suppress_date = "false";
+string h_use_refstyle = "0";
string h_notefontcolor;
string h_secnumdepth = "3";
string h_tocdepth = "3";
-string h_paragraph_separation = "indent";
string h_defskip = "medskip";
string h_paragraph_indentation = "default";
string h_quotes_language = "english";
string h_listings_params;
string h_tracking_changes = "false";
string h_output_changes = "false";
+string h_html_math_output = "0";
+string h_html_css_as_file = "0";
+string h_html_be_strict = "false";
string h_margins;
else if (name == "esint")
h_use_esint = "2";
+ else if (name == "mhchem")
+ h_use_mhchem = "2";
+
+ else if (name == "mathdots")
+ h_use_mathdots = "2";
+
else if (name == "babel" && !opts.empty()) {
// check if more than one option was used - used later for inputenc
// in case inputenc is parsed before babel, set the encoding to auto
delete_opt(options, known_languages);
}
- else if (name == "fontenc")
- ;// ignore this
+ else if (name == "fontenc") {
+ h_fontencoding = getStringFromVector(options, ",");
+ /* We could do the following for better round trip support,
+ * but this makes the document less portable, so I skip it:
+ if (h_fontencoding == lyxrc.fontenc)
+ h_fontencoding = "global";
+ */
+ options.clear();
+ }
else if (name == "inputenc" || name == "luainputenc") {
// h_inputencoding is only set when there is not more than one
else if (name == "url")
; // ignore this
- else if (LYX_FORMAT >= 408 && name == "subscript")
+ else if (name == "subscript")
; // ignore this
else if (name == "color") {
os << "\\use_default_options " << h_use_default_options << "\n"
<< modules_placeholder
<< "\\language " << h_language << "\n"
+ << "\\language_package " << h_language_package << "\n"
<< "\\inputencoding " << h_inputencoding << "\n"
+ << "\\fontencoding " << h_fontencoding << "\n"
<< "\\font_roman " << h_font_roman << "\n"
<< "\\font_sans " << h_font_sans << "\n"
<< "\\font_typewriter " << h_font_typewriter << "\n"
<< "\\use_geometry " << h_use_geometry << "\n"
<< "\\use_amsmath " << h_use_amsmath << "\n"
<< "\\use_esint " << h_use_esint << "\n"
+ << "\\use_mhchem " << h_use_mhchem << "\n"
+ << "\\use_mathdots " << h_use_mathdots << "\n"
<< "\\cite_engine " << h_cite_engine << "\n"
<< "\\use_bibtopic " << h_use_bibtopic << "\n"
- << "\\paperorientation " << h_paperorientation << '\n';
- if (LYX_FORMAT >= 382 && !h_notefontcolor.empty())
+ << "\\paperorientation " << h_paperorientation << '\n'
+ << "\\suppress_date " << h_suppress_date << '\n'
+ << "\\use_refstyle " << h_use_refstyle << '\n';
+ if (!h_notefontcolor.empty())
os << "\\notefontcolor " << h_notefontcolor << '\n';
os << h_margins
<< "\\secnumdepth " << h_secnumdepth << "\n"
<< "\\tocdepth " << h_tocdepth << "\n"
<< "\\paragraph_separation " << h_paragraph_separation << "\n";
- if (LYX_FORMAT < 365 || h_paragraph_separation == "skip")
+ if (h_paragraph_separation == "skip")
os << "\\defskip " << h_defskip << "\n";
else
os << "\\paragraph_indentation " << h_paragraph_indentation << "\n";
os << "\\listings_params " << h_listings_params << "\n";
os << "\\tracking_changes " << h_tracking_changes << "\n"
<< "\\output_changes " << h_output_changes << "\n"
+ << "\\html_math_output " << h_html_math_output << "\n"
+ << "\\html_css_as_file " << h_html_css_as_file << "\n"
+ << "\\html_be_strict " << h_html_be_strict << "\n"
<< "\\end_header\n\n"
<< "\\begin_body\n";
// clear preamble for subdocuments
if (name == "\\parindent" && content != "") {
if (content[0] == '0')
h_paragraph_separation = "skip";
- else if (LYX_FORMAT >= 365)
- h_paragraph_indentation = translate_len(content);
else
- h_preamble << "\\setlength{" << name
- << "}{" << content << "}";
+ h_paragraph_indentation = translate_len(content);
} else if (name == "\\parskip") {
if (content == "\\smallskipamount")
h_defskip = "smallskip";
string const color = p.getArg('{', '}');
string const space = p.getArg('{', '}');
string const value = p.getArg('{', '}');
- if (LYX_FORMAT >= 382 &&
- color == "note_fontcolor" && space == "rgb") {
+ if (color == "note_fontcolor" && space == "rgb") {
RGBColor c(RGBColorFromLaTeX(value));
h_notefontcolor = X11hexname(c);
} else {
char const * const known_ref_commands[] = { "ref", "pageref", "vref",
"vpageref", "prettyref", "eqref", 0 };
+char const * const known_coded_ref_commands[] = { "ref", "pageref", "vref",
+ "vpageref", "formatted", "eqref", 0 };
+
/*!
* natbib commands.
* The starred forms are also known except for "citefullauthor",
p.next_token().character() != '[')
break;
p.get_token(); // eat '['
- begin_inset(os, "OptArg\n");
+ begin_inset(os, "Argument\n");
os << "status collapsed\n\n";
parse_text_in_inset(p, os, FLAG_BRACK_LAST, outer, context);
end_inset(os);
++optargs;
}
unsigned int reqargs = 0;
- while (LYX_FORMAT >= 392 && reqargs < context.layout->reqargs) {
+ while (reqargs < context.layout->reqargs) {
eat_whitespace(p, os, context, false);
if (p.next_token().cat() != catBegin)
break;
p.get_token(); // eat '{'
- begin_inset(os, "OptArg\n");
+ begin_inset(os, "Argument\n");
os << "status collapsed\n\n";
parse_text_in_inset(p, os, FLAG_BRACE_LAST, outer, context);
end_inset(os);
break;
case optional:
// true because we must not eat whitespace
- // if an optional arg follows me must not strip the
+ // if an optional arg follows we must not strip the
// brackets from this one
if (i < no_arguments - 1 &&
template_arguments[i+1] == optional)
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 << "width \"" << width_value << width_unit << "\"\n";
os << "special \"none\"\n";
os << "height \"" << height_value << height_unit << "\"\n";
break;
}
context.check_deeper(os);
+ // handle known optional and required arguments
+ // layouts require all optional arguments before the required ones
+ // Unfortunately LyX can't handle arguments of list arguments (bug 7468):
+ // It is impossible to place anything after the environment name,
+ // but before the first \\item.
+ if (context.layout->latextype == LATEX_ENVIRONMENT) {
+ bool need_layout = true;
+ unsigned int optargs = 0;
+ while (optargs < context.layout->optargs) {
+ eat_whitespace(p, os, context, false);
+ if (p.next_token().cat() == catEscape ||
+ p.next_token().character() != '[')
+ break;
+ p.get_token(); // eat '['
+ if (need_layout) {
+ context.check_layout(os);
+ need_layout = false;
+ }
+ begin_inset(os, "Argument\n");
+ os << "status collapsed\n\n";
+ parse_text_in_inset(p, os, FLAG_BRACK_LAST, outer, context);
+ end_inset(os);
+ eat_whitespace(p, os, context, false);
+ ++optargs;
+ }
+ unsigned int reqargs = 0;
+ while (reqargs < context.layout->reqargs) {
+ eat_whitespace(p, os, context, false);
+ if (p.next_token().cat() != catBegin)
+ break;
+ p.get_token(); // eat '{'
+ if (need_layout) {
+ context.check_layout(os);
+ need_layout = false;
+ }
+ begin_inset(os, "Argument\n");
+ os << "status collapsed\n\n";
+ parse_text_in_inset(p, os, FLAG_BRACE_LAST, outer, context);
+ end_inset(os);
+ eat_whitespace(p, os, context, false);
+ ++reqargs;
+ }
+ }
parse_text(p, os, FLAG_END, outer, context);
context.check_end_layout(os);
if (parent_context.deeper_paragraph) {
os << subst(t.asInput(), "\\", "\n\\backslash\n");
else {
ostringstream oss;
- begin_inset(oss, "Newline newline");
- end_inset(oss);
+ Context tmp(false, context.textclass,
+ &context.textclass[from_ascii("Scrap")]);
+ tmp.need_end_layout = true;
+ tmp.check_layout(oss);
os << subst(t.asInput(), "\n", oss.str());
}
// The scrap chunk is ended by an @ at the beginning of a line.
if (p.next_token().cat() != catEscape &&
p.next_token().character() == '[') {
p.get_token(); // eat '['
- begin_inset(os, "OptArg\n");
+ begin_inset(os, "Argument\n");
os << "status collapsed\n";
parse_text_in_inset(p, os, FLAG_BRACK_LAST, outer, context);
end_inset(os);
}
else if (t.cs() == "underbar" || t.cs() == "uline") {
+ // \underbar is not 100% correct (LyX outputs \uline
+ // of ulem.sty). The difference is that \ulem allows
+ // line breaks, and \underbar does not.
// Do NOT handle \underline.
// \underbar cuts through y, g, q, p etc.,
// \underline does not.
}
else if (t.cs() == "lyxline") {
+ // swallow size argument (it is not used anyway)
+ p.getArg('{', '}');
+ if (!context.atParagraphStart()) {
+ // so our line is in the middle of a paragraph
+ // we need to add a new line, lest this line
+ // follow the other content on that line and
+ // run off the side of the page
+ // FIXME: This may create an empty paragraph,
+ // but without that it would not be
+ // possible to set noindent below.
+ // Fortunately LaTeX does not care
+ // about the empty paragraph.
+ context.new_paragraph(os);
+ }
+ if (h_paragraph_separation == "indent") {
+ // we need to unindent, lest the line be too long
+ context.add_par_extra_stuff("\\noindent\n");
+ }
context.check_layout(os);
- os << "\\lyxline";
+ begin_command_inset(os, "line", "rule");
+ os << "offset \"0.5ex\"\n"
+ "width \"100line%\"\n"
+ "height \"1pt\"\n";
+ end_inset(os);
}
else if (is_known(t.cs(), known_phrases) ||
string const opt = p.getOpt();
if (opt.empty()) {
context.check_layout(os);
- begin_command_inset(os, "ref", t.cs());
+ char const * const * where = is_known(t.cs(),
+ known_ref_commands);
+ begin_command_inset(os, "ref",
+ known_coded_ref_commands[where - known_ref_commands]);
os << "reference \""
<< convert_command_inset_arg(p.verbatim_item())
<< "\"\n";
else if (t.cs() == "index") {
context.check_layout(os);
- begin_inset(os, "Index\n");
+ begin_inset(os, "Index idx\n");
os << "status collapsed\n";
parse_text_in_inset(p, os, FLAG_ITEM, false, context, "Index");
end_inset(os);
else if (t.cs() == "printindex") {
context.check_layout(os);
begin_command_inset(os, "index_print", "printindex");
+ os << "type \"idx\"\n";
end_inset(os);
skip_spaces_braces(p);
}
skip_spaces_braces(p);
}
- else if (LYX_FORMAT >= 408 &&
- (t.cs() == "textsuperscript" || t.cs() == "textsubscript")) {
+ else if ((t.cs() == "textsuperscript" || t.cs() == "textsubscript")) {
context.check_layout(os);
begin_inset(os, "script ");
os << t.cs().substr(4) << '\n';