2003-08-19 10:04:35 +00:00
|
|
|
/**
|
2011-10-30 12:47:45 +00:00
|
|
|
* \file Preamble.cpp
|
2003-08-19 10:04:35 +00:00
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
*
|
2008-11-14 15:58:50 +00:00
|
|
|
* \author André Pönitz
|
|
|
|
* \author Uwe Stöhr
|
2003-08-19 10:04:35 +00:00
|
|
|
*
|
2003-08-23 00:17:00 +00:00
|
|
|
* Full author contact details are available in file CREDITS.
|
2003-04-17 15:05:17 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
// {[(
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
#include "Preamble.h"
|
2003-04-17 15:05:17 +00:00
|
|
|
#include "tex2lyx.h"
|
|
|
|
|
2013-01-19 18:47:15 +00:00
|
|
|
#include "Encoding.h"
|
2008-03-07 03:53:21 +00:00
|
|
|
#include "LayoutFile.h"
|
2007-04-29 22:04:32 +00:00
|
|
|
#include "Layout.h"
|
2007-04-26 11:30:54 +00:00
|
|
|
#include "Lexer.h"
|
2007-04-29 22:04:32 +00:00
|
|
|
#include "TextClass.h"
|
2013-07-07 07:56:34 +00:00
|
|
|
#include "version.h"
|
2007-12-17 16:04:46 +00:00
|
|
|
|
2007-12-06 22:09:31 +00:00
|
|
|
#include "support/convert.h"
|
2007-12-17 16:04:46 +00:00
|
|
|
#include "support/FileName.h"
|
2003-07-26 00:15:38 +00:00
|
|
|
#include "support/filetools.h"
|
2006-08-13 09:46:28 +00:00
|
|
|
#include "support/lstrings.h"
|
2003-07-26 00:15:38 +00:00
|
|
|
|
2010-06-29 17:09:40 +00:00
|
|
|
#include "support/regex.h"
|
2008-09-28 20:15:08 +00:00
|
|
|
|
2003-04-17 15:05:17 +00:00
|
|
|
#include <algorithm>
|
|
|
|
#include <iostream>
|
|
|
|
|
2007-12-12 10:16:00 +00:00
|
|
|
using namespace std;
|
2007-12-12 18:57:56 +00:00
|
|
|
using namespace lyx::support;
|
2010-06-29 17:09:40 +00:00
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
namespace lyx {
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
Preamble preamble;
|
2007-12-09 17:42:05 +00:00
|
|
|
|
2003-04-17 15:05:17 +00:00
|
|
|
namespace {
|
|
|
|
|
2012-10-06 07:38:14 +00:00
|
|
|
// CJK languages are handled in text.cpp, polyglossia languages are listed
|
|
|
|
// further down.
|
2011-01-12 21:04:39 +00:00
|
|
|
/**
|
|
|
|
* known babel language names (including synonyms)
|
2011-10-21 21:11:37 +00:00
|
|
|
* not in standard babel: arabic, arabtex, armenian, belarusian, serbian-latin, thai
|
2011-01-12 21:04:39 +00:00
|
|
|
* please keep this in sync with known_coded_languages line by line!
|
|
|
|
*/
|
|
|
|
const char * const known_languages[] = {"acadian", "afrikaans", "albanian",
|
2019-06-03 14:43:16 +00:00
|
|
|
"american", "arabic", "arabtex", "australian", "austrian", "azerbaijani", "bahasa", "bahasai",
|
2016-10-16 13:33:23 +00:00
|
|
|
"bahasam", "basque", "belarusian", "bosnian", "brazil", "brazilian", "breton", "british",
|
2011-12-08 23:58:30 +00:00
|
|
|
"bulgarian", "canadian", "canadien", "catalan", "croatian", "czech", "danish",
|
|
|
|
"dutch", "english", "esperanto", "estonian", "farsi", "finnish", "francais",
|
2016-10-16 13:33:23 +00:00
|
|
|
"french", "frenchb", "frenchle", "frenchpro", "friulan", "galician", "german", "germanb",
|
2015-04-06 04:00:11 +00:00
|
|
|
"georgian", "greek", "hebrew", "hungarian", "icelandic", "indon", "indonesian",
|
|
|
|
"interlingua", "irish", "italian", "japanese", "kazakh", "kurmanji", "latin",
|
2016-10-16 13:33:23 +00:00
|
|
|
"latvian", "lithuanian", "lowersorbian", "lsorbian", "macedonian", "magyar", "malay", "meyalu",
|
2015-04-06 04:00:11 +00:00
|
|
|
"mongolian", "naustrian", "newzealand", "ngerman", "ngermanb", "norsk", "nswissgerman",
|
2016-10-16 13:33:23 +00:00
|
|
|
"nynorsk", "piedmontese", "polutonikogreek", "polish", "portuges", "portuguese",
|
|
|
|
"romanian", "romansh", "russian", "russianb", "samin", "scottish", "serbian", "serbian-latin",
|
|
|
|
"slovak", "slovene", "spanish", "swedish", "swissgerman", "thai", "turkish", "turkmen",
|
2014-07-10 20:15:34 +00:00
|
|
|
"ukraineb", "ukrainian", "uppersorbian", "UKenglish", "USenglish", "usorbian",
|
|
|
|
"vietnam", "welsh",
|
2011-10-21 21:11:37 +00:00
|
|
|
0};
|
2011-01-12 21:04:39 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* the same as known_languages with .lyx names
|
|
|
|
* please keep this in sync with known_languages line by line!
|
|
|
|
*/
|
|
|
|
const char * const known_coded_languages[] = {"french", "afrikaans", "albanian",
|
2019-06-03 14:43:16 +00:00
|
|
|
"american", "arabic_arabi", "arabic_arabtex", "australian", "austrian", "azerbaijani", "bahasa", "bahasa",
|
2016-10-16 13:33:23 +00:00
|
|
|
"bahasam", "basque", "belarusian", "bosnian", "brazilian", "brazilian", "breton", "british",
|
2011-12-08 23:58:30 +00:00
|
|
|
"bulgarian", "canadian", "canadien", "catalan", "croatian", "czech", "danish",
|
|
|
|
"dutch", "english", "esperanto", "estonian", "farsi", "finnish", "french",
|
2016-10-16 13:33:23 +00:00
|
|
|
"french", "french", "french", "french", "friulan", "galician", "german", "german",
|
2015-04-06 04:00:11 +00:00
|
|
|
"georgian", "greek", "hebrew", "magyar", "icelandic", "bahasa", "bahasa",
|
|
|
|
"interlingua", "irish", "italian", "japanese", "kazakh", "kurmanji", "latin",
|
2016-10-16 13:33:23 +00:00
|
|
|
"latvian", "lithuanian", "lowersorbian", "lowersorbian", "macedonian", "magyar", "bahasam", "bahasam",
|
2015-04-06 04:00:11 +00:00
|
|
|
"mongolian", "naustrian", "newzealand", "ngerman", "ngerman", "norsk", "german-ch",
|
2016-10-16 13:33:23 +00:00
|
|
|
"nynorsk", "piedmontese", "polutonikogreek", "polish", "portuguese", "portuguese",
|
|
|
|
"romanian", "romansh", "russian", "russian", "samin", "scottish", "serbian", "serbian-latin",
|
|
|
|
"slovak", "slovene", "spanish", "swedish", "german-ch-old", "thai", "turkish", "turkmen",
|
2014-07-10 20:15:34 +00:00
|
|
|
"ukrainian", "ukrainian", "uppersorbian", "english", "english", "uppersorbian",
|
|
|
|
"vietnamese", "welsh",
|
2011-10-21 21:11:37 +00:00
|
|
|
0};
|
2011-01-12 21:04:39 +00:00
|
|
|
|
2018-03-11 17:04:23 +00:00
|
|
|
/// languages with british quotes (.lyx names)
|
|
|
|
const char * const known_british_quotes_languages[] = {"british", "welsh", 0};
|
|
|
|
|
|
|
|
/// languages with cjk quotes (.lyx names)
|
|
|
|
const char * const known_cjk_quotes_languages[] = {"chinese-traditional",
|
|
|
|
"japanese", "japanese-cjk", 0};
|
|
|
|
|
|
|
|
/// languages with cjk-angle quotes (.lyx names)
|
|
|
|
const char * const known_cjkangle_quotes_languages[] = {"korean", 0};
|
|
|
|
|
2012-10-06 07:38:14 +00:00
|
|
|
/// languages with danish quotes (.lyx names)
|
|
|
|
const char * const known_danish_quotes_languages[] = {"danish", 0};
|
|
|
|
|
2011-01-12 21:04:39 +00:00
|
|
|
/// languages with english quotes (.lyx names)
|
2011-12-08 23:58:30 +00:00
|
|
|
const char * const known_english_quotes_languages[] = {"american", "australian",
|
2019-06-03 14:43:16 +00:00
|
|
|
"bahasa", "bahasam", "bengali", "brazilian", "canadian", "chinese-simplified", "english",
|
2018-03-11 17:04:23 +00:00
|
|
|
"esperanto", "farsi", "interlingua", "irish", "newzealand", "scottish",
|
|
|
|
"thai", "turkish", "vietnamese", 0};
|
2009-12-11 04:11:44 +00:00
|
|
|
|
2011-01-12 21:04:39 +00:00
|
|
|
/// languages with french quotes (.lyx names)
|
2018-03-11 17:04:23 +00:00
|
|
|
const char * const known_french_quotes_languages[] = {"ancientgreek",
|
|
|
|
"arabic_arabi", "arabic_arabtex", "asturian", "belarusian", "breton",
|
|
|
|
"canadien", "catalan", "french", "friulan", "galician", "italian", "occitan",
|
|
|
|
"piedmontese", "portuguese", "spanish", "spanish-mexico", 0};
|
2009-12-11 04:11:44 +00:00
|
|
|
|
2011-01-12 21:04:39 +00:00
|
|
|
/// languages with german quotes (.lyx names)
|
2009-12-11 04:11:44 +00:00
|
|
|
const char * const known_german_quotes_languages[] = {"austrian", "bulgarian",
|
2018-03-11 17:04:23 +00:00
|
|
|
"czech", "estonian", "georgian", "german", "icelandic", "latvian", "lithuanian",
|
|
|
|
"lowersorbian", "macedonian", "naustrian", "ngerman", "romansh", "slovak", "slovene",
|
2016-10-16 13:33:23 +00:00
|
|
|
"uppersorbian", 0};
|
2009-12-11 04:11:44 +00:00
|
|
|
|
2011-01-12 21:04:39 +00:00
|
|
|
/// languages with polish quotes (.lyx names)
|
2016-10-16 13:33:23 +00:00
|
|
|
const char * const known_polish_quotes_languages[] = {"afrikaans", "bosnian", "croatian",
|
2018-03-11 17:04:23 +00:00
|
|
|
"dutch", "magyar", "polish", "romanian", "serbian", "serbian-latin", 0};
|
|
|
|
|
|
|
|
/// languages with russian quotes (.lyx names)
|
2019-06-03 14:43:16 +00:00
|
|
|
const char * const known_russian_quotes_languages[] = {"azerbaijani", "oldrussian",
|
|
|
|
"russian", "ukrainian", 0};
|
2009-12-11 04:11:44 +00:00
|
|
|
|
2011-01-12 21:04:39 +00:00
|
|
|
/// languages with swedish quotes (.lyx names)
|
2018-03-11 17:04:23 +00:00
|
|
|
const char * const known_swedish_quotes_languages[] = {"finnish", "swedish", 0};
|
|
|
|
|
|
|
|
/// languages with swiss quotes (.lyx names)
|
|
|
|
const char * const known_swiss_quotes_languages[] = {"albanian",
|
2019-06-03 14:43:16 +00:00
|
|
|
"armenian", "basque", "churchslavonic", "german-ch", "german-ch-old",
|
2018-03-11 17:04:23 +00:00
|
|
|
"norsk", "nynorsk", "turkmen", "ukrainian", "vietnamese", 0};
|
2009-12-11 04:11:44 +00:00
|
|
|
|
2011-10-25 17:30:27 +00:00
|
|
|
/// known language packages from the times before babel
|
|
|
|
const char * const known_old_language_packages[] = {"french", "frenchle",
|
|
|
|
"frenchpro", "german", "ngerman", "pmfrench", 0};
|
|
|
|
|
2007-11-28 00:03:11 +00:00
|
|
|
char const * const known_fontsizes[] = { "10pt", "11pt", "12pt", 0 };
|
2003-04-17 15:05:17 +00:00
|
|
|
|
2019-04-08 09:44:53 +00:00
|
|
|
const char * const known_roman_font_packages[] = { "ae", "beraserif", "bookman",
|
2018-08-10 17:38:06 +00:00
|
|
|
"ccfonts", "chancery", "charter", "cmr", "cochineal", "crimson", "DejaVuSerif", "DejaVuSerifCondensed", "fourier",
|
2018-03-11 10:12:42 +00:00
|
|
|
"garamondx", "libertine", "libertineRoman", "libertine-type1", "lmodern", "mathdesign", "mathpazo",
|
2019-04-08 09:44:53 +00:00
|
|
|
"mathptmx", "MinionPro", "newcent", "noto", "noto-serif", "PTSerif", "tgbonum", "tgchorus",
|
2018-03-15 14:44:49 +00:00
|
|
|
"tgpagella", "tgschola", "tgtermes", "utopia", "xcharter", 0 };
|
2007-12-05 20:02:49 +00:00
|
|
|
|
2019-04-08 09:44:53 +00:00
|
|
|
const char * const known_sans_font_packages[] = { "avant", "berasans", "biolinum",
|
2018-08-10 17:38:06 +00:00
|
|
|
"biolinum-type1", "cmbr", "cmss", "DejaVuSans", "DejaVuSansCondensed", "helvet", "iwona", "iwonac", "iwonal", "iwonalc",
|
2019-04-08 09:44:53 +00:00
|
|
|
"kurier", "kurierc", "kurierl", "kurierlc", "lmss", "noto", "noto-sans", "PTSans",
|
2018-03-11 10:12:42 +00:00
|
|
|
"tgadventor", "tgheros", "uop", 0 };
|
2013-02-10 23:47:09 +00:00
|
|
|
|
2019-04-08 09:44:53 +00:00
|
|
|
const char * const known_typewriter_font_packages[] = { "beramono", "cmtl", "cmtt",
|
2018-08-10 17:38:06 +00:00
|
|
|
"courier", "DejaVuSansMono", "lmtt", "luximono", "fourier", "libertineMono", "libertineMono-type1", "lmodern",
|
2019-04-08 09:44:53 +00:00
|
|
|
"mathpazo", "mathptmx", "newcent", "noto", "noto-mono", "PTMono", "tgcursor", "txtt", 0 };
|
2007-12-05 20:02:49 +00:00
|
|
|
|
2019-04-08 09:44:53 +00:00
|
|
|
const char * const known_math_font_packages[] = { "eulervm", "newtxmath", 0};
|
2013-02-11 01:34:03 +00:00
|
|
|
|
2011-10-22 19:37:10 +00:00
|
|
|
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};
|
2008-05-16 20:25:44 +00:00
|
|
|
|
|
|
|
const char * const known_class_paper_sizes[] = { "a4paper", "a5paper",
|
|
|
|
"executivepaper", "legalpaper", "letterpaper", 0};
|
|
|
|
|
2011-12-14 00:20:41 +00:00
|
|
|
const char * const known_paper_margins[] = { "lmargin", "tmargin", "rmargin",
|
2008-05-16 20:25:44 +00:00
|
|
|
"bmargin", "headheight", "headsep", "footskip", "columnsep", 0};
|
|
|
|
|
|
|
|
const char * const known_coded_paper_margins[] = { "leftmargin", "topmargin",
|
|
|
|
"rightmargin", "bottommargin", "headheight", "headsep", "footskip",
|
|
|
|
"columnsep", 0};
|
|
|
|
|
2011-01-12 22:03:15 +00:00
|
|
|
/// commands that can start an \if...\else...\endif sequence
|
|
|
|
const char * const known_if_commands[] = {"if", "ifarydshln", "ifbraket",
|
|
|
|
"ifcancel", "ifcolortbl", "ifeurosym", "ifmarginnote", "ifmmode", "ifpdf",
|
|
|
|
"ifsidecap", "ifupgreek", 0};
|
|
|
|
|
2015-05-14 20:23:44 +00:00
|
|
|
const char * const known_basic_colors[] = {"black", "blue", "brown", "cyan",
|
|
|
|
"darkgray", "gray", "green", "lightgray", "lime", "magenta", "orange", "olive",
|
|
|
|
"pink", "purple", "red", "teal", "violet", "white", "yellow", 0};
|
2011-10-26 01:18:27 +00:00
|
|
|
|
2015-05-14 20:23:44 +00:00
|
|
|
const char * const known_basic_color_codes[] = {"#000000", "#0000ff", "#964B00", "#00ffff",
|
|
|
|
"#a9a9a9", "#808080", "#00ff00", "#d3d3d3", "#bfff00", "#ff00ff", "#ff7f00", "#808000",
|
2015-05-14 21:05:05 +00:00
|
|
|
"#ffc0cb", "#800080", "#ff0000", "#008080", "#8f00ff", "#ffffff", "#ffff00", 0};
|
2011-10-26 01:18:27 +00:00
|
|
|
|
2011-01-12 22:03:15 +00:00
|
|
|
/// conditional commands with three arguments like \@ifundefined{}{}{}
|
|
|
|
const char * const known_if_3arg_commands[] = {"@ifundefined", "IfFileExists",
|
|
|
|
0};
|
|
|
|
|
2018-03-09 16:27:55 +00:00
|
|
|
/*!
|
|
|
|
* Known file extensions for TeX files as used by \\includeonly
|
|
|
|
*/
|
|
|
|
char const * const known_tex_extensions[] = {"tex", 0};
|
|
|
|
|
2011-11-06 17:03:59 +00:00
|
|
|
/// packages that work only in xetex
|
2012-06-08 00:37:36 +00:00
|
|
|
/// polyglossia is handled separately
|
2011-11-06 17:03:59 +00:00
|
|
|
const char * const known_xetex_packages[] = {"arabxetex", "fixlatvian",
|
2012-06-08 00:37:36 +00:00
|
|
|
"fontbook", "fontwrap", "mathspec", "philokalia", "unisugar",
|
2011-11-06 17:03:59 +00:00
|
|
|
"xeCJK", "xecolor", "xecyr", "xeindex", "xepersian", "xunicode", 0};
|
|
|
|
|
2011-12-13 19:40:05 +00:00
|
|
|
/// packages that are automatically skipped if loaded by LyX
|
2012-05-06 15:37:09 +00:00
|
|
|
const char * const known_lyx_packages[] = {"amsbsy", "amsmath", "amssymb",
|
2013-02-17 01:11:54 +00:00
|
|
|
"amstext", "amsthm", "array", "babel", "booktabs", "calc", "CJK", "color",
|
2015-05-18 22:21:12 +00:00
|
|
|
"float", "fontspec", "framed", "graphicx", "hhline", "ifthen", "longtable",
|
2018-06-24 16:13:03 +00:00
|
|
|
"makeidx", "minted", "multirow", "nomencl", "pdfpages", "prettyref", "refstyle",
|
2018-06-24 08:05:15 +00:00
|
|
|
"rotating", "rotfloat", "splitidx", "setspace", "subscript", "tabularx","textcomp", "tipa",
|
|
|
|
"tipx", "tone", "ulem", "url", "varioref", "verbatim", "wrapfig", "xcolor", "xltabular",
|
tex2lyx: import minted listings
This commit updates tex2lyx in order to also import minted listings.
For the floating version of a listing, minted uses the listing
environment, a concept that is not shared with the listings package,
towards which our listings inset is geared.
For this reason, a kludge is necessary when importing minted listings
not previously exported by LyX itself.
If the floating listing contains only a caption and a label (other
than the listing itself), everything is fine and the import is (or
aims to be) perfect. But, as in all other floating ebvironments,
one can also stick there other elements, which don't have a place
in the listings inset. So, in order to avoid a data loss, tex2lyx
sticks everything into the caption. In this way, things may be
rearranged in the GUI, if necessary. There is no other way, apart
from a complete redesign of the listings inset, of course. However,
I think that this is an acceptable compromise.
2017-06-17 00:23:00 +00:00
|
|
|
"xunicode", 0};
|
2011-12-13 19:40:05 +00:00
|
|
|
|
2011-10-30 18:12:49 +00:00
|
|
|
// codes used to remove packages that are loaded automatically by LyX.
|
|
|
|
// Syntax: package_beg_sep<name>package_mid_sep<package loading code>package_end_sep
|
|
|
|
const char package_beg_sep = '\001';
|
|
|
|
const char package_mid_sep = '\002';
|
|
|
|
const char package_end_sep = '\003';
|
|
|
|
|
2010-12-12 18:47:02 +00:00
|
|
|
|
2009-09-22 13:23:36 +00:00
|
|
|
// returns true if at least one of the options in what has been found
|
|
|
|
bool handle_opt(vector<string> & opts, char const * const * what, string & target)
|
2003-04-17 15:05:17 +00:00
|
|
|
{
|
|
|
|
if (opts.empty())
|
2009-09-22 13:23:36 +00:00
|
|
|
return false;
|
2003-04-17 15:05:17 +00:00
|
|
|
|
2009-09-22 13:23:36 +00:00
|
|
|
bool found = false;
|
2007-12-04 20:09:40 +00:00
|
|
|
// the last language option is the document language (for babel and LyX)
|
|
|
|
// the last size option is the document font size
|
|
|
|
vector<string>::iterator it;
|
|
|
|
vector<string>::iterator position = opts.begin();
|
2007-09-16 10:36:57 +00:00
|
|
|
for (; *what; ++what) {
|
2007-12-04 20:09:40 +00:00
|
|
|
it = find(opts.begin(), opts.end(), *what);
|
2003-04-17 15:05:17 +00:00
|
|
|
if (it != opts.end()) {
|
2007-12-04 20:09:40 +00:00
|
|
|
if (it >= position) {
|
2009-09-22 13:23:36 +00:00
|
|
|
found = true;
|
2007-12-04 20:09:40 +00:00
|
|
|
target = *what;
|
|
|
|
position = it;
|
|
|
|
}
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
}
|
2009-09-22 13:23:36 +00:00
|
|
|
return found;
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-12-09 17:42:05 +00:00
|
|
|
void delete_opt(vector<string> & opts, char const * const * what)
|
|
|
|
{
|
|
|
|
if (opts.empty())
|
|
|
|
return;
|
|
|
|
|
|
|
|
// remove found options from the list
|
2009-09-22 13:23:36 +00:00
|
|
|
// do this after handle_opt to avoid potential memory leaks
|
2007-12-09 17:42:05 +00:00
|
|
|
vector<string>::iterator it;
|
|
|
|
for (; *what; ++what) {
|
|
|
|
it = find(opts.begin(), opts.end(), *what);
|
|
|
|
if (it != opts.end())
|
|
|
|
opts.erase(it);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-08-10 09:40:53 +00:00
|
|
|
/*!
|
|
|
|
* Split a package options string (keyval format) into a vector.
|
|
|
|
* Example input:
|
|
|
|
* authorformat=smallcaps,
|
|
|
|
* commabeforerest,
|
|
|
|
* titleformat=colonsep,
|
|
|
|
* bibformat={tabular,ibidem,numbered}
|
|
|
|
*/
|
|
|
|
vector<string> split_options(string const & input)
|
|
|
|
{
|
|
|
|
vector<string> options;
|
|
|
|
string option;
|
|
|
|
Parser p(input);
|
|
|
|
while (p.good()) {
|
|
|
|
Token const & t = p.get_token();
|
|
|
|
if (t.asInput() == ",") {
|
2011-10-16 08:22:20 +00:00
|
|
|
options.push_back(trimSpaceAndEol(option));
|
2004-08-10 09:40:53 +00:00
|
|
|
option.erase();
|
|
|
|
} else if (t.asInput() == "=") {
|
|
|
|
option += '=';
|
|
|
|
p.skip_spaces(true);
|
|
|
|
if (p.next_token().asInput() == "{")
|
|
|
|
option += '{' + p.getArg('{', '}') + '}';
|
2018-02-22 10:24:43 +00:00
|
|
|
} else if (t.cat() != catSpace && t.cat() != catComment)
|
2004-08-10 09:40:53 +00:00
|
|
|
option += t.asInput();
|
|
|
|
}
|
2004-10-05 10:11:42 +00:00
|
|
|
|
2004-08-10 09:40:53 +00:00
|
|
|
if (!option.empty())
|
2011-10-16 08:22:20 +00:00
|
|
|
options.push_back(trimSpaceAndEol(option));
|
2004-08-10 09:40:53 +00:00
|
|
|
|
|
|
|
return options;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-01-06 20:57:16 +00:00
|
|
|
/*!
|
|
|
|
* Retrieve a keyval option "name={value with=sign}" named \p name from
|
|
|
|
* \p options and return the value.
|
|
|
|
* The found option is also removed from \p options.
|
|
|
|
*/
|
|
|
|
string process_keyval_opt(vector<string> & options, string name)
|
|
|
|
{
|
|
|
|
for (size_t i = 0; i < options.size(); ++i) {
|
|
|
|
vector<string> option;
|
|
|
|
split(options[i], option, '=');
|
|
|
|
if (option.size() < 2)
|
|
|
|
continue;
|
|
|
|
if (option[0] == name) {
|
|
|
|
options.erase(options.begin() + i);
|
|
|
|
option.erase(option.begin());
|
|
|
|
return join(option, "=");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
} // anonymous namespace
|
2011-01-06 20:57:16 +00:00
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
|
2012-06-30 23:47:39 +00:00
|
|
|
/**
|
|
|
|
* known polyglossia language names (including variants)
|
2014-07-10 20:15:34 +00:00
|
|
|
* FIXME: support spelling=old for german variants (german vs. ngerman LyX names etc)
|
2012-06-30 23:47:39 +00:00
|
|
|
*/
|
|
|
|
const char * const Preamble::polyglossia_languages[] = {
|
2016-10-22 13:33:59 +00:00
|
|
|
"albanian", "american", "amharic", "ancient", "arabic", "armenian", "asturian", "australian",
|
2016-10-20 22:14:09 +00:00
|
|
|
"bahasai", "bahasam", "basque", "bengali", "brazil", "brazilian", "breton", "british", "bulgarian",
|
2019-06-03 14:43:16 +00:00
|
|
|
"catalan", "churchslavonic", "coptic", "croatian", "czech", "danish", "divehi", "dutch",
|
2016-10-20 22:20:27 +00:00
|
|
|
"english", "esperanto", "estonian", "farsi", "finnish", "french", "friulan",
|
|
|
|
"galician", "greek", "monotonic", "hebrew", "hindi",
|
2019-06-03 14:43:16 +00:00
|
|
|
"icelandic", "interlingua", "irish", "italian", "kannada", "khmer", "korean",
|
2016-10-20 22:14:09 +00:00
|
|
|
"lao", "latin", "latvian", "lithuanian", "lsorbian", "magyar", "malayalam", "marathi",
|
2019-06-03 14:43:16 +00:00
|
|
|
"austrian", "newzealand", "german", "norsk", "nynorsk", "occitan", "oldrussian",
|
2016-10-20 22:20:27 +00:00
|
|
|
"piedmontese", "polish", "polytonic", "portuges", "romanian", "romansh", "russian",
|
2016-10-27 22:21:58 +00:00
|
|
|
"samin", "sanskrit", "scottish", "serbian", "slovak", "slovenian", "spanish", "swedish", "syriac",
|
2016-10-20 22:14:09 +00:00
|
|
|
"tamil", "telugu", "thai", "tibetan", "turkish", "turkmen",
|
2016-10-27 22:21:58 +00:00
|
|
|
"ukrainian", "urdu", "usorbian", "vietnamese", "welsh", 0};
|
|
|
|
// not yet supported by LyX: "korean", "nko"
|
2012-06-30 23:47:39 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* the same as polyglossia_languages with .lyx names
|
|
|
|
* please keep this in sync with polyglossia_languages line by line!
|
|
|
|
*/
|
|
|
|
const char * const Preamble::coded_polyglossia_languages[] = {
|
2016-10-22 13:33:59 +00:00
|
|
|
"albanian", "american", "amharic", "ancientgreek", "arabic_arabi", "armenian", "asturian", "australian",
|
2016-10-20 22:14:09 +00:00
|
|
|
"bahasa", "bahasam", "basque", "bengali", "brazilian", "brazilian", "breton", "british", "bulgarian",
|
2019-06-03 14:43:16 +00:00
|
|
|
"catalan", "churchslavonic", "coptic", "croatian", "czech", "danish", "divehi", "dutch",
|
2016-10-20 22:20:27 +00:00
|
|
|
"english", "esperanto", "estonian", "farsi", "finnish", "french", "friulan",
|
|
|
|
"galician", "greek", "greek", "hebrew", "hindi",
|
2019-06-03 14:43:16 +00:00
|
|
|
"icelandic", "interlingua", "irish", "italian", "kannada", "khmer", "korean",
|
2016-10-20 22:14:09 +00:00
|
|
|
"lao", "latin", "latvian", "lithuanian", "lowersorbian", "magyar", "malayalam", "marathi",
|
2019-06-03 14:43:16 +00:00
|
|
|
"naustrian","newzealand", "ngerman", "norsk", "nynorsk", "occitan", "oldrussian",
|
2016-10-20 22:20:27 +00:00
|
|
|
"piedmontese", "polish", "polutonikogreek", "portuges", "romanian", "romansh", "russian",
|
2016-10-27 22:21:58 +00:00
|
|
|
"samin", "sanskrit", "scottish", "serbian", "slovak", "slovene", "spanish", "swedish", "syriac",
|
2016-10-20 22:14:09 +00:00
|
|
|
"tamil", "telugu", "thai", "tibetan", "turkish", "turkmen",
|
2016-10-27 22:21:58 +00:00
|
|
|
"ukrainian", "urdu", "uppersorbian", "vietnamese", "welsh", 0};
|
|
|
|
// not yet supported by LyX: "korean-polyglossia", "nko"
|
2012-06-30 23:47:39 +00:00
|
|
|
|
|
|
|
|
2014-12-30 16:44:08 +00:00
|
|
|
bool Preamble::usePolyglossia() const
|
|
|
|
{
|
|
|
|
return h_use_non_tex_fonts && h_language_package == "default";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
bool Preamble::indentParagraphs() const
|
|
|
|
{
|
|
|
|
return h_paragraph_separation == "indent";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool Preamble::isPackageUsed(string const & package) const
|
|
|
|
{
|
|
|
|
return used_packages.find(package) != used_packages.end();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-04-04 13:46:49 +00:00
|
|
|
bool Preamble::isPackageAutoLoaded(string const & package) const
|
|
|
|
{
|
|
|
|
return auto_packages.find(package) != auto_packages.end();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
vector<string> Preamble::getPackageOptions(string const & package) const
|
|
|
|
{
|
|
|
|
map<string, vector<string> >::const_iterator it = used_packages.find(package);
|
|
|
|
if (it != used_packages.end())
|
|
|
|
return it->second;
|
|
|
|
return vector<string>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 18:12:49 +00:00
|
|
|
void Preamble::registerAutomaticallyLoadedPackage(std::string const & package)
|
|
|
|
{
|
|
|
|
auto_packages.insert(package);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 13:44:00 +00:00
|
|
|
void Preamble::addModule(string const & module)
|
2011-10-30 12:47:45 +00:00
|
|
|
{
|
2019-04-04 13:46:49 +00:00
|
|
|
for (auto const & m : used_modules) {
|
|
|
|
if (m == module)
|
|
|
|
return;
|
2019-06-03 14:43:16 +00:00
|
|
|
}
|
2011-10-30 13:44:00 +00:00
|
|
|
used_modules.push_back(module);
|
2011-10-30 12:47:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 13:21:06 +00:00
|
|
|
void Preamble::suppressDate(bool suppress)
|
|
|
|
{
|
|
|
|
if (suppress)
|
|
|
|
h_suppress_date = "true";
|
|
|
|
else
|
|
|
|
h_suppress_date = "false";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-11-06 17:03:59 +00:00
|
|
|
void Preamble::registerAuthor(std::string const & name)
|
|
|
|
{
|
|
|
|
Author author(from_utf8(name), empty_docstring());
|
|
|
|
author.setUsed(true);
|
|
|
|
authors_.record(author);
|
|
|
|
h_tracking_changes = "true";
|
|
|
|
h_output_changes = "true";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Author const & Preamble::getAuthor(std::string const & name) const
|
|
|
|
{
|
|
|
|
Author author(from_utf8(name), empty_docstring());
|
|
|
|
for (AuthorList::Authors::const_iterator it = authors_.begin();
|
2012-05-28 20:41:32 +00:00
|
|
|
it != authors_.end(); ++it)
|
2011-11-06 17:03:59 +00:00
|
|
|
if (*it == author)
|
|
|
|
return *it;
|
|
|
|
static Author const dummy;
|
|
|
|
return dummy;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-01-06 18:20:05 +00:00
|
|
|
int Preamble::getSpecialTableColumnArguments(char c) const
|
|
|
|
{
|
|
|
|
map<char, int>::const_iterator it = special_columns_.find(c);
|
|
|
|
if (it == special_columns_.end())
|
|
|
|
return -1;
|
|
|
|
return it->second;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
void Preamble::add_package(string const & name, vector<string> & options)
|
2003-04-17 15:05:17 +00:00
|
|
|
{
|
2004-08-10 09:40:53 +00:00
|
|
|
// every package inherits the global options
|
|
|
|
if (used_packages.find(name) == used_packages.end())
|
|
|
|
used_packages[name] = split_options(h_options);
|
|
|
|
|
2018-03-04 15:45:37 +00:00
|
|
|
// Insert options passed via PassOptionsToPackage
|
|
|
|
for (auto const & p : extra_package_options_) {
|
|
|
|
if (p.first == name) {
|
|
|
|
vector<string> eo = getVectorFromString(p.second);
|
|
|
|
for (auto const & eoi : eo)
|
|
|
|
options.push_back(eoi);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2004-08-10 09:40:53 +00:00
|
|
|
vector<string> & v = used_packages[name];
|
|
|
|
v.insert(v.end(), options.begin(), options.end());
|
|
|
|
if (name == "jurabib") {
|
|
|
|
// Don't output the order argument (see the cite command
|
2007-04-26 04:41:58 +00:00
|
|
|
// handling code in text.cpp).
|
2004-08-10 09:40:53 +00:00
|
|
|
vector<string>::iterator end =
|
|
|
|
remove(options.begin(), options.end(), "natbiborder");
|
|
|
|
end = remove(options.begin(), end, "jurabiborder");
|
|
|
|
options.erase(end, options.end());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
namespace {
|
|
|
|
|
2012-12-30 10:58:21 +00:00
|
|
|
// Given is a string like "scaled=0.9" or "Scale=0.9", return 0.9 * 100
|
|
|
|
bool scale_as_percentage(string const & scale, string & percentage)
|
2007-12-09 14:14:34 +00:00
|
|
|
{
|
2007-12-09 15:26:31 +00:00
|
|
|
string::size_type pos = scale.find('=');
|
|
|
|
if (pos != string::npos) {
|
|
|
|
string value = scale.substr(pos + 1);
|
2012-12-30 10:58:21 +00:00
|
|
|
if (isStrDbl(value)) {
|
2014-07-11 09:21:45 +00:00
|
|
|
percentage = convert<string>(
|
|
|
|
static_cast<int>(100 * convert<double>(value)));
|
2012-12-30 10:58:21 +00:00
|
|
|
return true;
|
|
|
|
}
|
2007-12-09 15:26:31 +00:00
|
|
|
}
|
2012-12-30 10:58:21 +00:00
|
|
|
return false;
|
2007-12-09 14:14:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-01-06 20:57:16 +00:00
|
|
|
string remove_braces(string const & value)
|
|
|
|
{
|
|
|
|
if (value.empty())
|
|
|
|
return value;
|
|
|
|
if (value[0] == '{' && value[value.length()-1] == '}')
|
|
|
|
return value.substr(1, value.length()-2);
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
} // anonymous namespace
|
|
|
|
|
|
|
|
|
2013-02-17 16:53:04 +00:00
|
|
|
Preamble::Preamble() : one_language(true), explicit_babel(false),
|
2019-07-14 07:41:17 +00:00
|
|
|
title_layout_found(false), index_number(0), h_font_cjk_set(false)
|
2011-10-30 12:47:45 +00:00
|
|
|
{
|
|
|
|
//h_backgroundcolor;
|
|
|
|
//h_boxbgcolor;
|
2011-12-14 01:11:18 +00:00
|
|
|
h_biblio_style = "plain";
|
2012-06-24 13:29:32 +00:00
|
|
|
h_bibtex_command = "default";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_cite_engine = "basic";
|
2013-05-16 14:00:54 +00:00
|
|
|
h_cite_engine_type = "default";
|
2012-06-24 13:29:32 +00:00
|
|
|
h_color = "#008000";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_defskip = "medskip";
|
2017-04-08 02:55:22 +00:00
|
|
|
h_dynamic_quotes = false;
|
2011-10-30 12:47:45 +00:00
|
|
|
//h_float_placement;
|
|
|
|
//h_fontcolor;
|
|
|
|
h_fontencoding = "default";
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "default";
|
|
|
|
h_font_roman[1] = "default";
|
|
|
|
h_font_sans[0] = "default";
|
|
|
|
h_font_sans[1] = "default";
|
|
|
|
h_font_typewriter[0] = "default";
|
|
|
|
h_font_typewriter[1] = "default";
|
|
|
|
h_font_math[0] = "auto";
|
|
|
|
h_font_math[1] = "auto";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_font_default_family = "default";
|
2014-12-30 16:44:08 +00:00
|
|
|
h_use_non_tex_fonts = false;
|
2011-10-30 12:47:45 +00:00
|
|
|
h_font_sc = "false";
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "false";
|
|
|
|
h_font_sans_osf = "false";
|
|
|
|
h_font_typewriter_osf = "false";
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_sf_scale[0] = "100";
|
|
|
|
h_font_sf_scale[1] = "100";
|
|
|
|
h_font_tt_scale[0] = "100";
|
|
|
|
h_font_tt_scale[1] = "100";
|
2019-07-11 18:28:34 +00:00
|
|
|
// h_font_roman_opts;
|
|
|
|
// h_font_sans_opts;
|
|
|
|
// h_font_typewriter_opts;
|
2012-12-30 10:58:21 +00:00
|
|
|
//h_font_cjk
|
2017-04-13 00:31:26 +00:00
|
|
|
h_is_mathindent = "0";
|
2017-05-13 18:39:45 +00:00
|
|
|
h_math_numbering_side = "default";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_graphics = "default";
|
2012-06-08 00:37:36 +00:00
|
|
|
h_default_output_format = "default";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_html_be_strict = "false";
|
|
|
|
h_html_css_as_file = "0";
|
|
|
|
h_html_math_output = "0";
|
2013-02-17 05:18:42 +00:00
|
|
|
h_index[0] = "Index";
|
2012-06-24 13:29:32 +00:00
|
|
|
h_index_command = "default";
|
2019-04-16 18:17:32 +00:00
|
|
|
h_inputencoding = "auto-legacy";
|
2011-12-07 22:46:15 +00:00
|
|
|
h_justification = "true";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_language = "english";
|
|
|
|
h_language_package = "none";
|
|
|
|
//h_listings_params;
|
2012-06-24 13:29:32 +00:00
|
|
|
h_maintain_unincluded_children = "false";
|
2011-10-30 12:47:45 +00:00
|
|
|
//h_margins;
|
|
|
|
//h_notefontcolor;
|
|
|
|
//h_options;
|
|
|
|
h_output_changes = "false";
|
2012-06-24 13:29:32 +00:00
|
|
|
h_output_sync = "0";
|
2012-06-24 14:59:21 +00:00
|
|
|
//h_output_sync_macro
|
2011-10-30 12:47:45 +00:00
|
|
|
h_papercolumns = "1";
|
|
|
|
h_paperfontsize = "default";
|
|
|
|
h_paperorientation = "portrait";
|
|
|
|
h_paperpagestyle = "default";
|
|
|
|
//h_papersides;
|
|
|
|
h_papersize = "default";
|
|
|
|
h_paragraph_indentation = "default";
|
|
|
|
h_paragraph_separation = "indent";
|
|
|
|
//h_pdf_title;
|
|
|
|
//h_pdf_author;
|
|
|
|
//h_pdf_subject;
|
|
|
|
//h_pdf_keywords;
|
2013-07-16 21:07:46 +00:00
|
|
|
h_pdf_bookmarks = "0";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_pdf_bookmarksnumbered = "0";
|
|
|
|
h_pdf_bookmarksopen = "0";
|
|
|
|
h_pdf_bookmarksopenlevel = "1";
|
|
|
|
h_pdf_breaklinks = "0";
|
|
|
|
h_pdf_pdfborder = "0";
|
|
|
|
h_pdf_colorlinks = "0";
|
|
|
|
h_pdf_backref = "section";
|
2013-07-16 21:07:46 +00:00
|
|
|
h_pdf_pdfusetitle = "0";
|
2011-10-30 12:47:45 +00:00
|
|
|
//h_pdf_pagemode;
|
|
|
|
//h_pdf_quoted_options;
|
2016-12-20 16:55:43 +00:00
|
|
|
h_quotes_style = "english";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_secnumdepth = "3";
|
2013-02-17 05:18:42 +00:00
|
|
|
h_shortcut[0] = "idx";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_spacing = "single";
|
2015-12-20 16:37:29 +00:00
|
|
|
h_save_transient_properties = "true";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_suppress_date = "false";
|
|
|
|
h_textclass = "article";
|
|
|
|
h_tocdepth = "3";
|
|
|
|
h_tracking_changes = "false";
|
|
|
|
h_use_bibtopic = "false";
|
2017-04-08 02:55:22 +00:00
|
|
|
h_use_dash_ligatures = "true";
|
2011-11-29 20:09:40 +00:00
|
|
|
h_use_indices = "false";
|
2011-10-30 12:47:45 +00:00
|
|
|
h_use_geometry = "false";
|
|
|
|
h_use_default_options = "false";
|
2012-10-05 22:29:16 +00:00
|
|
|
h_use_hyperref = "false";
|
2018-02-22 10:24:43 +00:00
|
|
|
h_use_microtype = "false";
|
2019-07-14 07:41:17 +00:00
|
|
|
h_use_lineno = "false";
|
2013-02-22 20:59:23 +00:00
|
|
|
h_use_refstyle = false;
|
tex2lyx: import minted listings
This commit updates tex2lyx in order to also import minted listings.
For the floating version of a listing, minted uses the listing
environment, a concept that is not shared with the listings package,
towards which our listings inset is geared.
For this reason, a kludge is necessary when importing minted listings
not previously exported by LyX itself.
If the floating listing contains only a caption and a label (other
than the listing itself), everything is fine and the import is (or
aims to be) perfect. But, as in all other floating ebvironments,
one can also stick there other elements, which don't have a place
in the listings inset. So, in order to avoid a data loss, tex2lyx
sticks everything into the caption. In this way, things may be
rearranged in the GUI, if necessary. There is no other way, apart
from a complete redesign of the listings inset, of course. However,
I think that this is an acceptable compromise.
2017-06-17 00:23:00 +00:00
|
|
|
h_use_minted = false;
|
2012-01-05 20:53:48 +00:00
|
|
|
h_use_packages["amsmath"] = "1";
|
2012-07-08 19:32:26 +00:00
|
|
|
h_use_packages["amssymb"] = "0";
|
2013-02-27 12:14:59 +00:00
|
|
|
h_use_packages["cancel"] = "0";
|
2012-01-05 20:53:48 +00:00
|
|
|
h_use_packages["esint"] = "1";
|
2012-07-08 19:32:26 +00:00
|
|
|
h_use_packages["mhchem"] = "0";
|
|
|
|
h_use_packages["mathdots"] = "0";
|
|
|
|
h_use_packages["mathtools"] = "0";
|
2012-12-28 18:51:28 +00:00
|
|
|
h_use_packages["stackrel"] = "0";
|
2012-12-15 12:02:40 +00:00
|
|
|
h_use_packages["stmaryrd"] = "0";
|
2012-07-08 19:32:26 +00:00
|
|
|
h_use_packages["undertilde"] = "0";
|
2011-10-30 12:47:45 +00:00
|
|
|
}
|
|
|
|
|
2011-01-06 20:57:16 +00:00
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
void Preamble::handle_hyperref(vector<string> & options)
|
2011-01-06 20:57:16 +00:00
|
|
|
{
|
|
|
|
// FIXME swallow inputencoding changes that might surround the
|
|
|
|
// hyperref setup if it was written by LyX
|
2012-10-05 22:29:16 +00:00
|
|
|
h_use_hyperref = "true";
|
2011-01-06 20:57:16 +00:00
|
|
|
// swallow "unicode=true", since LyX does always write that
|
|
|
|
vector<string>::iterator it =
|
|
|
|
find(options.begin(), options.end(), "unicode=true");
|
|
|
|
if (it != options.end())
|
|
|
|
options.erase(it);
|
|
|
|
it = find(options.begin(), options.end(), "pdfusetitle");
|
|
|
|
if (it != options.end()) {
|
|
|
|
h_pdf_pdfusetitle = "1";
|
|
|
|
options.erase(it);
|
|
|
|
}
|
|
|
|
string bookmarks = process_keyval_opt(options, "bookmarks");
|
|
|
|
if (bookmarks == "true")
|
|
|
|
h_pdf_bookmarks = "1";
|
|
|
|
else if (bookmarks == "false")
|
|
|
|
h_pdf_bookmarks = "0";
|
|
|
|
if (h_pdf_bookmarks == "1") {
|
|
|
|
string bookmarksnumbered =
|
|
|
|
process_keyval_opt(options, "bookmarksnumbered");
|
|
|
|
if (bookmarksnumbered == "true")
|
|
|
|
h_pdf_bookmarksnumbered = "1";
|
|
|
|
else if (bookmarksnumbered == "false")
|
|
|
|
h_pdf_bookmarksnumbered = "0";
|
|
|
|
string bookmarksopen =
|
|
|
|
process_keyval_opt(options, "bookmarksopen");
|
|
|
|
if (bookmarksopen == "true")
|
|
|
|
h_pdf_bookmarksopen = "1";
|
|
|
|
else if (bookmarksopen == "false")
|
|
|
|
h_pdf_bookmarksopen = "0";
|
|
|
|
if (h_pdf_bookmarksopen == "1") {
|
|
|
|
string bookmarksopenlevel =
|
|
|
|
process_keyval_opt(options, "bookmarksopenlevel");
|
|
|
|
if (!bookmarksopenlevel.empty())
|
|
|
|
h_pdf_bookmarksopenlevel = bookmarksopenlevel;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
string breaklinks = process_keyval_opt(options, "breaklinks");
|
|
|
|
if (breaklinks == "true")
|
|
|
|
h_pdf_breaklinks = "1";
|
|
|
|
else if (breaklinks == "false")
|
|
|
|
h_pdf_breaklinks = "0";
|
|
|
|
string pdfborder = process_keyval_opt(options, "pdfborder");
|
|
|
|
if (pdfborder == "{0 0 0}")
|
|
|
|
h_pdf_pdfborder = "1";
|
|
|
|
else if (pdfborder == "{0 0 1}")
|
|
|
|
h_pdf_pdfborder = "0";
|
|
|
|
string backref = process_keyval_opt(options, "backref");
|
|
|
|
if (!backref.empty())
|
|
|
|
h_pdf_backref = backref;
|
|
|
|
string colorlinks = process_keyval_opt(options, "colorlinks");
|
|
|
|
if (colorlinks == "true")
|
|
|
|
h_pdf_colorlinks = "1";
|
|
|
|
else if (colorlinks == "false")
|
|
|
|
h_pdf_colorlinks = "0";
|
|
|
|
string pdfpagemode = process_keyval_opt(options, "pdfpagemode");
|
|
|
|
if (!pdfpagemode.empty())
|
|
|
|
h_pdf_pagemode = pdfpagemode;
|
|
|
|
string pdftitle = process_keyval_opt(options, "pdftitle");
|
|
|
|
if (!pdftitle.empty()) {
|
|
|
|
h_pdf_title = remove_braces(pdftitle);
|
|
|
|
}
|
|
|
|
string pdfauthor = process_keyval_opt(options, "pdfauthor");
|
|
|
|
if (!pdfauthor.empty()) {
|
|
|
|
h_pdf_author = remove_braces(pdfauthor);
|
|
|
|
}
|
|
|
|
string pdfsubject = process_keyval_opt(options, "pdfsubject");
|
|
|
|
if (!pdfsubject.empty())
|
|
|
|
h_pdf_subject = remove_braces(pdfsubject);
|
|
|
|
string pdfkeywords = process_keyval_opt(options, "pdfkeywords");
|
|
|
|
if (!pdfkeywords.empty())
|
|
|
|
h_pdf_keywords = remove_braces(pdfkeywords);
|
|
|
|
if (!options.empty()) {
|
|
|
|
if (!h_pdf_quoted_options.empty())
|
|
|
|
h_pdf_quoted_options += ',';
|
|
|
|
h_pdf_quoted_options += join(options, ",");
|
|
|
|
options.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-11-13 12:23:27 +00:00
|
|
|
void Preamble::handle_geometry(vector<string> & options)
|
|
|
|
{
|
|
|
|
h_use_geometry = "true";
|
|
|
|
vector<string>::iterator it;
|
|
|
|
// paper orientation
|
|
|
|
if ((it = find(options.begin(), options.end(), "landscape")) != options.end()) {
|
|
|
|
h_paperorientation = "landscape";
|
|
|
|
options.erase(it);
|
|
|
|
}
|
|
|
|
// paper size
|
|
|
|
// keyval version: "paper=letter"
|
|
|
|
string paper = process_keyval_opt(options, "paper");
|
|
|
|
if (!paper.empty())
|
|
|
|
h_papersize = paper + "paper";
|
|
|
|
// alternative version: "letterpaper"
|
|
|
|
handle_opt(options, known_paper_sizes, h_papersize);
|
|
|
|
delete_opt(options, known_paper_sizes);
|
|
|
|
// page margins
|
|
|
|
char const * const * margin = known_paper_margins;
|
|
|
|
for (; *margin; ++margin) {
|
|
|
|
string value = process_keyval_opt(options, *margin);
|
|
|
|
if (!value.empty()) {
|
|
|
|
int k = margin - known_paper_margins;
|
|
|
|
string name = known_coded_paper_margins[k];
|
|
|
|
h_margins += '\\' + name + ' ' + value + '\n';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
void Preamble::handle_package(Parser &p, string const & name,
|
2016-01-31 11:54:59 +00:00
|
|
|
string const & opts, bool in_lyx_preamble,
|
|
|
|
bool detectEncoding)
|
2004-08-10 09:40:53 +00:00
|
|
|
{
|
|
|
|
vector<string> options = split_options(opts);
|
|
|
|
add_package(name, options);
|
2007-12-05 20:02:49 +00:00
|
|
|
|
2012-02-16 10:40:02 +00:00
|
|
|
if (is_known(name, known_xetex_packages)) {
|
2011-11-06 17:03:59 +00:00
|
|
|
xetex = true;
|
2014-12-30 16:44:08 +00:00
|
|
|
h_use_non_tex_fonts = true;
|
2012-06-22 15:19:46 +00:00
|
|
|
registerAutomaticallyLoadedPackage("fontspec");
|
2019-04-16 18:17:32 +00:00
|
|
|
if (h_inputencoding == "auto-legacy")
|
2013-01-19 18:47:15 +00:00
|
|
|
p.setEncoding("UTF-8");
|
2012-02-16 10:40:02 +00:00
|
|
|
}
|
2011-11-06 17:03:59 +00:00
|
|
|
|
2007-12-05 20:02:49 +00:00
|
|
|
// roman fonts
|
2019-04-08 09:44:53 +00:00
|
|
|
if (is_known(name, known_roman_font_packages))
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = name;
|
2008-04-20 23:16:55 +00:00
|
|
|
|
2007-12-06 18:58:32 +00:00
|
|
|
if (name == "fourier") {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "utopia";
|
2007-12-06 18:58:32 +00:00
|
|
|
// when font uses real small capitals
|
|
|
|
if (opts == "expert")
|
|
|
|
h_font_sc = "true";
|
|
|
|
}
|
2009-06-11 23:45:17 +00:00
|
|
|
|
2013-02-11 00:46:03 +00:00
|
|
|
if (name == "garamondx") {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "garamondx";
|
2013-02-11 00:46:03 +00:00
|
|
|
if (opts == "osfI")
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2013-02-11 00:46:03 +00:00
|
|
|
}
|
|
|
|
|
2013-02-11 13:22:56 +00:00
|
|
|
if (name == "libertine") {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "libertine";
|
2013-02-11 13:40:35 +00:00
|
|
|
// this automatically invokes biolinum
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_sans[0] = "biolinum";
|
2018-03-11 10:12:42 +00:00
|
|
|
// as well as libertineMono
|
|
|
|
h_font_typewriter[0] = "libertine-mono";
|
2013-02-11 13:22:56 +00:00
|
|
|
if (opts == "osf")
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2013-02-15 09:52:00 +00:00
|
|
|
else if (opts == "lining")
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "false";
|
2013-02-11 13:22:56 +00:00
|
|
|
}
|
|
|
|
|
2018-03-11 10:12:42 +00:00
|
|
|
if (name == "libertineRoman" || name == "libertine-type1") {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "libertine";
|
2018-03-11 10:12:42 +00:00
|
|
|
// NOTE: contrary to libertine.sty, libertineRoman
|
|
|
|
// and libertine-type1 do not automatically invoke
|
|
|
|
// biolinum and libertineMono
|
2013-02-11 00:56:47 +00:00
|
|
|
if (opts == "lining")
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "false";
|
2013-02-15 09:52:00 +00:00
|
|
|
else if (opts == "osf")
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2013-02-11 00:56:47 +00:00
|
|
|
}
|
2014-12-30 16:44:08 +00:00
|
|
|
|
2018-03-11 10:12:42 +00:00
|
|
|
if (name == "MinionPro") {
|
|
|
|
h_font_roman[0] = "minionpro";
|
2019-07-11 18:28:34 +00:00
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2019-07-11 18:28:34 +00:00
|
|
|
h_font_math[0] = "auto";
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (opt == "lf") {
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "false";
|
2019-07-11 18:28:34 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (opt == "onlytext") {
|
|
|
|
h_font_math[0] = "default";
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_roman_opts = xopts;
|
|
|
|
options.clear();
|
2018-03-11 10:12:42 +00:00
|
|
|
}
|
|
|
|
|
2013-02-11 00:40:13 +00:00
|
|
|
if (name == "mathdesign") {
|
|
|
|
if (opts.find("charter") != string::npos)
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "md-charter";
|
2013-02-11 00:40:13 +00:00
|
|
|
if (opts.find("garamond") != string::npos)
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "md-garamond";
|
2013-02-11 00:40:13 +00:00
|
|
|
if (opts.find("utopia") != string::npos)
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "md-utopia";
|
2013-02-11 00:40:13 +00:00
|
|
|
if (opts.find("expert") != string::npos) {
|
|
|
|
h_font_sc = "true";
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2013-02-11 00:40:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-12-08 20:05:51 +00:00
|
|
|
else if (name == "mathpazo")
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "palatino";
|
2008-04-20 23:16:55 +00:00
|
|
|
|
2011-12-08 20:05:51 +00:00
|
|
|
else if (name == "mathptmx")
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = "times";
|
2008-04-20 23:16:55 +00:00
|
|
|
|
2017-04-03 22:19:14 +00:00
|
|
|
if (name == "crimson")
|
|
|
|
h_font_roman[0] = "cochineal";
|
|
|
|
|
|
|
|
if (name == "cochineal") {
|
|
|
|
h_font_roman[0] = "cochineal";
|
|
|
|
// cochineal can have several options, e.g. [proportional,osf]
|
|
|
|
string::size_type pos = opts.find("osf");
|
|
|
|
if (pos != string::npos)
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2017-04-03 22:19:14 +00:00
|
|
|
}
|
|
|
|
|
2017-04-04 21:02:47 +00:00
|
|
|
if (name == "noto") {
|
|
|
|
// noto can have several options
|
|
|
|
if (opts.empty())
|
|
|
|
h_font_roman[0] = "NotoSerif-TLF";
|
|
|
|
string::size_type pos = opts.find("rm");
|
|
|
|
if (pos != string::npos)
|
|
|
|
h_font_roman[0] = "NotoSerif-TLF";
|
|
|
|
pos = opts.find("sf");
|
|
|
|
if (pos != string::npos)
|
|
|
|
h_font_sans[0] = "NotoSans-TLF";
|
|
|
|
pos = opts.find("nott");
|
|
|
|
if (pos != string::npos) {
|
|
|
|
h_font_roman[0] = "NotoSerif-TLF";
|
|
|
|
h_font_sans[0] = "NotoSans-TLF";
|
|
|
|
}
|
|
|
|
// noto as typewriter is handled in handling of \ttdefault
|
|
|
|
// special cases are handled in handling of \rmdefault and \sfdefault
|
2019-07-13 15:46:43 +00:00
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (opt == "rm")
|
|
|
|
continue;
|
|
|
|
if (opt == "sf")
|
|
|
|
continue;
|
|
|
|
if (opt == "nott")
|
|
|
|
continue;
|
|
|
|
if (opt == "osf") {
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2019-07-13 15:46:43 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
|
|
|
}
|
2017-04-04 21:02:47 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 18:59:48 +00:00
|
|
|
if (name == "paratype") {
|
|
|
|
// in this case all fonts are ParaType
|
|
|
|
h_font_roman[0] = "PTSerif-TLF";
|
|
|
|
h_font_sans[0] = "default";
|
|
|
|
h_font_typewriter[0] = "default";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (name == "PTSerif")
|
|
|
|
h_font_roman[0] = "PTSerif-TLF";
|
|
|
|
|
2018-03-15 14:44:49 +00:00
|
|
|
if (name == "XCharter") {
|
|
|
|
h_font_roman[0] = "xcharter";
|
|
|
|
if (opts == "osf")
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2018-03-15 14:44:49 +00:00
|
|
|
}
|
2018-08-20 09:13:13 +00:00
|
|
|
|
|
|
|
if (name == "plex-serif") {
|
|
|
|
if (opts.empty())
|
|
|
|
h_font_roman[0] = "IBMPlexSerif";
|
|
|
|
else if (opts.find("thin") != string::npos)
|
|
|
|
h_font_roman[0] = "IBMPlexSerifThin";
|
|
|
|
else if (opts.find("extralight") != string::npos)
|
|
|
|
h_font_roman[0] = "IBMPlexSerifExtraLight";
|
|
|
|
else if (opts.find("light") != string::npos)
|
|
|
|
h_font_roman[0] = "IBMPlexSerifLight";
|
|
|
|
else if (opts.find("semibold") != string::npos)
|
|
|
|
h_font_roman[0] = "IBMPlexSerifSemibold";
|
2019-07-13 13:44:52 +00:00
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (opt == "thin")
|
|
|
|
continue;
|
|
|
|
if (opt == "extralight")
|
|
|
|
continue;
|
|
|
|
if (opt == "light")
|
|
|
|
continue;
|
|
|
|
if (opt == "semibold")
|
|
|
|
continue;
|
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_roman_opts = xopts;
|
|
|
|
options.clear();
|
2018-08-20 09:13:13 +00:00
|
|
|
}
|
2019-04-07 11:47:45 +00:00
|
|
|
if (name == "noto-serif") {
|
2019-04-08 09:44:53 +00:00
|
|
|
h_font_roman[0] = "NotoSerifRegular";
|
|
|
|
if (!opts.empty()) {
|
|
|
|
if (opts.find("thin") != string::npos)
|
|
|
|
h_font_roman[0] = "NotoSerifThin";
|
|
|
|
else if (opts.find("medium") != string::npos)
|
|
|
|
h_font_roman[0] = "NotoSerifMedium";
|
|
|
|
else if (opts.find("extralight") != string::npos)
|
|
|
|
h_font_roman[0] = "NotoSerifExtralight";
|
|
|
|
else if (opts.find("light") != string::npos)
|
|
|
|
h_font_roman[0] = "NotoSerifLight";
|
|
|
|
}
|
2019-07-13 13:44:52 +00:00
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (opt == "regular")
|
|
|
|
continue;
|
|
|
|
if (opt == "thin")
|
|
|
|
continue;
|
|
|
|
if (opt == "extralight")
|
|
|
|
continue;
|
|
|
|
if (opt == "light")
|
|
|
|
continue;
|
|
|
|
if (opt == "semibold")
|
|
|
|
continue;
|
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_roman_opts = xopts;
|
|
|
|
options.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (name == "sourceserifpro") {
|
|
|
|
h_font_roman[0] = "ADOBESourceSerifPro";
|
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
2019-07-13 15:46:43 +00:00
|
|
|
if (opt == "osf") {
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2019-07-13 15:46:43 +00:00
|
|
|
continue;
|
|
|
|
}
|
2019-07-13 13:44:52 +00:00
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_roman_opts = xopts;
|
|
|
|
options.clear();
|
2019-04-07 11:47:45 +00:00
|
|
|
}
|
2018-08-20 09:13:13 +00:00
|
|
|
|
2007-12-05 20:02:49 +00:00
|
|
|
// sansserif fonts
|
2019-04-08 09:44:53 +00:00
|
|
|
if (is_known(name, known_sans_font_packages)) {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_sans[0] = name;
|
2014-11-20 01:01:05 +00:00
|
|
|
if (options.size() >= 1) {
|
2015-11-09 06:33:57 +00:00
|
|
|
if (scale_as_percentage(opts, h_font_sf_scale[0]))
|
2012-12-30 10:58:21 +00:00
|
|
|
options.clear();
|
2007-12-05 20:02:49 +00:00
|
|
|
}
|
|
|
|
}
|
2009-06-11 23:45:17 +00:00
|
|
|
|
2018-03-11 10:12:42 +00:00
|
|
|
if (name == "biolinum" || name == "biolinum-type1") {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_sans[0] = "biolinum";
|
2014-11-20 01:01:05 +00:00
|
|
|
// biolinum can have several options, e.g. [osf,scaled=0.97]
|
|
|
|
string::size_type pos = opts.find("osf");
|
|
|
|
if (pos != string::npos)
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_sans_osf = "true";
|
2014-11-20 01:01:05 +00:00
|
|
|
}
|
2013-02-11 01:14:53 +00:00
|
|
|
|
2018-03-10 18:59:48 +00:00
|
|
|
if (name == "PTSans") {
|
|
|
|
h_font_sans[0] = "PTSans-TLF";
|
|
|
|
if (options.size() >= 1) {
|
|
|
|
if (scale_as_percentage(opts, h_font_sf_scale[0]))
|
|
|
|
options.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-20 09:13:13 +00:00
|
|
|
if (name == "plex-sans") {
|
|
|
|
if (opts.find("condensed") != string::npos)
|
|
|
|
h_font_sans[0] = "IBMPlexSansCondensed";
|
|
|
|
else if (opts.find("thin") != string::npos)
|
|
|
|
h_font_sans[0] = "IBMPlexSansThin";
|
|
|
|
else if (opts.find("extralight") != string::npos)
|
|
|
|
h_font_sans[0] = "IBMPlexSansExtraLight";
|
|
|
|
else if (opts.find("light") != string::npos)
|
|
|
|
h_font_sans[0] = "IBMPlexSansLight";
|
|
|
|
else if (opts.find("semibold") != string::npos)
|
|
|
|
h_font_sans[0] = "IBMPlexSansSemibold";
|
|
|
|
else
|
|
|
|
h_font_sans[0] = "IBMPlexSans";
|
2019-07-13 13:44:52 +00:00
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (opt == "thin")
|
|
|
|
continue;
|
|
|
|
if (opt == "extralight")
|
|
|
|
continue;
|
|
|
|
if (opt == "light")
|
|
|
|
continue;
|
|
|
|
if (opt == "semibold")
|
|
|
|
continue;
|
|
|
|
if (prefixIs(opt, "scale=")) {
|
|
|
|
scale_as_percentage(opt, h_font_sf_scale[0]);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
2018-08-20 09:13:13 +00:00
|
|
|
}
|
2019-07-13 13:44:52 +00:00
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_sans_opts = xopts;
|
|
|
|
options.clear();
|
2018-08-20 09:13:13 +00:00
|
|
|
}
|
2019-04-07 11:47:45 +00:00
|
|
|
if (name == "noto-sans") {
|
|
|
|
h_font_sans[0] = "NotoSansRegular";
|
2019-04-08 09:44:53 +00:00
|
|
|
if (!opts.empty()) {
|
|
|
|
if (opts.find("medium") != string::npos)
|
|
|
|
h_font_sans[0] = "NotoSansMedium";
|
|
|
|
else if (opts.find("thin") != string::npos)
|
|
|
|
h_font_sans[0] = "NotoSansThin";
|
|
|
|
else if (opts.find("extralight") != string::npos)
|
|
|
|
h_font_sans[0] = "NotoSansExtralight";
|
|
|
|
else if (opts.find("light") != string::npos)
|
|
|
|
h_font_sans[0] = "NotoSansLight";
|
|
|
|
}
|
2019-07-13 13:44:52 +00:00
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (opt == "regular")
|
|
|
|
continue;
|
|
|
|
if (opt == "thin")
|
|
|
|
continue;
|
|
|
|
if (opt == "extralight")
|
|
|
|
continue;
|
|
|
|
if (opt == "light")
|
|
|
|
continue;
|
|
|
|
if (opt == "semibold")
|
|
|
|
continue;
|
2019-07-14 09:41:36 +00:00
|
|
|
if (opt == "osf") {
|
|
|
|
h_font_sans_osf = "true";
|
|
|
|
continue;
|
|
|
|
}
|
2019-07-13 13:44:52 +00:00
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_sans_opts = xopts;
|
|
|
|
options.clear();
|
|
|
|
}
|
2019-04-08 09:44:53 +00:00
|
|
|
|
2019-07-13 13:44:52 +00:00
|
|
|
if (name == "sourcesanspro") {
|
|
|
|
h_font_sans[0] = "ADOBESourceSansPro";
|
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (prefixIs(opt, "scaled=")) {
|
|
|
|
scale_as_percentage(opt, h_font_sf_scale[0]);
|
|
|
|
continue;
|
|
|
|
}
|
2019-07-14 07:09:46 +00:00
|
|
|
if (opt == "osf") {
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_sans_osf = "true";
|
2019-07-14 07:09:46 +00:00
|
|
|
continue;
|
|
|
|
}
|
2019-07-13 13:44:52 +00:00
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_sans_opts = xopts;
|
|
|
|
options.clear();
|
2019-04-07 11:47:45 +00:00
|
|
|
}
|
2018-08-20 09:13:13 +00:00
|
|
|
|
2007-12-05 20:02:49 +00:00
|
|
|
// typewriter fonts
|
2019-04-08 09:44:53 +00:00
|
|
|
if (is_known(name, known_typewriter_font_packages)) {
|
2011-10-25 15:54:53 +00:00
|
|
|
// fourier can be set as roman font _only_
|
|
|
|
// fourier as typewriter is handled in handling of \ttdefault
|
|
|
|
if (name != "fourier") {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_typewriter[0] = name;
|
2014-11-20 01:01:05 +00:00
|
|
|
if (options.size() >= 1) {
|
2015-11-09 06:33:57 +00:00
|
|
|
if (scale_as_percentage(opts, h_font_tt_scale[0]))
|
2012-12-30 10:58:21 +00:00
|
|
|
options.clear();
|
2011-10-25 15:54:53 +00:00
|
|
|
}
|
2007-12-05 20:02:49 +00:00
|
|
|
}
|
|
|
|
}
|
2009-06-11 23:45:17 +00:00
|
|
|
|
2018-03-11 10:12:42 +00:00
|
|
|
if (name == "libertineMono" || name == "libertineMono-type1")
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_typewriter[0] = "libertine-mono";
|
2018-03-10 18:59:48 +00:00
|
|
|
|
|
|
|
if (name == "PTMono") {
|
|
|
|
h_font_typewriter[0] = "PTMono-TLF";
|
|
|
|
if (options.size() >= 1) {
|
|
|
|
if (scale_as_percentage(opts, h_font_tt_scale[0]))
|
|
|
|
options.clear();
|
|
|
|
}
|
2014-11-20 01:01:05 +00:00
|
|
|
}
|
|
|
|
|
2018-08-20 09:13:13 +00:00
|
|
|
if (name == "plex-mono") {
|
|
|
|
if (opts.find("thin") != string::npos)
|
|
|
|
h_font_typewriter[0] = "IBMPlexMonoThin";
|
|
|
|
else if (opts.find("extralight") != string::npos)
|
|
|
|
h_font_typewriter[0] = "IBMPlexMonoExtraLight";
|
|
|
|
else if (opts.find("light") != string::npos)
|
|
|
|
h_font_typewriter[0] = "IBMPlexMonoLight";
|
|
|
|
else if (opts.find("semibold") != string::npos)
|
|
|
|
h_font_typewriter[0] = "IBMPlexMonoSemibold";
|
|
|
|
else
|
|
|
|
h_font_typewriter[0] = "IBMPlexMono";
|
2019-07-13 13:44:52 +00:00
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (opt == "thin")
|
|
|
|
continue;
|
|
|
|
if (opt == "extralight")
|
|
|
|
continue;
|
|
|
|
if (opt == "light")
|
|
|
|
continue;
|
|
|
|
if (opt == "semibold")
|
|
|
|
continue;
|
|
|
|
if (prefixIs(opt, "scale=")) {
|
|
|
|
scale_as_percentage(opt, h_font_tt_scale[0]);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
2018-08-20 09:13:13 +00:00
|
|
|
}
|
2019-07-13 13:44:52 +00:00
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_typewriter_opts = xopts;
|
|
|
|
options.clear();
|
2018-08-20 09:13:13 +00:00
|
|
|
}
|
|
|
|
|
2019-04-07 11:47:45 +00:00
|
|
|
if (name == "noto-mono") {
|
|
|
|
h_font_typewriter[0] = "NotoMonoRegular";
|
2019-07-13 13:44:52 +00:00
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (opt == "regular")
|
|
|
|
continue;
|
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_typewriter_opts = xopts;
|
|
|
|
options.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (name == "sourcecodepro") {
|
|
|
|
h_font_typewriter[0] = "ADOBESourceCodePro";
|
|
|
|
vector<string> allopts = getVectorFromString(opts);
|
|
|
|
string xopts;
|
|
|
|
for (auto const & opt : allopts) {
|
|
|
|
if (prefixIs(opt, "scaled=")) {
|
|
|
|
scale_as_percentage(opt, h_font_tt_scale[0]);
|
|
|
|
continue;
|
|
|
|
}
|
2019-07-14 07:09:46 +00:00
|
|
|
if (opt == "osf") {
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_typewriter_osf = "true";
|
2019-07-14 07:09:46 +00:00
|
|
|
continue;
|
|
|
|
}
|
2019-07-13 13:44:52 +00:00
|
|
|
if (!xopts.empty())
|
|
|
|
xopts += ", ";
|
|
|
|
xopts += opt;
|
|
|
|
}
|
|
|
|
if (!xopts.empty())
|
|
|
|
h_font_typewriter_opts = xopts;
|
|
|
|
options.clear();
|
2019-04-07 11:47:45 +00:00
|
|
|
}
|
|
|
|
|
2007-12-06 18:58:32 +00:00
|
|
|
// font uses old-style figure
|
2009-06-15 00:16:31 +00:00
|
|
|
if (name == "eco")
|
2019-07-14 09:41:36 +00:00
|
|
|
h_font_roman_osf = "true";
|
2004-08-10 09:40:53 +00:00
|
|
|
|
2013-02-11 01:34:03 +00:00
|
|
|
// math fonts
|
2019-04-08 09:44:53 +00:00
|
|
|
if (is_known(name, known_math_font_packages))
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_math[0] = name;
|
2013-02-11 01:34:03 +00:00
|
|
|
|
2013-02-11 01:56:48 +00:00
|
|
|
if (name == "newtxmath") {
|
|
|
|
if (opts.empty())
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_math[0] = "newtxmath";
|
2013-02-11 01:56:48 +00:00
|
|
|
else if (opts == "garamondx")
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_math[0] = "garamondx-ntxm";
|
2013-02-11 01:56:48 +00:00
|
|
|
else if (opts == "libertine")
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_math[0] = "libertine-ntxm";
|
2013-02-11 01:56:48 +00:00
|
|
|
else if (opts == "minion")
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_math[0] = "minion-ntxm";
|
2017-04-03 22:19:14 +00:00
|
|
|
else if (opts == "cochineal")
|
|
|
|
h_font_math[0] = "cochineal-ntxm";
|
2013-02-11 01:56:48 +00:00
|
|
|
}
|
|
|
|
|
2014-11-07 00:28:42 +00:00
|
|
|
if (name == "iwona")
|
|
|
|
if (opts == "math")
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_math[0] = "iwona-math";
|
2014-11-07 00:28:42 +00:00
|
|
|
|
|
|
|
if (name == "kurier")
|
|
|
|
if (opts == "math")
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_math[0] = "kurier-math";
|
2014-11-07 00:28:42 +00:00
|
|
|
|
2011-10-25 23:17:24 +00:00
|
|
|
// after the detection and handling of special cases, we can remove the
|
|
|
|
// fonts, otherwise they would appear in the preamble, see bug #7856
|
2019-04-08 09:44:53 +00:00
|
|
|
if (is_known(name, known_roman_font_packages) || is_known(name, known_sans_font_packages)
|
|
|
|
|| is_known(name, known_typewriter_font_packages) || is_known(name, known_math_font_packages))
|
2011-10-25 23:17:24 +00:00
|
|
|
;
|
2016-06-03 05:48:34 +00:00
|
|
|
//"On". See the enum Package in BufferParams.h if you thought that "2" should have been "42"
|
2013-02-27 12:14:59 +00:00
|
|
|
else if (name == "amsmath" || name == "amssymb" || name == "cancel" ||
|
2012-05-06 18:48:04 +00:00
|
|
|
name == "esint" || name == "mhchem" || name == "mathdots" ||
|
2012-12-28 18:51:28 +00:00
|
|
|
name == "mathtools" || name == "stackrel" ||
|
2019-04-04 13:46:49 +00:00
|
|
|
name == "stmaryrd" || name == "undertilde") {
|
2012-01-05 20:53:48 +00:00
|
|
|
h_use_packages[name] = "2";
|
2019-04-04 13:46:49 +00:00
|
|
|
registerAutomaticallyLoadedPackage(name);
|
|
|
|
}
|
2011-10-23 10:11:39 +00:00
|
|
|
|
2011-10-24 02:22:35 +00:00
|
|
|
else if (name == "babel") {
|
2011-10-25 17:30:27 +00:00
|
|
|
h_language_package = "default";
|
2011-10-28 12:37:59 +00:00
|
|
|
// One might think we would have to do nothing if babel is loaded
|
|
|
|
// without any options to prevent pollution of the preamble with this
|
|
|
|
// babel call in every roundtrip.
|
|
|
|
// But the user could have defined babel-specific things afterwards. So
|
|
|
|
// we need to keep it in the preamble to prevent cases like bug #7861.
|
2011-10-25 23:34:59 +00:00
|
|
|
if (!opts.empty()) {
|
2011-10-24 02:22:35 +00:00
|
|
|
// check if more than one option was used - used later for inputenc
|
2011-10-29 20:03:09 +00:00
|
|
|
if (options.begin() != options.end() - 1)
|
2011-10-24 02:22:35 +00:00
|
|
|
one_language = false;
|
|
|
|
// babel takes the last language of the option of its \usepackage
|
|
|
|
// call as document language. If there is no such language option, the
|
|
|
|
// last language in the documentclass options is used.
|
|
|
|
handle_opt(options, known_languages, h_language);
|
2012-06-24 16:10:36 +00:00
|
|
|
// translate the babel name to a LyX name
|
2012-06-23 02:28:52 +00:00
|
|
|
h_language = babel2lyx(h_language);
|
2012-06-24 16:10:36 +00:00
|
|
|
if (h_language == "japanese") {
|
2013-01-19 19:02:33 +00:00
|
|
|
// For Japanese, the encoding isn't indicated in the source
|
|
|
|
// file, and there's really not much we can do. We could
|
|
|
|
// 1) offer a list of possible encodings to choose from, or
|
|
|
|
// 2) determine the encoding of the file by inspecting it.
|
|
|
|
// For the time being, we leave the encoding alone so that
|
|
|
|
// we don't get iconv errors when making a wrong guess, and
|
|
|
|
// we will output a note at the top of the document
|
|
|
|
// explaining what to do.
|
|
|
|
Encoding const * const enc = encodings.fromIconvName(
|
2013-01-23 11:30:15 +00:00
|
|
|
p.getEncoding(), Encoding::japanese, false);
|
2013-01-19 19:02:33 +00:00
|
|
|
if (enc)
|
2013-01-20 00:52:30 +00:00
|
|
|
h_inputencoding = enc->name();
|
2012-06-24 16:10:36 +00:00
|
|
|
is_nonCJKJapanese = true;
|
|
|
|
// in this case babel can be removed from the preamble
|
|
|
|
registerAutomaticallyLoadedPackage("babel");
|
|
|
|
} else {
|
|
|
|
// If babel is called with options, LyX puts them by default into the
|
|
|
|
// document class options. This works for most languages, except
|
|
|
|
// for Latvian, Lithuanian, Mongolian, Turkmen and Vietnamese and
|
|
|
|
// perhaps in future others.
|
|
|
|
// Therefore keep the babel call as it is as the user might have
|
|
|
|
// reasons for it.
|
2019-04-04 14:39:20 +00:00
|
|
|
string const babelcall = "\\usepackage[" + opts + "]{babel}\n";
|
|
|
|
if (!contains(h_preamble.str(), babelcall))
|
|
|
|
h_preamble << babelcall;
|
2012-06-24 16:10:36 +00:00
|
|
|
}
|
|
|
|
delete_opt(options, known_languages);
|
2013-02-17 16:53:04 +00:00
|
|
|
} else {
|
2019-04-04 14:39:20 +00:00
|
|
|
if (!contains(h_preamble.str(), "\\usepackage{babel}\n"))
|
|
|
|
h_preamble << "\\usepackage{babel}\n";
|
2013-02-17 16:53:04 +00:00
|
|
|
explicit_babel = true;
|
|
|
|
}
|
2007-12-09 17:42:05 +00:00
|
|
|
}
|
2009-06-14 21:29:24 +00:00
|
|
|
|
2012-06-08 00:37:36 +00:00
|
|
|
else if (name == "polyglossia") {
|
|
|
|
h_language_package = "default";
|
|
|
|
h_default_output_format = "pdf4";
|
2014-12-30 16:44:08 +00:00
|
|
|
h_use_non_tex_fonts = true;
|
2012-06-08 00:37:36 +00:00
|
|
|
xetex = true;
|
2012-06-22 15:19:46 +00:00
|
|
|
registerAutomaticallyLoadedPackage("xunicode");
|
2019-04-16 18:17:32 +00:00
|
|
|
if (h_inputencoding == "auto-legacy")
|
2013-01-19 18:47:15 +00:00
|
|
|
p.setEncoding("UTF-8");
|
2012-06-08 00:37:36 +00:00
|
|
|
}
|
|
|
|
|
2012-06-24 04:38:33 +00:00
|
|
|
else if (name == "CJK") {
|
2019-04-16 18:17:32 +00:00
|
|
|
// set the encoding to "auto-legacy" because it might be set to "auto-legacy-plain" by the babel handling
|
2012-06-24 04:38:33 +00:00
|
|
|
// and this would not be correct for CJK
|
2019-04-16 18:17:32 +00:00
|
|
|
if (h_inputencoding == "auto-legacy-plain")
|
|
|
|
h_inputencoding = "auto-legacy";
|
2012-06-24 04:38:33 +00:00
|
|
|
registerAutomaticallyLoadedPackage("CJK");
|
|
|
|
}
|
|
|
|
|
2012-12-30 10:58:21 +00:00
|
|
|
else if (name == "CJKutf8") {
|
2013-01-20 00:52:30 +00:00
|
|
|
h_inputencoding = "utf8-cjk";
|
2013-01-19 18:47:15 +00:00
|
|
|
p.setEncoding("UTF-8");
|
2012-12-30 10:58:21 +00:00
|
|
|
registerAutomaticallyLoadedPackage("CJKutf8");
|
|
|
|
}
|
|
|
|
|
2011-10-22 19:54:31 +00:00
|
|
|
else if (name == "fontenc") {
|
|
|
|
h_fontencoding = getStringFromVector(options, ",");
|
|
|
|
options.clear();
|
|
|
|
}
|
2008-04-20 23:16:55 +00:00
|
|
|
|
2011-05-08 08:23:42 +00:00
|
|
|
else if (name == "inputenc" || name == "luainputenc") {
|
2009-12-10 02:29:49 +00:00
|
|
|
// h_inputencoding is only set when there is not more than one
|
|
|
|
// inputenc option because otherwise h_inputencoding must be
|
2019-04-16 18:17:32 +00:00
|
|
|
// set to "auto-legacy" (the default encodings of the document's languages)
|
2013-01-20 00:52:30 +00:00
|
|
|
// Therefore check that exactly one option is passed to inputenc.
|
2011-10-31 01:51:46 +00:00
|
|
|
// It is also only set when there is not more than one babel
|
|
|
|
// language option.
|
2013-01-20 00:52:30 +00:00
|
|
|
if (!options.empty()) {
|
|
|
|
string const encoding = options.back();
|
|
|
|
Encoding const * const enc = encodings.fromLaTeXName(
|
|
|
|
encoding, Encoding::inputenc, true);
|
2016-01-31 11:54:59 +00:00
|
|
|
if (!enc) {
|
|
|
|
if (!detectEncoding)
|
|
|
|
cerr << "Unknown encoding " << encoding
|
|
|
|
<< ". Ignoring." << std::endl;
|
|
|
|
} else {
|
2013-01-20 00:52:30 +00:00
|
|
|
if (!enc->unsafe() && options.size() == 1 && one_language == true)
|
|
|
|
h_inputencoding = enc->name();
|
|
|
|
p.setEncoding(enc->iconvName());
|
|
|
|
}
|
|
|
|
options.clear();
|
|
|
|
}
|
2008-04-21 22:08:52 +00:00
|
|
|
}
|
2008-10-11 16:07:14 +00:00
|
|
|
|
2012-06-24 14:59:21 +00:00
|
|
|
else if (name == "srcltx") {
|
|
|
|
h_output_sync = "1";
|
|
|
|
if (!opts.empty()) {
|
|
|
|
h_output_sync_macro = "\\usepackage[" + opts + "]{srcltx}";
|
|
|
|
options.clear();
|
|
|
|
} else
|
|
|
|
h_output_sync_macro = "\\usepackage{srcltx}";
|
|
|
|
}
|
|
|
|
|
2011-10-25 17:30:27 +00:00
|
|
|
else if (is_known(name, known_old_language_packages)) {
|
|
|
|
// known language packages from the times before babel
|
|
|
|
// if they are found and not also babel, they will be used as
|
2011-11-29 20:09:40 +00:00
|
|
|
// custom language package
|
2011-10-25 17:30:27 +00:00
|
|
|
h_language_package = "\\usepackage{" + name + "}";
|
|
|
|
}
|
|
|
|
|
2011-11-25 01:01:45 +00:00
|
|
|
else if (name == "lyxskak") {
|
|
|
|
// ignore this and its options
|
2011-12-13 19:40:05 +00:00
|
|
|
const char * const o[] = {"ps", "mover", 0};
|
|
|
|
delete_opt(options, o);
|
2011-11-25 01:01:45 +00:00
|
|
|
}
|
|
|
|
|
2011-12-13 19:40:05 +00:00
|
|
|
else if (is_known(name, known_lyx_packages) && options.empty()) {
|
2012-02-28 20:34:50 +00:00
|
|
|
if (name == "splitidx")
|
|
|
|
h_use_indices = "true";
|
2017-07-06 12:09:18 +00:00
|
|
|
else if (name == "minted")
|
|
|
|
h_use_minted = true;
|
|
|
|
else if (name == "refstyle")
|
2013-02-22 20:59:23 +00:00
|
|
|
h_use_refstyle = true;
|
|
|
|
else if (name == "prettyref")
|
|
|
|
h_use_refstyle = false;
|
2012-10-05 20:16:46 +00:00
|
|
|
if (!in_lyx_preamble) {
|
2011-10-30 18:12:49 +00:00
|
|
|
h_preamble << package_beg_sep << name
|
|
|
|
<< package_mid_sep << "\\usepackage{"
|
2012-10-05 20:16:46 +00:00
|
|
|
<< name << '}';
|
|
|
|
if (p.next_token().cat() == catNewline ||
|
|
|
|
(p.next_token().cat() == catSpace &&
|
|
|
|
p.next_next_token().cat() == catNewline))
|
|
|
|
h_preamble << '\n';
|
|
|
|
h_preamble << package_end_sep;
|
|
|
|
}
|
2009-06-11 23:45:17 +00:00
|
|
|
}
|
2008-04-20 23:16:55 +00:00
|
|
|
|
2008-05-16 20:25:44 +00:00
|
|
|
else if (name == "geometry")
|
2011-11-13 12:23:27 +00:00
|
|
|
handle_geometry(options);
|
2008-05-16 20:25:44 +00:00
|
|
|
|
2011-10-27 02:29:03 +00:00
|
|
|
else if (name == "subfig")
|
2011-11-29 20:09:40 +00:00
|
|
|
; // ignore this FIXME: Use the package separator mechanism instead
|
2011-10-27 02:29:03 +00:00
|
|
|
|
2017-12-14 10:22:05 +00:00
|
|
|
else if (char const * const * where = is_known(name, known_languages))
|
2012-10-06 07:38:14 +00:00
|
|
|
h_language = known_coded_languages[where - known_languages];
|
2009-06-11 23:45:17 +00:00
|
|
|
|
2008-04-21 22:08:52 +00:00
|
|
|
else if (name == "natbib") {
|
2011-12-14 01:11:18 +00:00
|
|
|
h_biblio_style = "plainnat";
|
2012-01-09 13:16:41 +00:00
|
|
|
h_cite_engine = "natbib";
|
|
|
|
h_cite_engine_type = "authoryear";
|
2004-08-10 09:40:53 +00:00
|
|
|
vector<string>::iterator it =
|
|
|
|
find(options.begin(), options.end(), "authoryear");
|
|
|
|
if (it != options.end())
|
|
|
|
options.erase(it);
|
|
|
|
else {
|
|
|
|
it = find(options.begin(), options.end(), "numbers");
|
|
|
|
if (it != options.end()) {
|
2012-01-09 13:16:41 +00:00
|
|
|
h_cite_engine_type = "numerical";
|
2004-08-10 09:40:53 +00:00
|
|
|
options.erase(it);
|
|
|
|
}
|
|
|
|
}
|
2018-03-04 15:45:37 +00:00
|
|
|
if (!options.empty())
|
|
|
|
h_biblio_options = join(options, ",");
|
2008-04-21 22:08:52 +00:00
|
|
|
}
|
2009-06-11 23:45:17 +00:00
|
|
|
|
2018-03-04 15:46:31 +00:00
|
|
|
else if (name == "biblatex") {
|
|
|
|
h_biblio_style = "plainnat";
|
|
|
|
h_cite_engine = "biblatex";
|
|
|
|
h_cite_engine_type = "authoryear";
|
|
|
|
string opt;
|
|
|
|
vector<string>::iterator it =
|
|
|
|
find(options.begin(), options.end(), "natbib");
|
|
|
|
if (it != options.end()) {
|
|
|
|
options.erase(it);
|
|
|
|
h_cite_engine = "biblatex-natbib";
|
|
|
|
} else {
|
|
|
|
opt = process_keyval_opt(options, "natbib");
|
|
|
|
if (opt == "true")
|
|
|
|
h_cite_engine = "biblatex-natbib";
|
|
|
|
}
|
|
|
|
opt = process_keyval_opt(options, "style");
|
|
|
|
if (!opt.empty()) {
|
|
|
|
h_biblatex_citestyle = opt;
|
|
|
|
h_biblatex_bibstyle = opt;
|
|
|
|
} else {
|
|
|
|
opt = process_keyval_opt(options, "citestyle");
|
|
|
|
if (!opt.empty())
|
|
|
|
h_biblatex_citestyle = opt;
|
|
|
|
opt = process_keyval_opt(options, "bibstyle");
|
|
|
|
if (!opt.empty())
|
|
|
|
h_biblatex_bibstyle = opt;
|
|
|
|
}
|
2018-03-04 16:29:59 +00:00
|
|
|
opt = process_keyval_opt(options, "refsection");
|
|
|
|
if (!opt.empty()) {
|
|
|
|
if (opt == "none" || opt == "part"
|
|
|
|
|| opt == "chapter" || opt == "section"
|
|
|
|
|| opt == "subsection")
|
|
|
|
h_multibib = opt;
|
|
|
|
else
|
|
|
|
cerr << "Ignoring unkown refesection value '"
|
|
|
|
<< opt << "'.";
|
|
|
|
}
|
2018-08-21 06:19:24 +00:00
|
|
|
opt = process_keyval_opt(options, "bibencoding");
|
|
|
|
if (!opt.empty())
|
|
|
|
bibencoding = opt;
|
2018-03-04 15:46:31 +00:00
|
|
|
if (!options.empty()) {
|
|
|
|
h_biblio_options = join(options, ",");
|
|
|
|
options.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-12-14 01:11:18 +00:00
|
|
|
else if (name == "jurabib") {
|
|
|
|
h_biblio_style = "jurabib";
|
2004-08-10 09:40:53 +00:00
|
|
|
h_cite_engine = "jurabib";
|
2012-01-09 13:16:41 +00:00
|
|
|
h_cite_engine_type = "authoryear";
|
2018-03-04 15:46:31 +00:00
|
|
|
if (!options.empty())
|
|
|
|
h_biblio_options = join(options, ",");
|
2011-12-14 01:11:18 +00:00
|
|
|
}
|
2009-06-11 23:45:17 +00:00
|
|
|
|
2014-11-07 02:29:53 +00:00
|
|
|
else if (name == "bibtopic")
|
|
|
|
h_use_bibtopic = "true";
|
|
|
|
|
2018-03-09 12:30:52 +00:00
|
|
|
else if (name == "chapterbib")
|
|
|
|
h_multibib = "child";
|
|
|
|
|
2011-01-06 20:57:16 +00:00
|
|
|
else if (name == "hyperref")
|
|
|
|
handle_hyperref(options);
|
|
|
|
|
2014-01-28 11:44:22 +00:00
|
|
|
else if (name == "algorithm2e") {
|
|
|
|
// Load "algorithm2e" module
|
|
|
|
addModule("algorithm2e");
|
|
|
|
// Add the package options to the global document options
|
|
|
|
if (!options.empty()) {
|
|
|
|
if (h_options.empty())
|
|
|
|
h_options = join(options, ",");
|
|
|
|
else
|
|
|
|
h_options += ',' + join(options, ",");
|
|
|
|
}
|
|
|
|
}
|
2016-06-03 05:40:21 +00:00
|
|
|
else if (name == "microtype") {
|
|
|
|
//we internally support only microtype without params
|
|
|
|
if (options.empty())
|
2017-04-08 02:55:22 +00:00
|
|
|
h_use_microtype = "true";
|
2016-06-03 05:40:21 +00:00
|
|
|
else
|
|
|
|
h_preamble << "\\usepackage[" << opts << "]{microtype}";
|
|
|
|
}
|
2014-01-28 11:44:22 +00:00
|
|
|
|
2019-07-14 07:41:17 +00:00
|
|
|
else if (name == "lineno") {
|
|
|
|
h_use_lineno = "true";
|
|
|
|
if (!options.empty()) {
|
|
|
|
h_lineno_options = join(options, ",");
|
|
|
|
options.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-08-11 00:07:08 +00:00
|
|
|
else if (!in_lyx_preamble) {
|
2008-09-28 20:15:08 +00:00
|
|
|
if (options.empty())
|
2012-10-05 20:16:46 +00:00
|
|
|
h_preamble << "\\usepackage{" << name << '}';
|
2008-09-28 20:15:08 +00:00
|
|
|
else {
|
2011-12-14 00:20:41 +00:00
|
|
|
h_preamble << "\\usepackage[" << opts << "]{"
|
2012-10-05 20:16:46 +00:00
|
|
|
<< name << '}';
|
2008-09-28 20:15:08 +00:00
|
|
|
options.clear();
|
|
|
|
}
|
2012-10-05 20:16:46 +00:00
|
|
|
if (p.next_token().cat() == catNewline ||
|
|
|
|
(p.next_token().cat() == catSpace &&
|
|
|
|
p.next_next_token().cat() == catNewline))
|
|
|
|
h_preamble << '\n';
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
2008-09-28 20:15:08 +00:00
|
|
|
|
2004-08-10 09:40:53 +00:00
|
|
|
// We need to do something with the options...
|
2016-01-31 11:54:59 +00:00
|
|
|
if (!options.empty() && !detectEncoding)
|
2004-08-10 09:40:53 +00:00
|
|
|
cerr << "Ignoring options '" << join(options, ",")
|
|
|
|
<< "' of package " << name << '.' << endl;
|
2009-06-15 00:16:31 +00:00
|
|
|
|
|
|
|
// remove the whitespace
|
|
|
|
p.skip_spaces();
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 12:47:45 +00:00
|
|
|
void Preamble::handle_if(Parser & p, bool in_lyx_preamble)
|
2011-01-12 22:03:15 +00:00
|
|
|
{
|
|
|
|
while (p.good()) {
|
|
|
|
Token t = p.get_token();
|
|
|
|
if (t.cat() == catEscape &&
|
|
|
|
is_known(t.cs(), known_if_commands))
|
|
|
|
handle_if(p, in_lyx_preamble);
|
|
|
|
else {
|
|
|
|
if (!in_lyx_preamble)
|
|
|
|
h_preamble << t.asInput();
|
|
|
|
if (t.cat() == catEscape && t.cs() == "fi")
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-11-28 00:03:11 +00:00
|
|
|
|
2015-05-13 23:02:37 +00:00
|
|
|
bool Preamble::writeLyXHeader(ostream & os, bool subdoc, string const & outfiledir)
|
2003-04-17 15:05:17 +00:00
|
|
|
{
|
2011-11-29 20:09:40 +00:00
|
|
|
if (contains(h_float_placement, "H"))
|
|
|
|
registerAutomaticallyLoadedPackage("float");
|
|
|
|
if (h_spacing != "single" && h_spacing != "default")
|
|
|
|
registerAutomaticallyLoadedPackage("setspace");
|
2012-05-06 15:37:09 +00:00
|
|
|
if (h_use_packages["amsmath"] == "2") {
|
|
|
|
// amsbsy and amstext are already provided by amsmath
|
|
|
|
registerAutomaticallyLoadedPackage("amsbsy");
|
|
|
|
registerAutomaticallyLoadedPackage("amstext");
|
|
|
|
}
|
2011-11-29 20:09:40 +00:00
|
|
|
|
2009-12-10 03:07:36 +00:00
|
|
|
// output the LyX file settings
|
2013-07-07 07:56:34 +00:00
|
|
|
// Important: Keep the version formatting in sync with LyX and
|
|
|
|
// lyx2lyx (bug 7951)
|
2015-05-13 23:02:37 +00:00
|
|
|
string const origin = roundtripMode() ? "roundtrip" : outfiledir;
|
2013-07-07 07:56:34 +00:00
|
|
|
os << "#LyX file created by tex2lyx " << lyx_version_major << '.'
|
|
|
|
<< lyx_version_minor << '\n'
|
2010-12-12 11:45:09 +00:00
|
|
|
<< "\\lyxformat " << LYX_FORMAT << '\n'
|
2004-08-29 09:44:40 +00:00
|
|
|
<< "\\begin_document\n"
|
|
|
|
<< "\\begin_header\n"
|
2015-12-20 16:37:29 +00:00
|
|
|
<< "\\save_transient_properties " << h_save_transient_properties << "\n"
|
2015-05-13 23:02:37 +00:00
|
|
|
<< "\\origin " << origin << "\n"
|
2007-12-04 20:09:40 +00:00
|
|
|
<< "\\textclass " << h_textclass << "\n";
|
2011-12-04 15:35:59 +00:00
|
|
|
string const raw = subdoc ? empty_string() : h_preamble.str();
|
2011-10-30 18:12:49 +00:00
|
|
|
if (!raw.empty()) {
|
|
|
|
os << "\\begin_preamble\n";
|
|
|
|
for (string::size_type i = 0; i < raw.size(); ++i) {
|
|
|
|
if (raw[i] == package_beg_sep) {
|
|
|
|
// Here follows some package loading code that
|
|
|
|
// must be skipped if the package is loaded
|
|
|
|
// automatically.
|
|
|
|
string::size_type j = raw.find(package_mid_sep, i);
|
|
|
|
if (j == string::npos)
|
|
|
|
return false;
|
|
|
|
string::size_type k = raw.find(package_end_sep, j);
|
|
|
|
if (k == string::npos)
|
|
|
|
return false;
|
|
|
|
string const package = raw.substr(i + 1, j - i - 1);
|
|
|
|
string const replacement = raw.substr(j + 1, k - j - 1);
|
|
|
|
if (auto_packages.find(package) == auto_packages.end())
|
|
|
|
os << replacement;
|
|
|
|
i = k;
|
|
|
|
} else
|
|
|
|
os.put(raw[i]);
|
|
|
|
}
|
|
|
|
os << "\n\\end_preamble\n";
|
|
|
|
}
|
2003-11-19 10:35:50 +00:00
|
|
|
if (!h_options.empty())
|
2007-12-04 20:09:40 +00:00
|
|
|
os << "\\options " << h_options << "\n";
|
2011-10-30 13:44:00 +00:00
|
|
|
os << "\\use_default_options " << h_use_default_options << "\n";
|
|
|
|
if (!used_modules.empty()) {
|
|
|
|
os << "\\begin_modules\n";
|
|
|
|
vector<string>::const_iterator const end = used_modules.end();
|
|
|
|
vector<string>::const_iterator it = used_modules.begin();
|
2012-05-28 20:41:32 +00:00
|
|
|
for (; it != end; ++it)
|
2011-10-30 13:44:00 +00:00
|
|
|
os << *it << '\n';
|
|
|
|
os << "\\end_modules\n";
|
|
|
|
}
|
2018-03-09 16:27:55 +00:00
|
|
|
if (!h_includeonlys.empty()) {
|
|
|
|
os << "\\begin_includeonly\n";
|
|
|
|
for (auto const & iofile : h_includeonlys)
|
|
|
|
os << iofile << '\n';
|
|
|
|
os << "\\end_includeonly\n";
|
|
|
|
}
|
2012-06-24 13:29:32 +00:00
|
|
|
os << "\\maintain_unincluded_children " << h_maintain_unincluded_children << "\n"
|
|
|
|
<< "\\language " << h_language << "\n"
|
2011-10-22 19:27:46 +00:00
|
|
|
<< "\\language_package " << h_language_package << "\n"
|
2003-04-17 15:05:17 +00:00
|
|
|
<< "\\inputencoding " << h_inputencoding << "\n"
|
2011-10-22 19:54:31 +00:00
|
|
|
<< "\\fontencoding " << h_fontencoding << "\n"
|
2015-11-09 06:33:57 +00:00
|
|
|
<< "\\font_roman \"" << h_font_roman[0]
|
|
|
|
<< "\" \"" << h_font_roman[1] << "\"\n"
|
|
|
|
<< "\\font_sans \"" << h_font_sans[0] << "\" \"" << h_font_sans[1] << "\"\n"
|
|
|
|
<< "\\font_typewriter \"" << h_font_typewriter[0]
|
|
|
|
<< "\" \"" << h_font_typewriter[1] << "\"\n"
|
|
|
|
<< "\\font_math \"" << h_font_math[0] << "\" \"" << h_font_math[1] << "\"\n"
|
2007-12-05 20:02:49 +00:00
|
|
|
<< "\\font_default_family " << h_font_default_family << "\n"
|
2014-12-30 16:44:08 +00:00
|
|
|
<< "\\use_non_tex_fonts " << (h_use_non_tex_fonts ? "true" : "false") << '\n'
|
2007-12-05 20:02:49 +00:00
|
|
|
<< "\\font_sc " << h_font_sc << "\n"
|
2019-07-14 09:41:36 +00:00
|
|
|
<< "\\font_roman_osf " << h_font_roman_osf << "\n"
|
|
|
|
<< "\\font_sans_osf " << h_font_sans_osf << "\n"
|
|
|
|
<< "\\font_typewriter_osf " << h_font_typewriter_osf << "\n";
|
2019-07-11 18:28:34 +00:00
|
|
|
if (!h_font_roman_opts.empty())
|
|
|
|
os << "\\font_roman_opts \"" << h_font_roman_opts << "\"" << '\n';
|
|
|
|
os << "\\font_sf_scale " << h_font_sf_scale[0]
|
|
|
|
<< ' ' << h_font_sf_scale[1] << '\n';
|
|
|
|
if (!h_font_sans_opts.empty())
|
|
|
|
os << "\\font_sans_opts \"" << h_font_sans_opts << "\"" << '\n';
|
|
|
|
os << "\\font_tt_scale " << h_font_tt_scale[0]
|
2015-11-09 06:33:57 +00:00
|
|
|
<< ' ' << h_font_tt_scale[1] << '\n';
|
2012-12-30 10:58:21 +00:00
|
|
|
if (!h_font_cjk.empty())
|
|
|
|
os << "\\font_cjk " << h_font_cjk << '\n';
|
2019-07-11 18:28:34 +00:00
|
|
|
if (!h_font_typewriter_opts.empty())
|
|
|
|
os << "\\font_typewriter_opts \"" << h_font_typewriter_opts << "\"" << '\n';
|
2016-06-03 05:40:21 +00:00
|
|
|
os << "\\use_microtype " << h_use_microtype << '\n'
|
2017-04-08 02:55:22 +00:00
|
|
|
<< "\\use_dash_ligatures " << h_use_dash_ligatures << '\n'
|
2016-06-03 05:40:21 +00:00
|
|
|
<< "\\graphics " << h_graphics << '\n'
|
2012-06-24 13:29:32 +00:00
|
|
|
<< "\\default_output_format " << h_default_output_format << "\n"
|
2012-06-24 14:59:21 +00:00
|
|
|
<< "\\output_sync " << h_output_sync << "\n";
|
|
|
|
if (h_output_sync == "1")
|
|
|
|
os << "\\output_sync_macro \"" << h_output_sync_macro << "\"\n";
|
|
|
|
os << "\\bibtex_command " << h_bibtex_command << "\n"
|
2012-06-24 13:29:32 +00:00
|
|
|
<< "\\index_command " << h_index_command << "\n";
|
2010-12-18 20:41:41 +00:00
|
|
|
if (!h_float_placement.empty())
|
|
|
|
os << "\\float_placement " << h_float_placement << "\n";
|
|
|
|
os << "\\paperfontsize " << h_paperfontsize << "\n"
|
2003-04-17 15:05:17 +00:00
|
|
|
<< "\\spacing " << h_spacing << "\n"
|
2010-12-18 20:41:41 +00:00
|
|
|
<< "\\use_hyperref " << h_use_hyperref << '\n';
|
2012-10-05 22:29:16 +00:00
|
|
|
if (h_use_hyperref == "true") {
|
2010-12-18 20:41:41 +00:00
|
|
|
if (!h_pdf_title.empty())
|
2015-11-02 15:23:28 +00:00
|
|
|
os << "\\pdf_title " << Lexer::quoteString(h_pdf_title) << '\n';
|
2010-12-18 20:41:41 +00:00
|
|
|
if (!h_pdf_author.empty())
|
2015-11-02 15:23:28 +00:00
|
|
|
os << "\\pdf_author " << Lexer::quoteString(h_pdf_author) << '\n';
|
2010-12-18 20:41:41 +00:00
|
|
|
if (!h_pdf_subject.empty())
|
2015-11-02 15:23:28 +00:00
|
|
|
os << "\\pdf_subject " << Lexer::quoteString(h_pdf_subject) << '\n';
|
2010-12-18 20:41:41 +00:00
|
|
|
if (!h_pdf_keywords.empty())
|
2015-11-02 15:23:28 +00:00
|
|
|
os << "\\pdf_keywords " << Lexer::quoteString(h_pdf_keywords) << '\n';
|
2010-12-18 20:41:41 +00:00
|
|
|
os << "\\pdf_bookmarks " << h_pdf_bookmarks << "\n"
|
|
|
|
"\\pdf_bookmarksnumbered " << h_pdf_bookmarksnumbered << "\n"
|
|
|
|
"\\pdf_bookmarksopen " << h_pdf_bookmarksopen << "\n"
|
|
|
|
"\\pdf_bookmarksopenlevel " << h_pdf_bookmarksopenlevel << "\n"
|
|
|
|
"\\pdf_breaklinks " << h_pdf_breaklinks << "\n"
|
|
|
|
"\\pdf_pdfborder " << h_pdf_pdfborder << "\n"
|
|
|
|
"\\pdf_colorlinks " << h_pdf_colorlinks << "\n"
|
|
|
|
"\\pdf_backref " << h_pdf_backref << "\n"
|
|
|
|
"\\pdf_pdfusetitle " << h_pdf_pdfusetitle << '\n';
|
|
|
|
if (!h_pdf_pagemode.empty())
|
|
|
|
os << "\\pdf_pagemode " << h_pdf_pagemode << '\n';
|
|
|
|
if (!h_pdf_quoted_options.empty())
|
2015-11-02 15:23:28 +00:00
|
|
|
os << "\\pdf_quoted_options " << Lexer::quoteString(h_pdf_quoted_options) << '\n';
|
2010-12-18 20:41:41 +00:00
|
|
|
}
|
|
|
|
os << "\\papersize " << h_papersize << "\n"
|
2012-01-05 20:53:48 +00:00
|
|
|
<< "\\use_geometry " << h_use_geometry << '\n';
|
|
|
|
for (map<string, string>::const_iterator it = h_use_packages.begin();
|
2012-05-28 20:41:32 +00:00
|
|
|
it != h_use_packages.end(); ++it)
|
2012-01-05 20:53:48 +00:00
|
|
|
os << "\\use_package " << it->first << ' ' << it->second << '\n';
|
|
|
|
os << "\\cite_engine " << h_cite_engine << '\n'
|
2012-01-09 13:16:41 +00:00
|
|
|
<< "\\cite_engine_type " << h_cite_engine_type << '\n'
|
2011-12-14 01:11:18 +00:00
|
|
|
<< "\\biblio_style " << h_biblio_style << "\n"
|
2018-03-04 15:46:31 +00:00
|
|
|
<< "\\use_bibtopic " << h_use_bibtopic << "\n";
|
|
|
|
if (!h_biblio_options.empty())
|
|
|
|
os << "\\biblio_options " << h_biblio_options << "\n";
|
|
|
|
if (!h_biblatex_bibstyle.empty())
|
|
|
|
os << "\\biblatex_bibstyle " << h_biblatex_bibstyle << "\n";
|
|
|
|
if (!h_biblatex_citestyle.empty())
|
|
|
|
os << "\\biblatex_citestyle " << h_biblatex_citestyle << "\n";
|
2018-03-04 16:29:59 +00:00
|
|
|
if (!h_multibib.empty())
|
|
|
|
os << "\\multibib " << h_multibib << "\n";
|
2018-03-04 15:46:31 +00:00
|
|
|
os << "\\use_indices " << h_use_indices << "\n"
|
2011-10-22 17:25:34 +00:00
|
|
|
<< "\\paperorientation " << h_paperorientation << '\n'
|
|
|
|
<< "\\suppress_date " << h_suppress_date << '\n'
|
2011-12-07 22:46:15 +00:00
|
|
|
<< "\\justification " << h_justification << '\n'
|
tex2lyx: import minted listings
This commit updates tex2lyx in order to also import minted listings.
For the floating version of a listing, minted uses the listing
environment, a concept that is not shared with the listings package,
towards which our listings inset is geared.
For this reason, a kludge is necessary when importing minted listings
not previously exported by LyX itself.
If the floating listing contains only a caption and a label (other
than the listing itself), everything is fine and the import is (or
aims to be) perfect. But, as in all other floating ebvironments,
one can also stick there other elements, which don't have a place
in the listings inset. So, in order to avoid a data loss, tex2lyx
sticks everything into the caption. In this way, things may be
rearranged in the GUI, if necessary. There is no other way, apart
from a complete redesign of the listings inset, of course. However,
I think that this is an acceptable compromise.
2017-06-17 00:23:00 +00:00
|
|
|
<< "\\use_refstyle " << h_use_refstyle << '\n'
|
2019-07-14 07:41:17 +00:00
|
|
|
<< "\\use_minted " << h_use_minted << '\n'
|
|
|
|
<< "\\use_lineno " << h_use_lineno << '\n';
|
|
|
|
if (!h_lineno_options.empty())
|
|
|
|
os << "\\lineno_options " << h_lineno_options << '\n';
|
2011-10-24 00:29:59 +00:00
|
|
|
if (!h_fontcolor.empty())
|
|
|
|
os << "\\fontcolor " << h_fontcolor << '\n';
|
2011-10-21 21:11:37 +00:00
|
|
|
if (!h_notefontcolor.empty())
|
2011-01-14 20:00:55 +00:00
|
|
|
os << "\\notefontcolor " << h_notefontcolor << '\n';
|
2011-10-24 00:29:59 +00:00
|
|
|
if (!h_backgroundcolor.empty())
|
|
|
|
os << "\\backgroundcolor " << h_backgroundcolor << '\n';
|
|
|
|
if (!h_boxbgcolor.empty())
|
|
|
|
os << "\\boxbgcolor " << h_boxbgcolor << '\n';
|
2013-02-17 05:18:42 +00:00
|
|
|
if (index_number != 0)
|
|
|
|
for (int i = 0; i < index_number; i++) {
|
|
|
|
os << "\\index " << h_index[i] << '\n'
|
|
|
|
<< "\\shortcut " << h_shortcut[i] << '\n'
|
|
|
|
<< "\\color " << h_color << '\n'
|
|
|
|
<< "\\end_index\n";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
os << "\\index " << h_index[0] << '\n'
|
|
|
|
<< "\\shortcut " << h_shortcut[0] << '\n'
|
|
|
|
<< "\\color " << h_color << '\n'
|
|
|
|
<< "\\end_index\n";
|
|
|
|
}
|
2011-01-14 20:00:55 +00:00
|
|
|
os << h_margins
|
2003-04-17 15:05:17 +00:00
|
|
|
<< "\\secnumdepth " << h_secnumdepth << "\n"
|
|
|
|
<< "\\tocdepth " << h_tocdepth << "\n"
|
2011-01-02 16:54:58 +00:00
|
|
|
<< "\\paragraph_separation " << h_paragraph_separation << "\n";
|
2011-10-21 21:11:37 +00:00
|
|
|
if (h_paragraph_separation == "skip")
|
2011-01-02 16:54:58 +00:00
|
|
|
os << "\\defskip " << h_defskip << "\n";
|
|
|
|
else
|
|
|
|
os << "\\paragraph_indentation " << h_paragraph_indentation << "\n";
|
2017-04-13 00:31:26 +00:00
|
|
|
os << "\\is_math_indent " << h_is_mathindent << "\n";
|
|
|
|
if (!h_mathindentation.empty())
|
|
|
|
os << "\\math_indentation " << h_mathindentation << "\n";
|
2017-05-13 18:39:45 +00:00
|
|
|
os << "\\math_numbering_side " << h_math_numbering_side << "\n";
|
2017-04-08 02:55:22 +00:00
|
|
|
os << "\\quotes_style " << h_quotes_style << "\n"
|
|
|
|
<< "\\dynamic_quotes " << h_dynamic_quotes << "\n"
|
2003-04-17 15:05:17 +00:00
|
|
|
<< "\\papercolumns " << h_papercolumns << "\n"
|
|
|
|
<< "\\papersides " << h_papersides << "\n"
|
2010-12-18 20:41:41 +00:00
|
|
|
<< "\\paperpagestyle " << h_paperpagestyle << "\n";
|
|
|
|
if (!h_listings_params.empty())
|
|
|
|
os << "\\listings_params " << h_listings_params << "\n";
|
|
|
|
os << "\\tracking_changes " << h_tracking_changes << "\n"
|
2005-02-06 09:32:52 +00:00
|
|
|
<< "\\output_changes " << h_output_changes << "\n"
|
2011-10-21 21:11:37 +00:00
|
|
|
<< "\\html_math_output " << h_html_math_output << "\n"
|
2011-10-22 19:27:46 +00:00
|
|
|
<< "\\html_css_as_file " << h_html_css_as_file << "\n"
|
2011-10-21 21:11:37 +00:00
|
|
|
<< "\\html_be_strict " << h_html_be_strict << "\n"
|
2011-11-06 17:03:59 +00:00
|
|
|
<< authors_
|
2004-08-29 09:44:40 +00:00
|
|
|
<< "\\end_header\n\n"
|
|
|
|
<< "\\begin_body\n";
|
2011-10-30 18:12:49 +00:00
|
|
|
return true;
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
2011-01-12 21:04:39 +00:00
|
|
|
|
2011-10-30 13:21:06 +00:00
|
|
|
void Preamble::parse(Parser & p, string const & forceclass,
|
|
|
|
TeX2LyXDocClass & tc)
|
2003-04-17 15:05:17 +00:00
|
|
|
{
|
2003-07-03 13:01:51 +00:00
|
|
|
// initialize fixed types
|
2015-01-06 18:20:05 +00:00
|
|
|
special_columns_['D'] = 3;
|
2016-01-31 11:54:59 +00:00
|
|
|
parse(p, forceclass, false, tc);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Preamble::parse(Parser & p, string const & forceclass,
|
|
|
|
bool detectEncoding, TeX2LyXDocClass & tc)
|
|
|
|
{
|
2003-10-23 11:46:33 +00:00
|
|
|
bool is_full_document = false;
|
2009-08-11 00:07:08 +00:00
|
|
|
bool is_lyx_file = false;
|
|
|
|
bool in_lyx_preamble = false;
|
2003-07-03 13:01:51 +00:00
|
|
|
|
2004-06-18 06:47:19 +00:00
|
|
|
// determine whether this is a full document or a fragment for inclusion
|
2003-04-17 15:05:17 +00:00
|
|
|
while (p.good()) {
|
2003-04-23 15:14:43 +00:00
|
|
|
Token const & t = p.get_token();
|
2003-04-17 15:05:17 +00:00
|
|
|
|
2003-11-05 10:14:13 +00:00
|
|
|
if (t.cat() == catEscape && t.cs() == "documentclass") {
|
2003-10-23 11:46:33 +00:00
|
|
|
is_full_document = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
p.reset();
|
|
|
|
|
2016-01-31 11:54:59 +00:00
|
|
|
if (detectEncoding && !is_full_document)
|
|
|
|
return;
|
|
|
|
|
2003-10-23 11:46:33 +00:00
|
|
|
while (is_full_document && p.good()) {
|
2019-04-16 18:17:32 +00:00
|
|
|
if (detectEncoding && h_inputencoding != "auto-legacy" &&
|
|
|
|
h_inputencoding != "auto-legacy-plain")
|
2016-01-31 11:54:59 +00:00
|
|
|
return;
|
|
|
|
|
2003-10-23 11:46:33 +00:00
|
|
|
Token const & t = p.get_token();
|
|
|
|
|
2003-04-17 15:05:17 +00:00
|
|
|
#ifdef FILEDEBUG
|
2016-01-31 11:54:59 +00:00
|
|
|
if (!detectEncoding)
|
|
|
|
cerr << "t: " << t << '\n';
|
2003-04-17 15:05:17 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
//
|
|
|
|
// cat codes
|
|
|
|
//
|
2009-08-11 00:07:08 +00:00
|
|
|
if (!in_lyx_preamble &&
|
|
|
|
(t.cat() == catLetter ||
|
2008-09-28 20:15:08 +00:00
|
|
|
t.cat() == catSuper ||
|
|
|
|
t.cat() == catSub ||
|
|
|
|
t.cat() == catOther ||
|
|
|
|
t.cat() == catMath ||
|
|
|
|
t.cat() == catActive ||
|
|
|
|
t.cat() == catBegin ||
|
|
|
|
t.cat() == catEnd ||
|
|
|
|
t.cat() == catAlign ||
|
2018-03-10 14:00:30 +00:00
|
|
|
t.cat() == catParameter)) {
|
2009-12-09 12:29:48 +00:00
|
|
|
h_preamble << t.cs();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
|
|
|
}
|
2008-09-28 20:15:08 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (!in_lyx_preamble &&
|
|
|
|
(t.cat() == catSpace || t.cat() == catNewline)) {
|
2007-11-28 00:03:11 +00:00
|
|
|
h_preamble << t.asInput();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
|
|
|
}
|
2003-11-05 10:14:13 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cat() == catComment) {
|
2009-08-11 00:07:08 +00:00
|
|
|
static regex const islyxfile("%% LyX .* created this file");
|
|
|
|
static regex const usercommands("User specified LaTeX commands");
|
|
|
|
|
2008-09-28 20:15:08 +00:00
|
|
|
string const comment = t.asInput();
|
2009-08-11 00:07:08 +00:00
|
|
|
|
2008-10-12 19:19:41 +00:00
|
|
|
// magically switch encoding default if it looks like XeLaTeX
|
|
|
|
static string const magicXeLaTeX =
|
|
|
|
"% This document must be compiled with XeLaTeX ";
|
2011-12-14 00:20:41 +00:00
|
|
|
if (comment.size() > magicXeLaTeX.size()
|
2008-10-12 19:19:41 +00:00
|
|
|
&& comment.substr(0, magicXeLaTeX.size()) == magicXeLaTeX
|
2019-04-16 18:17:32 +00:00
|
|
|
&& h_inputencoding == "auto-legacy") {
|
2016-01-31 11:54:59 +00:00
|
|
|
if (!detectEncoding)
|
|
|
|
cerr << "XeLaTeX comment found, switching to UTF8\n";
|
2008-10-12 19:19:41 +00:00
|
|
|
h_inputencoding = "utf8";
|
|
|
|
}
|
2008-09-28 20:15:08 +00:00
|
|
|
smatch sub;
|
2009-08-11 00:07:08 +00:00
|
|
|
if (regex_search(comment, sub, islyxfile)) {
|
|
|
|
is_lyx_file = true;
|
|
|
|
in_lyx_preamble = true;
|
|
|
|
} else if (is_lyx_file
|
|
|
|
&& regex_search(comment, sub, usercommands))
|
|
|
|
in_lyx_preamble = false;
|
|
|
|
else if (!in_lyx_preamble)
|
2008-09-28 20:15:08 +00:00
|
|
|
h_preamble << t.asInput();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2008-09-28 20:15:08 +00:00
|
|
|
}
|
2003-04-17 15:05:17 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "PassOptionsToPackage") {
|
2018-03-04 15:45:37 +00:00
|
|
|
string const poptions = p.getArg('{', '}');
|
|
|
|
string const package = p.verbatim_item();
|
|
|
|
extra_package_options_.insert(make_pair(package, poptions));
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2018-03-04 15:45:37 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "pagestyle") {
|
2003-10-23 11:46:33 +00:00
|
|
|
h_paperpagestyle = p.verbatim_item();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
|
|
|
}
|
2003-04-17 15:05:17 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "setdefaultlanguage") {
|
2012-06-23 02:28:52 +00:00
|
|
|
xetex = true;
|
|
|
|
// We don't yet care about non-language variant options
|
|
|
|
// because LyX doesn't support this yet, see bug #8214
|
|
|
|
if (p.hasOpt()) {
|
|
|
|
string langopts = p.getOpt();
|
|
|
|
// check if the option contains a variant, if yes, extract it
|
|
|
|
string::size_type pos_var = langopts.find("variant");
|
|
|
|
string::size_type i = langopts.find(',', pos_var);
|
2012-06-25 22:46:02 +00:00
|
|
|
string::size_type k = langopts.find('=', pos_var);
|
2012-06-23 02:28:52 +00:00
|
|
|
if (pos_var != string::npos){
|
|
|
|
string variant;
|
|
|
|
if (i == string::npos)
|
2012-06-25 22:46:02 +00:00
|
|
|
variant = langopts.substr(k + 1, langopts.length() - k - 2);
|
2012-06-23 02:28:52 +00:00
|
|
|
else
|
2012-06-25 22:46:02 +00:00
|
|
|
variant = langopts.substr(k + 1, i - k - 1);
|
2012-06-23 02:28:52 +00:00
|
|
|
h_language = variant;
|
|
|
|
}
|
|
|
|
p.verbatim_item();
|
|
|
|
} else
|
|
|
|
h_language = p.verbatim_item();
|
|
|
|
//finally translate the poyglossia name to a LyX name
|
|
|
|
h_language = polyglossia2lyx(h_language);
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2012-06-22 15:19:46 +00:00
|
|
|
}
|
2012-06-08 00:37:36 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "setotherlanguage") {
|
2012-06-23 02:28:52 +00:00
|
|
|
// We don't yet care about the option because LyX doesn't
|
2012-06-22 15:19:46 +00:00
|
|
|
// support this yet, see bug #8214
|
|
|
|
p.hasOpt() ? p.getOpt() : string();
|
|
|
|
p.verbatim_item();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2012-06-22 15:19:46 +00:00
|
|
|
}
|
2012-06-08 00:37:36 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "setmainfont") {
|
2019-07-11 18:28:34 +00:00
|
|
|
string fontopts = p.hasOpt() ? p.getArg('[', ']') : string();
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[1] = p.getArg('{', '}');
|
2019-07-11 18:28:34 +00:00
|
|
|
if (!fontopts.empty()) {
|
|
|
|
vector<string> opts = getVectorFromString(fontopts);
|
|
|
|
fontopts.clear();
|
|
|
|
for (auto const & opt : opts) {
|
|
|
|
if (opt == "Mapping=tex-text" || opt == "Ligatures=TeX")
|
|
|
|
// ignore
|
|
|
|
continue;
|
|
|
|
if (!fontopts.empty())
|
|
|
|
fontopts += ", ";
|
|
|
|
fontopts += opt;
|
|
|
|
}
|
|
|
|
h_font_roman_opts = fontopts;
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2012-06-08 00:37:36 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "setsansfont" || t.cs() == "setmonofont") {
|
2012-06-25 22:46:02 +00:00
|
|
|
// LyX currently only supports the scale option
|
2019-07-11 18:28:34 +00:00
|
|
|
string scale, fontopts;
|
2012-06-25 22:46:02 +00:00
|
|
|
if (p.hasOpt()) {
|
2019-07-11 18:28:34 +00:00
|
|
|
fontopts = p.getArg('[', ']');
|
|
|
|
if (!fontopts.empty()) {
|
|
|
|
vector<string> opts = getVectorFromString(fontopts);
|
|
|
|
fontopts.clear();
|
|
|
|
for (auto const & opt : opts) {
|
|
|
|
if (opt == "Mapping=tex-text" || opt == "Ligatures=TeX")
|
|
|
|
// ignore
|
|
|
|
continue;
|
|
|
|
if (prefixIs(opt, "Scale=")) {
|
|
|
|
scale_as_percentage(opt, scale);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!fontopts.empty())
|
|
|
|
fontopts += ", ";
|
|
|
|
fontopts += opt;
|
|
|
|
}
|
2012-06-25 22:46:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (t.cs() == "setsansfont") {
|
|
|
|
if (!scale.empty())
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_sf_scale[1] = scale;
|
|
|
|
h_font_sans[1] = p.getArg('{', '}');
|
2019-07-11 18:28:34 +00:00
|
|
|
if (!fontopts.empty())
|
|
|
|
h_font_sans_opts = fontopts;
|
2012-06-25 22:46:02 +00:00
|
|
|
} else {
|
|
|
|
if (!scale.empty())
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_tt_scale[1] = scale;
|
|
|
|
h_font_typewriter[1] = p.getArg('{', '}');
|
2019-07-11 18:28:34 +00:00
|
|
|
if (!fontopts.empty())
|
|
|
|
h_font_typewriter_opts = fontopts;
|
2012-06-25 22:46:02 +00:00
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2012-06-08 00:37:36 +00:00
|
|
|
}
|
|
|
|
|
2019-07-11 11:21:32 +00:00
|
|
|
if (t.cs() == "babelfont") {
|
|
|
|
xetex = true;
|
|
|
|
h_use_non_tex_fonts = true;
|
|
|
|
h_language_package = "babel";
|
|
|
|
if (h_inputencoding == "auto-legacy")
|
|
|
|
p.setEncoding("UTF-8");
|
|
|
|
// we don't care about the lang option
|
|
|
|
string const lang = p.hasOpt() ? p.getArg('[', ']') : string();
|
|
|
|
string const family = p.getArg('{', '}');
|
2019-07-11 18:28:34 +00:00
|
|
|
string fontopts = p.hasOpt() ? p.getArg('[', ']') : string();
|
2019-07-11 11:21:32 +00:00
|
|
|
string const fontname = p.getArg('{', '}');
|
|
|
|
if (lang.empty() && family == "rm") {
|
|
|
|
h_font_roman[1] = fontname;
|
2019-07-11 18:28:34 +00:00
|
|
|
if (!fontopts.empty()) {
|
|
|
|
vector<string> opts = getVectorFromString(fontopts);
|
|
|
|
fontopts.clear();
|
|
|
|
for (auto const & opt : opts) {
|
|
|
|
if (opt == "Mapping=tex-text" || opt == "Ligatures=TeX")
|
|
|
|
// ignore
|
|
|
|
continue;
|
|
|
|
if (!fontopts.empty())
|
|
|
|
fontopts += ", ";
|
|
|
|
fontopts += opt;
|
|
|
|
}
|
|
|
|
h_font_roman_opts = fontopts;
|
|
|
|
}
|
2019-07-11 11:21:32 +00:00
|
|
|
continue;
|
|
|
|
} else if (lang.empty() && (family == "sf" || family == "tt")) {
|
|
|
|
// LyX currently only supports the scale option
|
|
|
|
string scale;
|
|
|
|
if (!fontopts.empty()) {
|
2019-07-11 18:28:34 +00:00
|
|
|
vector<string> opts = getVectorFromString(fontopts);
|
|
|
|
fontopts.clear();
|
|
|
|
for (auto const & opt : opts) {
|
|
|
|
if (opt == "Mapping=tex-text" || opt == "Ligatures=TeX")
|
|
|
|
// ignore
|
|
|
|
continue;
|
|
|
|
if (prefixIs(opt, "Scale=")) {
|
|
|
|
scale_as_percentage(opt, scale);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!fontopts.empty())
|
|
|
|
fontopts += ", ";
|
|
|
|
fontopts += opt;
|
2019-07-11 11:21:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (family == "sf") {
|
|
|
|
if (!scale.empty())
|
|
|
|
h_font_sf_scale[1] = scale;
|
|
|
|
h_font_sans[1] = fontname;
|
2019-07-11 18:28:34 +00:00
|
|
|
if (!fontopts.empty())
|
|
|
|
h_font_sans_opts = fontopts;
|
2019-07-11 11:21:32 +00:00
|
|
|
} else {
|
|
|
|
if (!scale.empty())
|
|
|
|
h_font_tt_scale[1] = scale;
|
|
|
|
h_font_typewriter[1] = fontname;
|
2019-07-11 18:28:34 +00:00
|
|
|
if (!fontopts.empty())
|
|
|
|
h_font_typewriter_opts = fontopts;
|
2019-07-11 11:21:32 +00:00
|
|
|
}
|
|
|
|
continue;
|
|
|
|
} else {
|
|
|
|
// not rm, sf or tt or lang specific
|
|
|
|
h_preamble << '\\' << t.cs();
|
|
|
|
if (!lang.empty())
|
|
|
|
h_preamble << '[' << lang << ']';
|
|
|
|
h_preamble << '{' << family << '}';
|
|
|
|
if (!fontopts.empty())
|
|
|
|
h_preamble << '[' << fontopts << ']';
|
|
|
|
h_preamble << '{' << fontname << '}' << '\n';
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-11 18:49:28 +00:00
|
|
|
if (t.cs() == "date") {
|
2011-10-26 01:29:24 +00:00
|
|
|
string argument = p.getArg('{', '}');
|
|
|
|
if (argument.empty())
|
2011-10-24 02:06:05 +00:00
|
|
|
h_suppress_date = "true";
|
2011-10-26 01:29:24 +00:00
|
|
|
else
|
|
|
|
h_preamble << t.asInput() << '{' << argument << '}';
|
2018-03-11 18:49:28 +00:00
|
|
|
continue;
|
2011-10-24 02:06:05 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "color") {
|
2011-11-04 21:24:05 +00:00
|
|
|
string const space =
|
2011-11-06 17:32:15 +00:00
|
|
|
(p.hasOpt() ? p.getOpt() : string());
|
2011-10-26 00:31:02 +00:00
|
|
|
string argument = p.getArg('{', '}');
|
2011-10-26 01:18:27 +00:00
|
|
|
// check the case that a standard color is used
|
2011-11-04 21:24:05 +00:00
|
|
|
if (space.empty() && is_known(argument, known_basic_colors)) {
|
2011-10-30 18:12:49 +00:00
|
|
|
h_fontcolor = rgbcolor2code(argument);
|
2016-01-31 11:37:22 +00:00
|
|
|
registerAutomaticallyLoadedPackage("color");
|
2011-11-04 21:24:05 +00:00
|
|
|
} else if (space.empty() && argument == "document_fontcolor")
|
2016-01-31 11:37:22 +00:00
|
|
|
registerAutomaticallyLoadedPackage("color");
|
2011-10-26 01:18:27 +00:00
|
|
|
// check the case that LyX's document_fontcolor is defined
|
|
|
|
// but not used for \color
|
2011-10-30 18:12:49 +00:00
|
|
|
else {
|
2011-11-04 21:24:05 +00:00
|
|
|
h_preamble << t.asInput();
|
|
|
|
if (!space.empty())
|
2011-11-06 17:32:15 +00:00
|
|
|
h_preamble << space;
|
2011-11-04 21:24:05 +00:00
|
|
|
h_preamble << '{' << argument << '}';
|
2011-10-26 01:18:27 +00:00
|
|
|
// the color might already be set because \definecolor
|
|
|
|
// is parsed before this
|
2011-10-26 00:31:02 +00:00
|
|
|
h_fontcolor = "";
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2011-10-26 00:31:02 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "pagecolor") {
|
2011-10-26 00:31:02 +00:00
|
|
|
string argument = p.getArg('{', '}');
|
2011-10-26 01:18:27 +00:00
|
|
|
// check the case that a standard color is used
|
2011-10-30 18:12:49 +00:00
|
|
|
if (is_known(argument, known_basic_colors)) {
|
|
|
|
h_backgroundcolor = rgbcolor2code(argument);
|
|
|
|
} else if (argument == "page_backgroundcolor")
|
2016-01-31 11:37:22 +00:00
|
|
|
registerAutomaticallyLoadedPackage("color");
|
2011-10-26 01:18:27 +00:00
|
|
|
// check the case that LyX's page_backgroundcolor is defined
|
|
|
|
// but not used for \pagecolor
|
2011-10-30 18:12:49 +00:00
|
|
|
else {
|
2011-10-26 00:31:02 +00:00
|
|
|
h_preamble << t.asInput() << '{' << argument << '}';
|
2011-10-26 01:18:27 +00:00
|
|
|
// the color might already be set because \definecolor
|
|
|
|
// is parsed before this
|
2011-10-26 00:31:02 +00:00
|
|
|
h_backgroundcolor = "";
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2011-10-26 00:31:02 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "makeatletter") {
|
2009-06-15 00:16:31 +00:00
|
|
|
// LyX takes care of this
|
2013-01-25 11:48:52 +00:00
|
|
|
p.setCatcode('@', catLetter);
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2007-11-28 00:03:11 +00:00
|
|
|
}
|
2003-04-17 15:05:17 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "makeatother") {
|
2009-06-15 00:16:31 +00:00
|
|
|
// LyX takes care of this
|
2013-01-25 11:48:52 +00:00
|
|
|
p.setCatcode('@', catOther);
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2007-11-28 00:03:11 +00:00
|
|
|
}
|
2003-04-17 15:05:17 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "makeindex") {
|
2013-02-17 05:18:42 +00:00
|
|
|
// LyX will re-add this if a print index command is found
|
|
|
|
p.skip_spaces();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2013-02-17 05:18:42 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "newindex") {
|
2013-02-17 05:18:42 +00:00
|
|
|
string const indexname = p.getArg('[', ']');
|
|
|
|
string const shortcut = p.verbatim_item();
|
|
|
|
if (!indexname.empty())
|
|
|
|
h_index[index_number] = indexname;
|
|
|
|
else
|
|
|
|
h_index[index_number] = shortcut;
|
|
|
|
h_shortcut[index_number] = shortcut;
|
|
|
|
index_number += 1;
|
|
|
|
p.skip_spaces();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2013-02-17 05:18:42 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "addbibresource") {
|
2019-03-29 14:50:18 +00:00
|
|
|
string const options = p.getArg('[', ']');
|
|
|
|
string const arg = removeExtension(p.getArg('{', '}'));
|
|
|
|
if (!options.empty()) {
|
|
|
|
// check if the option contains a bibencoding, if yes, extract it
|
|
|
|
string::size_type pos = options.find("bibencoding=");
|
|
|
|
string encoding;
|
|
|
|
if (pos != string::npos) {
|
|
|
|
string::size_type i = options.find(',', pos);
|
|
|
|
if (i == string::npos)
|
|
|
|
encoding = options.substr(pos + 1);
|
|
|
|
else
|
|
|
|
encoding = options.substr(pos, i - pos);
|
|
|
|
pos = encoding.find('=');
|
|
|
|
if (pos == string::npos)
|
|
|
|
encoding.clear();
|
|
|
|
else
|
|
|
|
encoding = encoding.substr(pos + 1);
|
|
|
|
}
|
|
|
|
if (!encoding.empty())
|
|
|
|
biblatex_encodings.push_back(normalize_filename(arg) + ' ' + encoding);
|
|
|
|
}
|
|
|
|
biblatex_bibliographies.push_back(arg);
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
|
|
|
}
|
2018-03-04 15:46:31 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "bibliography") {
|
2018-03-04 15:46:31 +00:00
|
|
|
vector<string> bibs = getVectorFromString(p.getArg('{', '}'));
|
|
|
|
biblatex_bibliographies.insert(biblatex_bibliographies.end(), bibs.begin(), bibs.end());
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2018-03-04 15:46:31 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "RS@ifundefined") {
|
2013-02-17 02:15:24 +00:00
|
|
|
string const name = p.verbatim_item();
|
|
|
|
string const body1 = p.verbatim_item();
|
|
|
|
string const body2 = p.verbatim_item();
|
|
|
|
// only non-lyxspecific stuff
|
2013-02-22 21:21:56 +00:00
|
|
|
if (in_lyx_preamble &&
|
2015-05-24 12:21:36 +00:00
|
|
|
(name == "subsecref" || name == "thmref" || name == "lemref"))
|
2013-02-22 21:21:56 +00:00
|
|
|
p.skip_spaces();
|
|
|
|
else {
|
2013-02-17 02:15:24 +00:00
|
|
|
ostringstream ss;
|
|
|
|
ss << '\\' << t.cs();
|
|
|
|
ss << '{' << name << '}'
|
|
|
|
<< '{' << body1 << '}'
|
|
|
|
<< '{' << body2 << '}';
|
|
|
|
h_preamble << ss.str();
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2013-02-17 02:15:24 +00:00
|
|
|
}
|
2014-12-30 16:44:08 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "AtBeginDocument") {
|
2013-02-17 02:15:24 +00:00
|
|
|
string const name = p.verbatim_item();
|
2013-02-22 21:21:56 +00:00
|
|
|
// only non-lyxspecific stuff
|
|
|
|
if (in_lyx_preamble &&
|
|
|
|
(name == "\\providecommand\\partref[1]{\\ref{part:#1}}"
|
2013-02-17 02:15:24 +00:00
|
|
|
|| name == "\\providecommand\\chapref[1]{\\ref{chap:#1}}"
|
|
|
|
|| name == "\\providecommand\\secref[1]{\\ref{sec:#1}}"
|
2015-05-24 12:21:36 +00:00
|
|
|
|| name == "\\providecommand\\subsecref[1]{\\ref{subsec:#1}}"
|
2013-02-17 02:15:24 +00:00
|
|
|
|| name == "\\providecommand\\parref[1]{\\ref{par:#1}}"
|
|
|
|
|| name == "\\providecommand\\figref[1]{\\ref{fig:#1}}"
|
|
|
|
|| name == "\\providecommand\\tabref[1]{\\ref{tab:#1}}"
|
|
|
|
|| name == "\\providecommand\\algref[1]{\\ref{alg:#1}}"
|
|
|
|
|| name == "\\providecommand\\fnref[1]{\\ref{fn:#1}}"
|
|
|
|
|| name == "\\providecommand\\enuref[1]{\\ref{enu:#1}}"
|
|
|
|
|| name == "\\providecommand\\eqref[1]{\\ref{eq:#1}}"
|
|
|
|
|| name == "\\providecommand\\lemref[1]{\\ref{lem:#1}}"
|
|
|
|
|| name == "\\providecommand\\thmref[1]{\\ref{thm:#1}}"
|
|
|
|
|| name == "\\providecommand\\corref[1]{\\ref{cor:#1}}"
|
2013-02-22 21:21:56 +00:00
|
|
|
|| name == "\\providecommand\\propref[1]{\\ref{prop:#1}}"))
|
2013-02-17 02:15:24 +00:00
|
|
|
p.skip_spaces();
|
2013-02-22 21:21:56 +00:00
|
|
|
else {
|
2013-02-17 02:15:24 +00:00
|
|
|
ostringstream ss;
|
|
|
|
ss << '\\' << t.cs();
|
|
|
|
ss << '{' << name << '}';
|
|
|
|
h_preamble << ss.str();
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2013-02-17 02:15:24 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "newcommand" || t.cs() == "newcommandx"
|
|
|
|
|| t.cs() == "renewcommand" || t.cs() == "renewcommandx"
|
|
|
|
|| t.cs() == "providecommand" || t.cs() == "providecommandx"
|
|
|
|
|| t.cs() == "DeclareRobustCommand"
|
|
|
|
|| t.cs() == "DeclareRobustCommandx"
|
|
|
|
|| t.cs() == "ProvideTextCommandDefault"
|
|
|
|
|| t.cs() == "DeclareMathAccent") {
|
2003-04-17 15:05:17 +00:00
|
|
|
bool star = false;
|
2003-04-23 15:14:43 +00:00
|
|
|
if (p.next_token().character() == '*') {
|
|
|
|
p.get_token();
|
2003-04-17 15:05:17 +00:00
|
|
|
star = true;
|
|
|
|
}
|
2003-04-23 15:14:43 +00:00
|
|
|
string const name = p.verbatim_item();
|
2011-01-28 20:29:06 +00:00
|
|
|
string const opt1 = p.getFullOpt();
|
2005-01-06 13:22:20 +00:00
|
|
|
string const opt2 = p.getFullOpt();
|
2003-04-23 15:14:43 +00:00
|
|
|
string const body = p.verbatim_item();
|
2013-02-10 23:47:09 +00:00
|
|
|
// store the in_lyx_preamble setting
|
|
|
|
bool const was_in_lyx_preamble = in_lyx_preamble;
|
2007-12-05 20:02:49 +00:00
|
|
|
// font settings
|
|
|
|
if (name == "\\rmdefault")
|
2019-04-08 09:44:53 +00:00
|
|
|
if (is_known(body, known_roman_font_packages)) {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_roman[0] = body;
|
2013-02-11 00:37:03 +00:00
|
|
|
p.skip_spaces();
|
2013-02-10 23:47:09 +00:00
|
|
|
in_lyx_preamble = true;
|
|
|
|
}
|
2007-12-05 20:02:49 +00:00
|
|
|
if (name == "\\sfdefault")
|
2019-04-08 09:44:53 +00:00
|
|
|
if (is_known(body, known_sans_font_packages)) {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_sans[0] = body;
|
2013-02-11 00:37:03 +00:00
|
|
|
p.skip_spaces();
|
2013-02-10 23:47:09 +00:00
|
|
|
in_lyx_preamble = true;
|
|
|
|
}
|
2007-12-05 20:02:49 +00:00
|
|
|
if (name == "\\ttdefault")
|
2019-04-08 09:44:53 +00:00
|
|
|
if (is_known(body, known_typewriter_font_packages)) {
|
2015-11-09 06:33:57 +00:00
|
|
|
h_font_typewriter[0] = body;
|
2013-02-11 00:37:03 +00:00
|
|
|
p.skip_spaces();
|
2013-02-10 23:47:09 +00:00
|
|
|
in_lyx_preamble = true;
|
|
|
|
}
|
2007-12-05 20:02:49 +00:00
|
|
|
if (name == "\\familydefault") {
|
|
|
|
string family = body;
|
|
|
|
// remove leading "\"
|
|
|
|
h_font_default_family = family.erase(0,1);
|
2013-02-11 00:37:03 +00:00
|
|
|
p.skip_spaces();
|
2013-02-10 23:47:09 +00:00
|
|
|
in_lyx_preamble = true;
|
2007-12-05 20:02:49 +00:00
|
|
|
}
|
2013-02-10 23:47:09 +00:00
|
|
|
|
2015-05-24 23:40:59 +00:00
|
|
|
// remove LyX-specific definitions that are re-added by LyX
|
2011-11-25 01:01:45 +00:00
|
|
|
// if necessary
|
2015-05-24 23:48:28 +00:00
|
|
|
// \lyxline is an ancient command that is converted by tex2lyx into
|
|
|
|
// a \rule therefore remove its preamble code
|
|
|
|
if (name == "\\lyxdot" || name == "\\lyxarrow"
|
2015-05-25 00:02:10 +00:00
|
|
|
|| name == "\\lyxline" || name == "\\LyX") {
|
2013-02-11 00:37:03 +00:00
|
|
|
p.skip_spaces();
|
2011-11-25 01:01:45 +00:00
|
|
|
in_lyx_preamble = true;
|
2013-02-11 00:37:03 +00:00
|
|
|
}
|
2011-11-25 01:01:45 +00:00
|
|
|
|
2011-01-23 21:10:20 +00:00
|
|
|
// Add the command to the known commands
|
|
|
|
add_known_command(name, opt1, !opt2.empty(), from_utf8(body));
|
|
|
|
|
2003-04-17 15:05:17 +00:00
|
|
|
// only non-lyxspecific stuff
|
2009-08-11 00:07:08 +00:00
|
|
|
if (!in_lyx_preamble) {
|
2003-04-17 15:05:17 +00:00
|
|
|
ostringstream ss;
|
|
|
|
ss << '\\' << t.cs();
|
|
|
|
if (star)
|
|
|
|
ss << '*';
|
2005-01-06 13:22:20 +00:00
|
|
|
ss << '{' << name << '}' << opt1 << opt2
|
|
|
|
<< '{' << body << "}";
|
2019-04-04 14:39:20 +00:00
|
|
|
if (prefixIs(t.cs(), "renew") || !contains(h_preamble.str(), ss.str()))
|
|
|
|
h_preamble << ss.str();
|
2003-04-17 15:05:17 +00:00
|
|
|
/*
|
|
|
|
ostream & out = in_preamble ? h_preamble : os;
|
|
|
|
out << "\\" << t.cs() << "{" << name << "}"
|
2003-11-05 10:14:13 +00:00
|
|
|
<< opts << "{" << body << "}";
|
2003-04-17 15:05:17 +00:00
|
|
|
*/
|
|
|
|
}
|
2013-02-10 23:47:09 +00:00
|
|
|
// restore the in_lyx_preamble setting
|
|
|
|
in_lyx_preamble = was_in_lyx_preamble;
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2013-02-10 23:47:09 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "documentclass") {
|
2008-05-15 21:05:25 +00:00
|
|
|
vector<string>::iterator it;
|
2007-12-04 20:09:40 +00:00
|
|
|
vector<string> opts = split_options(p.getArg('[', ']'));
|
2007-12-09 17:42:05 +00:00
|
|
|
handle_opt(opts, known_fontsizes, h_paperfontsize);
|
|
|
|
delete_opt(opts, known_fontsizes);
|
|
|
|
// delete "pt" at the end
|
|
|
|
string::size_type i = h_paperfontsize.find("pt");
|
|
|
|
if (i != string::npos)
|
|
|
|
h_paperfontsize.erase(i);
|
2009-10-20 01:45:33 +00:00
|
|
|
// The documentclass options are always parsed before the options
|
|
|
|
// of the babel call so that a language cannot overwrite the babel
|
|
|
|
// options.
|
|
|
|
handle_opt(opts, known_languages, h_language);
|
2007-12-09 17:42:05 +00:00
|
|
|
delete_opt(opts, known_languages);
|
2011-01-23 21:10:20 +00:00
|
|
|
|
2017-04-13 00:31:26 +00:00
|
|
|
// math indentation
|
2017-04-05 20:22:47 +00:00
|
|
|
if ((it = find(opts.begin(), opts.end(), "fleqn"))
|
|
|
|
!= opts.end()) {
|
2017-04-13 00:31:26 +00:00
|
|
|
h_is_mathindent = "1";
|
2017-04-05 20:22:47 +00:00
|
|
|
opts.erase(it);
|
|
|
|
}
|
2017-04-25 00:28:10 +00:00
|
|
|
// formula numbering side
|
|
|
|
if ((it = find(opts.begin(), opts.end(), "leqno"))
|
|
|
|
!= opts.end()) {
|
2017-05-13 18:39:45 +00:00
|
|
|
h_math_numbering_side = "left";
|
2017-05-11 23:06:05 +00:00
|
|
|
opts.erase(it);
|
|
|
|
}
|
|
|
|
else if ((it = find(opts.begin(), opts.end(), "reqno"))
|
|
|
|
!= opts.end()) {
|
2017-05-13 18:39:45 +00:00
|
|
|
h_math_numbering_side = "right";
|
2017-04-25 00:28:10 +00:00
|
|
|
opts.erase(it);
|
|
|
|
}
|
2017-07-03 17:53:14 +00:00
|
|
|
|
2008-05-16 20:25:44 +00:00
|
|
|
// paper orientation
|
|
|
|
if ((it = find(opts.begin(), opts.end(), "landscape")) != opts.end()) {
|
|
|
|
h_paperorientation = "landscape";
|
|
|
|
opts.erase(it);
|
|
|
|
}
|
2008-05-15 21:05:25 +00:00
|
|
|
// paper sides
|
2008-05-17 15:11:41 +00:00
|
|
|
if ((it = find(opts.begin(), opts.end(), "oneside"))
|
|
|
|
!= opts.end()) {
|
|
|
|
h_papersides = "1";
|
|
|
|
opts.erase(it);
|
|
|
|
}
|
2008-05-15 23:02:53 +00:00
|
|
|
if ((it = find(opts.begin(), opts.end(), "twoside"))
|
|
|
|
!= opts.end()) {
|
2008-05-15 21:05:25 +00:00
|
|
|
h_papersides = "2";
|
|
|
|
opts.erase(it);
|
|
|
|
}
|
|
|
|
// paper columns
|
2008-05-17 15:11:41 +00:00
|
|
|
if ((it = find(opts.begin(), opts.end(), "onecolumn"))
|
|
|
|
!= opts.end()) {
|
|
|
|
h_papercolumns = "1";
|
|
|
|
opts.erase(it);
|
|
|
|
}
|
2008-05-15 23:02:53 +00:00
|
|
|
if ((it = find(opts.begin(), opts.end(), "twocolumn"))
|
|
|
|
!= opts.end()) {
|
2008-05-15 21:05:25 +00:00
|
|
|
h_papercolumns = "2";
|
|
|
|
opts.erase(it);
|
|
|
|
}
|
2008-05-16 20:25:44 +00:00
|
|
|
// paper sizes
|
2011-11-13 12:23:27 +00:00
|
|
|
// some size options are known to any document classes, other sizes
|
2008-05-16 20:25:44 +00:00
|
|
|
// are handled by the \geometry command of the geometry package
|
|
|
|
handle_opt(opts, known_class_paper_sizes, h_papersize);
|
|
|
|
delete_opt(opts, known_class_paper_sizes);
|
2008-05-15 23:02:53 +00:00
|
|
|
// the remaining options
|
2003-04-17 15:05:17 +00:00
|
|
|
h_options = join(opts, ",");
|
2011-01-23 21:10:20 +00:00
|
|
|
// FIXME This does not work for classes that have a
|
|
|
|
// different name in LyX than in LaTeX
|
2003-04-17 15:05:17 +00:00
|
|
|
h_textclass = p.getArg('{', '}');
|
2013-02-11 00:37:03 +00:00
|
|
|
p.skip_spaces();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "usepackage") {
|
2003-04-17 15:05:17 +00:00
|
|
|
string const options = p.getArg('[', ']');
|
|
|
|
string const name = p.getArg('{', '}');
|
2008-11-16 21:51:18 +00:00
|
|
|
vector<string> vecnames;
|
|
|
|
split(name, vecnames, ',');
|
|
|
|
vector<string>::const_iterator it = vecnames.begin();
|
|
|
|
vector<string>::const_iterator end = vecnames.end();
|
|
|
|
for (; it != end; ++it)
|
2011-12-14 00:20:41 +00:00
|
|
|
handle_package(p, trimSpaceAndEol(*it), options,
|
2016-01-31 11:54:59 +00:00
|
|
|
in_lyx_preamble, detectEncoding);
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "inputencoding") {
|
2008-11-16 21:51:18 +00:00
|
|
|
string const encoding = p.getArg('{','}');
|
2013-01-20 00:52:30 +00:00
|
|
|
Encoding const * const enc = encodings.fromLaTeXName(
|
|
|
|
encoding, Encoding::inputenc, true);
|
2016-01-31 11:54:59 +00:00
|
|
|
if (!enc) {
|
|
|
|
if (!detectEncoding)
|
|
|
|
cerr << "Unknown encoding " << encoding
|
|
|
|
<< ". Ignoring." << std::endl;
|
|
|
|
} else {
|
2013-01-20 00:52:30 +00:00
|
|
|
if (!enc->unsafe())
|
|
|
|
h_inputencoding = enc->name();
|
|
|
|
p.setEncoding(enc->iconvName());
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2008-10-11 16:07:14 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "newenvironment") {
|
2003-04-17 15:05:17 +00:00
|
|
|
string const name = p.getArg('{', '}');
|
2011-01-28 20:29:06 +00:00
|
|
|
string const opt1 = p.getFullOpt();
|
|
|
|
string const opt2 = p.getFullOpt();
|
2011-01-23 21:10:20 +00:00
|
|
|
string const beg = p.verbatim_item();
|
|
|
|
string const end = p.verbatim_item();
|
|
|
|
if (!in_lyx_preamble) {
|
|
|
|
h_preamble << "\\newenvironment{" << name
|
|
|
|
<< '}' << opt1 << opt2 << '{'
|
|
|
|
<< beg << "}{" << end << '}';
|
|
|
|
}
|
|
|
|
add_known_environment(name, opt1, !opt2.empty(),
|
|
|
|
from_utf8(beg), from_utf8(end));
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "newtheorem") {
|
2017-07-23 11:19:59 +00:00
|
|
|
bool star = false;
|
|
|
|
if (p.next_token().character() == '*') {
|
|
|
|
p.get_token();
|
|
|
|
star = true;
|
|
|
|
}
|
2012-10-26 20:23:16 +00:00
|
|
|
string const name = p.getArg('{', '}');
|
|
|
|
string const opt1 = p.getFullOpt();
|
|
|
|
string const opt2 = p.getFullOpt();
|
|
|
|
string const body = p.verbatim_item();
|
|
|
|
string const opt3 = p.getFullOpt();
|
2017-07-23 11:19:59 +00:00
|
|
|
string const cmd = star ? "\\newtheorem*" : "\\newtheorem";
|
2012-10-26 20:23:16 +00:00
|
|
|
|
2017-07-23 11:19:59 +00:00
|
|
|
string const complete = cmd + "{" + name + '}' +
|
2015-05-24 15:03:13 +00:00
|
|
|
opt1 + opt2 + '{' + body + '}' + opt3;
|
|
|
|
|
|
|
|
add_known_theorem(name, opt1, !opt2.empty(), from_utf8(complete));
|
|
|
|
|
2012-10-26 20:23:16 +00:00
|
|
|
if (!in_lyx_preamble)
|
2015-05-25 15:49:54 +00:00
|
|
|
h_preamble << complete;
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2012-10-26 20:23:16 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "def") {
|
2003-04-23 15:14:43 +00:00
|
|
|
string name = p.get_token().cs();
|
2012-05-13 16:41:51 +00:00
|
|
|
// In fact, name may be more than the name:
|
|
|
|
// In the test case of bug 8116
|
|
|
|
// name == "csname SF@gobble@opt \endcsname".
|
|
|
|
// Therefore, we need to use asInput() instead of cs().
|
2003-04-23 15:14:43 +00:00
|
|
|
while (p.next_token().cat() != catBegin)
|
2012-05-13 16:41:51 +00:00
|
|
|
name += p.get_token().asInput();
|
2009-08-11 00:07:08 +00:00
|
|
|
if (!in_lyx_preamble)
|
2008-09-28 20:15:08 +00:00
|
|
|
h_preamble << "\\def\\" << name << '{'
|
2008-09-29 08:30:41 +00:00
|
|
|
<< p.verbatim_item() << "}";
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "newcolumntype") {
|
2003-07-03 11:47:44 +00:00
|
|
|
string const name = p.getArg('{', '}');
|
2011-10-16 08:22:20 +00:00
|
|
|
trimSpaceAndEol(name);
|
2003-07-03 11:47:44 +00:00
|
|
|
int nargs = 0;
|
|
|
|
string opts = p.getOpt();
|
2003-11-19 10:35:50 +00:00
|
|
|
if (!opts.empty()) {
|
2003-07-03 11:47:44 +00:00
|
|
|
istringstream is(string(opts, 1));
|
|
|
|
is >> nargs;
|
|
|
|
}
|
2015-01-06 18:20:05 +00:00
|
|
|
special_columns_[name[0]] = nargs;
|
2003-07-03 11:47:44 +00:00
|
|
|
h_preamble << "\\newcolumntype{" << name << "}";
|
|
|
|
if (nargs)
|
|
|
|
h_preamble << "[" << nargs << "]";
|
2003-11-05 10:14:13 +00:00
|
|
|
h_preamble << "{" << p.verbatim_item() << "}";
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2003-07-03 11:47:44 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "setcounter") {
|
2003-04-17 15:05:17 +00:00
|
|
|
string const name = p.getArg('{', '}');
|
|
|
|
string const content = p.getArg('{', '}');
|
|
|
|
if (name == "secnumdepth")
|
|
|
|
h_secnumdepth = content;
|
|
|
|
else if (name == "tocdepth")
|
|
|
|
h_tocdepth = content;
|
|
|
|
else
|
2003-11-05 10:14:13 +00:00
|
|
|
h_preamble << "\\setcounter{" << name << "}{" << content << "}";
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "setlength") {
|
2003-04-23 15:14:43 +00:00
|
|
|
string const name = p.verbatim_item();
|
|
|
|
string const content = p.verbatim_item();
|
2008-04-20 23:22:36 +00:00
|
|
|
// the paragraphs are only not indented when \parindent is set to zero
|
|
|
|
if (name == "\\parindent" && content != "") {
|
|
|
|
if (content[0] == '0')
|
|
|
|
h_paragraph_separation = "skip";
|
2011-01-02 16:54:58 +00:00
|
|
|
else
|
2011-10-21 21:11:37 +00:00
|
|
|
h_paragraph_indentation = translate_len(content);
|
2008-04-20 23:22:36 +00:00
|
|
|
} else if (name == "\\parskip") {
|
|
|
|
if (content == "\\smallskipamount")
|
|
|
|
h_defskip = "smallskip";
|
|
|
|
else if (content == "\\medskipamount")
|
|
|
|
h_defskip = "medskip";
|
|
|
|
else if (content == "\\bigskipamount")
|
|
|
|
h_defskip = "bigskip";
|
|
|
|
else
|
2014-11-23 02:28:07 +00:00
|
|
|
h_defskip = translate_len(content);
|
2017-04-05 20:22:47 +00:00
|
|
|
} else if (name == "\\mathindent") {
|
2017-04-13 00:31:26 +00:00
|
|
|
h_mathindentation = translate_len(content);
|
2008-04-20 23:22:36 +00:00
|
|
|
} else
|
2003-11-05 10:14:13 +00:00
|
|
|
h_preamble << "\\setlength{" << name << "}{" << content << "}";
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "onehalfspacing") {
|
2008-04-20 23:22:36 +00:00
|
|
|
h_spacing = "onehalf";
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
|
|
|
}
|
2008-04-20 23:22:36 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "doublespacing") {
|
2008-04-20 23:22:36 +00:00
|
|
|
h_spacing = "double";
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
|
|
|
}
|
2008-04-20 23:22:36 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "setstretch") {
|
2008-04-20 23:22:36 +00:00
|
|
|
h_spacing = "other " + p.verbatim_item();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
|
|
|
}
|
2008-04-20 23:22:36 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "synctex") {
|
2012-06-24 14:59:21 +00:00
|
|
|
// the scheme is \synctex=value
|
|
|
|
// where value can only be "1" or "-1"
|
|
|
|
h_output_sync = "1";
|
|
|
|
// there can be any character behind the value (e.g. a linebreak or a '\'
|
|
|
|
// therefore we extract it char by char
|
|
|
|
p.get_token();
|
|
|
|
string value = p.get_token().asInput();
|
|
|
|
if (value == "-")
|
|
|
|
value += p.get_token().asInput();
|
|
|
|
h_output_sync_macro = "\\synctex=" + value;
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2012-06-24 14:59:21 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "begin") {
|
2003-04-17 15:05:17 +00:00
|
|
|
string const name = p.getArg('{', '}');
|
2003-07-26 00:15:38 +00:00
|
|
|
if (name == "document")
|
|
|
|
break;
|
2003-04-17 15:05:17 +00:00
|
|
|
h_preamble << "\\begin{" << name << "}";
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "geometry") {
|
2008-05-16 20:25:44 +00:00
|
|
|
vector<string> opts = split_options(p.getArg('{', '}'));
|
2011-11-13 12:23:27 +00:00
|
|
|
handle_geometry(opts);
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2008-05-16 20:25:44 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "definecolor") {
|
2011-01-14 20:00:55 +00:00
|
|
|
string const color = p.getArg('{', '}');
|
|
|
|
string const space = p.getArg('{', '}');
|
|
|
|
string const value = p.getArg('{', '}');
|
2011-10-24 00:29:59 +00:00
|
|
|
if (color == "document_fontcolor" && space == "rgb") {
|
|
|
|
RGBColor c(RGBColorFromLaTeX(value));
|
|
|
|
h_fontcolor = X11hexname(c);
|
|
|
|
} else if (color == "note_fontcolor" && space == "rgb") {
|
2011-01-14 20:00:55 +00:00
|
|
|
RGBColor c(RGBColorFromLaTeX(value));
|
|
|
|
h_notefontcolor = X11hexname(c);
|
2011-10-24 00:29:59 +00:00
|
|
|
} else if (color == "page_backgroundcolor" && space == "rgb") {
|
|
|
|
RGBColor c(RGBColorFromLaTeX(value));
|
|
|
|
h_backgroundcolor = X11hexname(c);
|
|
|
|
} else if (color == "shadecolor" && space == "rgb") {
|
|
|
|
RGBColor c(RGBColorFromLaTeX(value));
|
|
|
|
h_boxbgcolor = X11hexname(c);
|
2011-01-14 20:00:55 +00:00
|
|
|
} else {
|
|
|
|
h_preamble << "\\definecolor{" << color
|
|
|
|
<< "}{" << space << "}{" << value
|
|
|
|
<< '}';
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2011-01-14 20:00:55 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "bibliographystyle") {
|
2011-12-14 01:11:18 +00:00
|
|
|
h_biblio_style = p.verbatim_item();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
|
|
|
}
|
2011-12-14 01:11:18 +00:00
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "jurabibsetup") {
|
2011-01-06 20:57:16 +00:00
|
|
|
// FIXME p.getArg('{', '}') is most probably wrong (it
|
|
|
|
// does not handle nested braces).
|
|
|
|
// Use p.verbatim_item() instead.
|
2004-08-10 09:40:53 +00:00
|
|
|
vector<string> jurabibsetup =
|
|
|
|
split_options(p.getArg('{', '}'));
|
|
|
|
// add jurabibsetup to the jurabib package options
|
|
|
|
add_package("jurabib", jurabibsetup);
|
|
|
|
if (!jurabibsetup.empty()) {
|
|
|
|
h_preamble << "\\jurabibsetup{"
|
2006-04-05 23:56:29 +00:00
|
|
|
<< join(jurabibsetup, ",") << '}';
|
2004-08-10 09:40:53 +00:00
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2004-08-10 09:40:53 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "hypersetup") {
|
2011-01-06 20:57:16 +00:00
|
|
|
vector<string> hypersetup =
|
|
|
|
split_options(p.verbatim_item());
|
|
|
|
// add hypersetup to the hyperref package options
|
|
|
|
handle_hyperref(hypersetup);
|
|
|
|
if (!hypersetup.empty()) {
|
|
|
|
h_preamble << "\\hypersetup{"
|
|
|
|
<< join(hypersetup, ",") << '}';
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2011-01-06 20:57:16 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (t.cs() == "includeonly") {
|
2018-03-09 16:27:55 +00:00
|
|
|
vector<string> includeonlys = getVectorFromString(p.getArg('{', '}'));
|
|
|
|
for (auto & iofile : includeonlys) {
|
|
|
|
string filename(normalize_filename(iofile));
|
|
|
|
string const path = getMasterFilePath(true);
|
|
|
|
// We want to preserve relative/absolute filenames,
|
|
|
|
// therefore path is only used for testing
|
|
|
|
if (!makeAbsPath(filename, path).exists()) {
|
|
|
|
// The file extension is probably missing.
|
|
|
|
// Now try to find it out.
|
|
|
|
string const tex_name =
|
|
|
|
find_file(filename, path,
|
|
|
|
known_tex_extensions);
|
|
|
|
if (!tex_name.empty())
|
|
|
|
filename = tex_name;
|
|
|
|
}
|
|
|
|
string outname;
|
|
|
|
if (makeAbsPath(filename, path).exists())
|
|
|
|
fix_child_filename(filename);
|
|
|
|
else
|
|
|
|
cerr << "Warning: Could not find included file '"
|
|
|
|
<< filename << "'." << endl;
|
|
|
|
outname = changeExtension(filename, "lyx");
|
|
|
|
h_includeonlys.push_back(outname);
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2018-03-09 16:27:55 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (is_known(t.cs(), known_if_3arg_commands)) {
|
2011-01-06 21:38:26 +00:00
|
|
|
// prevent misparsing of \usepackage if it is used
|
|
|
|
// as an argument (see e.g. our own output of
|
|
|
|
// \@ifundefined above)
|
2011-01-12 22:03:15 +00:00
|
|
|
string const arg1 = p.verbatim_item();
|
|
|
|
string const arg2 = p.verbatim_item();
|
|
|
|
string const arg3 = p.verbatim_item();
|
2011-10-24 01:17:30 +00:00
|
|
|
// test case \@ifundefined{date}{}{\date{}}
|
2011-10-30 18:12:49 +00:00
|
|
|
if (t.cs() == "@ifundefined" && arg1 == "date" &&
|
|
|
|
arg2.empty() && arg3 == "\\date{}") {
|
2011-10-24 01:17:30 +00:00
|
|
|
h_suppress_date = "true";
|
2011-10-30 18:12:49 +00:00
|
|
|
// older tex2lyx versions did output
|
|
|
|
// \@ifundefined{definecolor}{\usepackage{color}}{}
|
|
|
|
} else if (t.cs() == "@ifundefined" &&
|
|
|
|
arg1 == "definecolor" &&
|
|
|
|
arg2 == "\\usepackage{color}" &&
|
|
|
|
arg3.empty()) {
|
|
|
|
if (!in_lyx_preamble)
|
|
|
|
h_preamble << package_beg_sep
|
|
|
|
<< "color"
|
|
|
|
<< package_mid_sep
|
|
|
|
<< "\\@ifundefined{definecolor}{color}{}"
|
|
|
|
<< package_end_sep;
|
2011-10-27 02:29:03 +00:00
|
|
|
// test for case
|
|
|
|
//\@ifundefined{showcaptionsetup}{}{%
|
|
|
|
// \PassOptionsToPackage{caption=false}{subfig}}
|
|
|
|
// that LyX uses for subfloats
|
2011-10-30 18:12:49 +00:00
|
|
|
} else if (t.cs() == "@ifundefined" &&
|
|
|
|
arg1 == "showcaptionsetup" && arg2.empty()
|
2011-10-27 02:29:03 +00:00
|
|
|
&& arg3 == "%\n \\PassOptionsToPackage{caption=false}{subfig}") {
|
|
|
|
; // do nothing
|
2011-10-24 01:17:30 +00:00
|
|
|
} else if (!in_lyx_preamble) {
|
2011-01-12 22:03:15 +00:00
|
|
|
h_preamble << t.asInput()
|
|
|
|
<< '{' << arg1 << '}'
|
|
|
|
<< '{' << arg2 << '}'
|
|
|
|
<< '{' << arg3 << '}';
|
|
|
|
}
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2011-01-12 22:03:15 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (is_known(t.cs(), known_if_commands)) {
|
2011-01-12 22:03:15 +00:00
|
|
|
// must not parse anything in conditional code, since
|
|
|
|
// LyX would output the parsed contents unconditionally
|
|
|
|
if (!in_lyx_preamble)
|
|
|
|
h_preamble << t.asInput();
|
|
|
|
handle_if(p, in_lyx_preamble);
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
2011-01-06 21:38:26 +00:00
|
|
|
}
|
|
|
|
|
2018-03-10 14:00:30 +00:00
|
|
|
if (!t.cs().empty() && !in_lyx_preamble) {
|
2003-11-05 10:14:13 +00:00
|
|
|
h_preamble << '\\' << t.cs();
|
2018-03-10 14:00:30 +00:00
|
|
|
continue;
|
|
|
|
}
|
2003-04-17 15:05:17 +00:00
|
|
|
}
|
2009-06-15 00:16:31 +00:00
|
|
|
|
|
|
|
// remove the whitespace
|
2003-11-05 10:14:13 +00:00
|
|
|
p.skip_spaces();
|
2003-04-17 15:05:17 +00:00
|
|
|
|
2003-10-23 11:46:33 +00:00
|
|
|
// Force textclass if the user wanted it
|
2006-08-13 09:46:28 +00:00
|
|
|
if (!forceclass.empty())
|
2003-10-23 11:46:33 +00:00
|
|
|
h_textclass = forceclass;
|
2011-01-23 21:10:20 +00:00
|
|
|
tc.setName(h_textclass);
|
2017-07-25 09:51:49 +00:00
|
|
|
if (!LayoutFileList::get().haveClass(h_textclass) || !tc.load()) {
|
2011-01-23 21:10:20 +00:00
|
|
|
cerr << "Error: Could not read layout file for textclass \"" << h_textclass << "\"." << endl;
|
|
|
|
exit(EXIT_FAILURE);
|
2003-10-23 11:46:33 +00:00
|
|
|
}
|
2003-11-19 10:35:50 +00:00
|
|
|
if (h_papersides.empty()) {
|
2003-10-23 11:46:33 +00:00
|
|
|
ostringstream ss;
|
2008-03-06 23:31:40 +00:00
|
|
|
ss << tc.sides();
|
2003-10-23 11:46:33 +00:00
|
|
|
h_papersides = ss.str();
|
|
|
|
}
|
2012-10-06 07:38:14 +00:00
|
|
|
|
|
|
|
// If the CJK package is used we cannot set the document language from
|
|
|
|
// the babel options. Instead, we guess which language is used most
|
|
|
|
// and set this one.
|
|
|
|
default_language = h_language;
|
2012-12-30 10:58:21 +00:00
|
|
|
if (is_full_document &&
|
|
|
|
(auto_packages.find("CJK") != auto_packages.end() ||
|
|
|
|
auto_packages.find("CJKutf8") != auto_packages.end())) {
|
2012-10-06 07:38:14 +00:00
|
|
|
p.pushPosition();
|
|
|
|
h_language = guessLanguage(p, default_language);
|
|
|
|
p.popPosition();
|
2013-02-17 16:53:04 +00:00
|
|
|
if (explicit_babel && h_language != default_language) {
|
|
|
|
// We set the document language to a CJK language,
|
|
|
|
// but babel is explicitly called in the user preamble
|
|
|
|
// without options. LyX will not add the default
|
|
|
|
// language to the document options if it is either
|
|
|
|
// english, or no text is set as default language.
|
|
|
|
// Therefore we need to add a language option explicitly.
|
|
|
|
// FIXME: It would be better to remove all babel calls
|
|
|
|
// from the user preamble, but this is difficult
|
|
|
|
// without re-introducing bug 7861.
|
|
|
|
if (h_options.empty())
|
|
|
|
h_options = lyx2babel(default_language);
|
|
|
|
else
|
|
|
|
h_options += ',' + lyx2babel(default_language);
|
|
|
|
}
|
2012-10-06 07:38:14 +00:00
|
|
|
}
|
2018-03-11 17:04:23 +00:00
|
|
|
|
|
|
|
// Finally, set the quote style.
|
|
|
|
// LyX knows the following quotes styles:
|
|
|
|
// british, cjk, cjkangle, danish, english, french, german,
|
|
|
|
// polish, russian, swedish and swiss
|
|
|
|
// conversion list taken from
|
|
|
|
// https://en.wikipedia.org/wiki/Quotation_mark,_non-English_usage
|
|
|
|
// (quotes for kazakh are unknown)
|
|
|
|
// british
|
|
|
|
if (is_known(h_language, known_british_quotes_languages))
|
|
|
|
h_quotes_style = "british";
|
|
|
|
// cjk
|
|
|
|
else if (is_known(h_language, known_cjk_quotes_languages))
|
|
|
|
h_quotes_style = "cjk";
|
|
|
|
// cjkangle
|
|
|
|
else if (is_known(h_language, known_cjkangle_quotes_languages))
|
|
|
|
h_quotes_style = "cjkangle";
|
|
|
|
// danish
|
|
|
|
else if (is_known(h_language, known_danish_quotes_languages))
|
|
|
|
h_quotes_style = "danish";
|
|
|
|
// french
|
|
|
|
else if (is_known(h_language, known_french_quotes_languages))
|
|
|
|
h_quotes_style = "french";
|
|
|
|
// german
|
|
|
|
else if (is_known(h_language, known_german_quotes_languages))
|
|
|
|
h_quotes_style = "german";
|
|
|
|
// polish
|
|
|
|
else if (is_known(h_language, known_polish_quotes_languages))
|
|
|
|
h_quotes_style = "polish";
|
|
|
|
// russian
|
|
|
|
else if (is_known(h_language, known_russian_quotes_languages))
|
|
|
|
h_quotes_style = "russian";
|
|
|
|
// swedish
|
|
|
|
else if (is_known(h_language, known_swedish_quotes_languages))
|
|
|
|
h_quotes_style = "swedish";
|
|
|
|
// swiss
|
|
|
|
else if (is_known(h_language, known_swiss_quotes_languages))
|
|
|
|
h_quotes_style = "swiss";
|
|
|
|
// english
|
|
|
|
else if (is_known(h_language, known_english_quotes_languages))
|
|
|
|
h_quotes_style = "english";
|
2003-07-26 00:15:38 +00:00
|
|
|
}
|
2003-04-17 15:05:17 +00:00
|
|
|
|
2011-01-12 21:04:39 +00:00
|
|
|
|
2016-01-31 11:54:59 +00:00
|
|
|
string Preamble::parseEncoding(Parser & p, string const & forceclass)
|
|
|
|
{
|
|
|
|
TeX2LyXDocClass dummy;
|
|
|
|
parse(p, forceclass, true, dummy);
|
2019-04-16 18:17:32 +00:00
|
|
|
if (h_inputencoding != "auto-legacy" && h_inputencoding != "auto-legacy-plain")
|
2016-01-31 11:54:59 +00:00
|
|
|
return h_inputencoding;
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-01-12 21:04:39 +00:00
|
|
|
string babel2lyx(string const & language)
|
|
|
|
{
|
|
|
|
char const * const * where = is_known(language, known_languages);
|
|
|
|
if (where)
|
|
|
|
return known_coded_languages[where - known_languages];
|
|
|
|
return language;
|
|
|
|
}
|
|
|
|
|
2011-10-26 01:18:27 +00:00
|
|
|
|
2013-02-17 16:53:04 +00:00
|
|
|
string lyx2babel(string const & language)
|
|
|
|
{
|
|
|
|
char const * const * where = is_known(language, known_coded_languages);
|
|
|
|
if (where)
|
|
|
|
return known_languages[where - known_coded_languages];
|
|
|
|
return language;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-06-30 23:47:39 +00:00
|
|
|
string Preamble::polyglossia2lyx(string const & language)
|
2012-06-23 02:28:52 +00:00
|
|
|
{
|
|
|
|
char const * const * where = is_known(language, polyglossia_languages);
|
|
|
|
if (where)
|
|
|
|
return coded_polyglossia_languages[where - polyglossia_languages];
|
|
|
|
return language;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-30 18:12:49 +00:00
|
|
|
string rgbcolor2code(string const & name)
|
2011-10-26 01:18:27 +00:00
|
|
|
{
|
|
|
|
char const * const * where = is_known(name, known_basic_colors);
|
2011-10-30 18:12:49 +00:00
|
|
|
if (where) {
|
|
|
|
// "red", "green" etc
|
2011-10-26 01:18:27 +00:00
|
|
|
return known_basic_color_codes[where - known_basic_colors];
|
2011-10-30 18:12:49 +00:00
|
|
|
}
|
|
|
|
// "255,0,0", "0,255,0" etc
|
|
|
|
RGBColor c(RGBColorFromLaTeX(name));
|
|
|
|
return X11hexname(c);
|
2011-10-26 01:18:27 +00:00
|
|
|
}
|
|
|
|
|
2003-04-17 15:05:17 +00:00
|
|
|
// }])
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
} // namespace lyx
|