X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Flyx_2_1.py;h=91666ba4e2746048586fa8c82c80dc21b5d3d248;hb=a84a98b54561044b5902dfce39bc31082877fec1;hp=064b938ad1bb5e862a4a6fbe57c663603c419a8e;hpb=5a7672adec7da591fe5c43ebcf8787a1fa11aa2c;p=lyx.git diff --git a/lib/lyx2lyx/lyx_2_1.py b/lib/lyx2lyx/lyx_2_1.py index 064b938ad1..91666ba4e2 100644 --- a/lib/lyx2lyx/lyx_2_1.py +++ b/lib/lyx2lyx/lyx_2_1.py @@ -25,18 +25,18 @@ import sys, os # Uncomment only what you need to import, please. -from parser_tools import find_token, find_end_of_inset, get_value, \ - del_token +from parser_tools import del_token, find_token, find_token_backwards, find_end_of, \ + find_end_of_inset, find_end_of_layout, find_re, get_option_value, get_containing_layout, \ + get_value, get_quoted_value, set_option_value #from parser_tools import find_token, find_end_of, find_tokens, \ #find_token_exact, find_end_of_inset, find_end_of_layout, \ - #find_token_backwards, is_in_inset, get_value, get_quoted_value, \ - #del_token, check_token, get_option_value + #is_in_inset, del_token, check_token -from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert +from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert, get_ert -#from lyx2lyx_tools import add_to_preamble, insert_to_preamble, \ -# put_cmd_in_ert, lyx2latex, latex_length, revert_flex_inset, \ +#from lyx2lyx_tools import insert_to_preamble, \ +# lyx2latex, latex_length, revert_flex_inset, \ # revert_font_attrs, hex2ratio, str2bool #################################################################### @@ -73,8 +73,19 @@ def revert_visible_space(document): def convert_undertilde(document): " Load undertilde automatically " i = find_token(document.header, "\\use_mathdots" , 0) - if i != -1: - document.header.insert(i + 1, "\\use_undertilde 1") + if i == -1: + i = find_token(document.header, "\\use_mhchem" , 0) + if i == -1: + i = find_token(document.header, "\\use_esint" , 0) + if i == -1: + document.warning("Malformed LyX document: Can't find \\use_mathdots.") + return; + j = find_token(document.preamble, "\\usepackage{undertilde}", 0) + if j == -1: + document.header.insert(i + 1, "\\use_undertilde 0") + else: + document.header.insert(i + 1, "\\use_undertilde 2") + del document.preamble[j] def revert_undertilde(document): @@ -99,7 +110,7 @@ def revert_undertilde(document): # force load case add_to_preamble(document, ["\\usepackage{undertilde}"]) return - + # so we are in the auto case. we want to load undertilde if \utilde is used. i = 0 while True: @@ -198,7 +209,1622 @@ def revert_justification(document): if not del_token(document.header, '\\justification', 0): document.warning("Malformed LyX document: Missing \\justification.") + +def revert_australian(document): + "Set English language variants Australian and Newzealand to English" + + if document.language == "australian" or document.language == "newzealand": + document.language = "english" + i = find_token(document.header, "\\language", 0) + if i != -1: + document.header[i] = "\\language english" + j = 0 + while True: + j = find_token(document.body, "\\lang australian", j) + if j == -1: + j = find_token(document.body, "\\lang newzealand", 0) + if j == -1: + return + else: + document.body[j] = document.body[j].replace("\\lang newzealand", "\\lang english") + else: + document.body[j] = document.body[j].replace("\\lang australian", "\\lang english") + j += 1 + + +def convert_biblio_style(document): + "Add a sensible default for \\biblio_style based on the citation engine." + i = find_token(document.header, "\\cite_engine", 0) + if i != -1: + engine = get_value(document.header, "\\cite_engine", i).split("_")[0] + style = {"basic": "plain", "natbib": "plainnat", "jurabib": "jurabib"} + document.header.insert(i + 1, "\\biblio_style " + style[engine]) + + +def revert_biblio_style(document): + "BibTeX insets with default option use the style defined by \\biblio_style." + i = find_token(document.header, "\\biblio_style" , 0) + if i == -1: + document.warning("No \\biblio_style line. Nothing to do.") + return + + default_style = get_value(document.header, "\\biblio_style", i) + del document.header[i] + + # We are looking for bibtex insets having the default option + i = 0 + while True: + i = find_token(document.body, "\\begin_inset CommandInset bibtex", i) + if i == -1: + return + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Can't find end of bibtex inset at line " + str(i)) + i += 1 + return + k = find_token(document.body, "options", i, j) + if k != -1: + options = get_quoted_value(document.body, "options", k) + if "default" in options.split(","): + document.body[k] = 'options "%s"' \ + % options.replace("default", default_style) + i = j + + +def handle_longtable_captions(document, forward): + begin_table = 0 + while True: + begin_table = find_token(document.body, '') + if end_table == -1: + document.warning("Malformed LyX document: Could not find end of table.") + begin_table += 1 + continue + fline = find_token(document.body, "') + if end_row == -1: + document.warning("Can't find end of row " + str(row + 1)) + break + if forward: + if (get_option_value(document.body[begin_row], 'caption') == 'true' and + get_option_value(document.body[begin_row], 'endfirsthead') != 'true' and + get_option_value(document.body[begin_row], 'endhead') != 'true' and + get_option_value(document.body[begin_row], 'endfoot') != 'true' and + get_option_value(document.body[begin_row], 'endlastfoot') != 'true'): + document.body[begin_row] = set_option_value(document.body[begin_row], 'caption', 'true", endfirsthead="true') + elif get_option_value(document.body[begin_row], 'caption') == 'true': + if get_option_value(document.body[begin_row], 'endfirsthead') == 'true': + document.body[begin_row] = set_option_value(document.body[begin_row], 'endfirsthead', 'false') + if get_option_value(document.body[begin_row], 'endhead') == 'true': + document.body[begin_row] = set_option_value(document.body[begin_row], 'endhead', 'false') + if get_option_value(document.body[begin_row], 'endfoot') == 'true': + document.body[begin_row] = set_option_value(document.body[begin_row], 'endfoot', 'false') + if get_option_value(document.body[begin_row], 'endlastfoot') == 'true': + document.body[begin_row] = set_option_value(document.body[begin_row], 'endlastfoot', 'false') + begin_row = end_row + # since there could be a tabular inside this one, we + # cannot jump to end. + begin_table += 1 + + +def convert_longtable_captions(document): + "Add a firsthead flag to caption rows" + handle_longtable_captions(document, True) + + +def revert_longtable_captions(document): + "remove head/foot flag from caption rows" + handle_longtable_captions(document, False) + + +def convert_use_packages(document): + "use_xxx yyy => use_package xxx yyy" + packages = ["amsmath", "esint", "mathdots", "mhchem", "undertilde"] + for p in packages: + i = find_token(document.header, "\\use_%s" % p, 0) + if i != -1: + value = get_value(document.header, "\\use_%s" % p, i) + document.header[i] = "\\use_package %s %s" % (p, value) + + +def revert_use_packages(document): + "use_package xxx yyy => use_xxx yyy" + packages = ["amsmath", "esint", "mathdots", "mhchem", "undertilde"] + # the order is arbitrary for the use_package version, and not all packages need to be given. + # Ensure a complete list and correct order (important for older LyX versions and especially lyx2lyx) + j = 0 + for p in packages: + regexp = re.compile(r'(\\use_package\s+%s)' % p) + i = find_re(document.header, regexp, j) + if i != -1: + value = get_value(document.header, "\\use_package %s" % p, i).split()[1] + del document.header[i] + j = i + document.header.insert(j, "\\use_%s %s" % (p, value)) + j = j + 1 + + +def convert_use_mathtools(document): + "insert use_package mathtools" + i = find_token(document.header, "\\use_package", 0) + if i == -1: + document.warning("Malformed LyX document: Can't find \\use_package.") + return; + j = find_token(document.preamble, "\\usepackage{mathtools}", 0) + if j == -1: + document.header.insert(i + 1, "\\use_package mathtools 0") + else: + document.header.insert(i + 1, "\\use_package mathtools 2") + del document.preamble[j] + + +def revert_use_mathtools(document): + "remove use_package mathtools" + regexp = re.compile(r'(\\use_package\s+mathtools)') + i = find_re(document.header, regexp, 0) + value = "1" # default is auto + if i != -1: + value = get_value(document.header, "\\use_package" , i).split()[1] + del document.header[i] + if value == "2": # on + add_to_preamble(document, ["\\usepackage{mathtools}"]) + elif value == "1": # auto + commands = ["mathclap", "mathllap", "mathrlap", \ + "lgathered", "rgathered", "vcentcolon", "dblcolon", \ + "coloneqq", "Coloneqq", "coloneq", "Coloneq", "eqqcolon", \ + "Eqqcolon", "eqcolon", "Eqcolon", "colonapprox", \ + "Colonapprox", "colonsim", "Colonsim"] + i = 0 + while True: + i = find_token(document.body, '\\begin_inset Formula', i) + if i == -1: + return + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i)) + i += 1 + continue + code = "\n".join(document.body[i:j]) + for c in commands: + if code.find("\\%s" % c) != -1: + add_to_preamble(document, ["\\usepackage{mathtools}"]) + return + i = j + + +def convert_cite_engine_type(document): + "Determine the \\cite_engine_type from the citation engine." + i = find_token(document.header, "\\cite_engine", 0) + if i == -1: + return + engine = get_value(document.header, "\\cite_engine", i) + if "_" in engine: + engine, type = engine.split("_") + else: + type = {"basic": "numerical", "jurabib": "authoryear"}[engine] + document.header[i] = "\\cite_engine " + engine + document.header.insert(i + 1, "\\cite_engine_type " + type) + + +def revert_cite_engine_type(document): + "Natbib had the type appended with an underscore." + engine_type = "numerical" + i = find_token(document.header, "\\cite_engine_type" , 0) + if i == -1: + document.warning("No \\cite_engine_type line. Assuming numerical.") + else: + engine_type = get_value(document.header, "\\cite_engine_type", i) + del document.header[i] + + # We are looking for the natbib citation engine + i = find_token(document.header, "\\cite_engine natbib", 0) + if i == -1: + return + document.header[i] = "\\cite_engine natbib_" + engine_type + + +def revert_cancel(document): + "add cancel to the preamble if necessary" + commands = ["cancelto", "cancel", "bcancel", "xcancel"] + i = 0 + while True: + i = find_token(document.body, '\\begin_inset Formula', i) + if i == -1: + return + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i)) + i += 1 + continue + code = "\n".join(document.body[i:j]) + for c in commands: + if code.find("\\%s" % c) != -1: + add_to_preamble(document, ["\\usepackage{cancel}"]) + return + i = j + + +def revert_verbatim(document): + " Revert verbatim einvironments completely to TeX-code. " + i = 0 + consecutive = False + subst_end = ['\end_layout', '', '\\begin_layout Plain Layout', + '\end_layout', '', + '\\begin_layout Plain Layout', '', '', + '\\backslash', '', + 'end{verbatim}', + '\\end_layout', '', '\\end_inset', + '', '', '\\end_layout'] + subst_begin = ['\\begin_layout Standard', '\\noindent', + '\\begin_inset ERT', 'status collapsed', '', + '\\begin_layout Plain Layout', '', '', '\\backslash', + 'begin{verbatim}', + '\\end_layout', '', '\\begin_layout Plain Layout', ''] + while 1: + i = find_token(document.body, "\\begin_layout Verbatim", i) + if i == -1: + return + j = find_end_of_layout(document.body, i) + if j == -1: + document.warning("Malformed lyx document: Can't find end of Verbatim layout") + i += 1 + continue + # delete all line breaks insets (there are no other insets) + l = i + while 1: + n = find_token(document.body, "\\begin_inset Newline newline", l) + if n == -1: + n = find_token(document.body, "\\begin_inset Newline linebreak", l) + if n == -1: + break + m = find_end_of_inset(document.body, n) + del(document.body[m:m+1]) + document.body[n:n+1] = ['\end_layout', '', '\\begin_layout Plain Layout'] + l += 1 + j += 1 + # consecutive verbatim environments need to be connected + k = find_token(document.body, "\\begin_layout Verbatim", j) + if k == j + 2 and consecutive == False: + consecutive = True + document.body[j:j+1] = ['\end_layout', '', '\\begin_layout Plain Layout'] + document.body[i:i+1] = subst_begin + continue + if k == j + 2 and consecutive == True: + document.body[j:j+1] = ['\end_layout', '', '\\begin_layout Plain Layout'] + del(document.body[i:i+1]) + continue + if k != j + 2 and consecutive == True: + document.body[j:j+1] = subst_end + # the next paragraph must not be indented + document.body[j+19:j+19] = ['\\noindent'] + del(document.body[i:i+1]) + consecutive = False + continue + else: + document.body[j:j+1] = subst_end + # the next paragraph must not be indented + document.body[j+19:j+19] = ['\\noindent'] + document.body[i:i+1] = subst_begin + + +def revert_tipa(document): + " Revert native TIPA insets to mathed or ERT. " + i = 0 + while 1: + i = find_token(document.body, "\\begin_inset IPA", i) + if i == -1: + return + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed lyx document: Can't find end of IPA inset") + i += 1 + continue + Multipar = False + n = find_token(document.body, "\\begin_layout", i, j) + if n == -1: + document.warning("Malformed lyx document: IPA inset has no embedded layout") + i += 1 + continue + m = find_end_of_layout(document.body, n) + if m == -1: + document.warning("Malformed lyx document: Can't find end of embedded layout") + i += 1 + continue + content = document.body[n+1:m] + p = find_token(document.body, "\\begin_layout", m, j) + if p != -1 or len(content) > 1: + Multipar = True + content = document.body[i+1:j] + if Multipar: + # IPA insets with multiple pars need to be wrapped by \begin{IPA}...\end{IPA} + document.body[i:j+1] = ['\\end_layout', '', '\\begin_layout Standard'] + put_cmd_in_ert("\\begin{IPA}") + ['\\end_layout'] + content + ['\\begin_layout Standard'] + put_cmd_in_ert("\\end{IPA}") + add_to_preamble(document, ["\\usepackage{tipa,tipx}"]) + else: + # single-par IPA insets can be reverted to mathed + document.body[i:j+1] = ["\\begin_inset Formula $\\text{\\textipa{" + content[0] + "}}$", "\\end_inset"] + i = j + + +def revert_cell_rotation(document): + "Revert cell rotations to TeX-code" + + load_rotating = False + i = 0 + try: + while True: + # first, let's find out if we need to do anything + i = find_token(document.body, '', j) + k = document.body[i].find('"', j + 8) + value = document.body[i][j + 8 : k] + if value == "0": + rgx = re.compile(r' rotate="[^"]+?"') + # remove rotate option + document.body[i] = rgx.sub('', document.body[i]) + elif value == "90": + rgx = re.compile(r'rotate="[^"]+?"') + document.body[i] = rgx.sub('rotate="true"', document.body[i]) + else: + rgx = re.compile(r' rotate="[^"]+?"') + load_rotating = True + # remove rotate option + document.body[i] = rgx.sub('', document.body[i]) + # write ERT + document.body[end_table + 3 : end_table + 3] = \ + put_cmd_in_ert("\\end{turn}") + document.body[i - 2 : i - 2] = \ + put_cmd_in_ert("\\begin{turn}{" + value + "}") + + i += 1 + + finally: + if load_rotating: + add_to_preamble(document, ["\\@ifundefined{turnbox}{\usepackage{rotating}}{}"]) + + +def convert_table_rotation(document): + 'Convert table rotation statements from "true" to "90"' + + i = 0 + while True: + # first, let's find out if we need to do anything + i = find_token(document.body, ' 0: + # We know for now that this must be the initials module with the Initial layout + # If we get more such modules, we need some automating. + if parent[0] == "Initial": + # Layout has 1 opt and 1 req arg. + # Count the actual arguments + actualargs = 0 + for p in range(parbeg, parend): + if document.body[p] == "\\begin_inset Argument": + actualargs += 1 + if actualargs == 1: + allowed_opts = 0 + first_req = 2 + # Collect all arguments in this paragraph + argnr = 0 + for p in range(parbeg, parend): + if document.body[p] == "\\begin_inset Argument": + argnr += 1 + if allowed_opts != -1: + # We have less arguments than opt + required. + # required must take precedence. + if argnr > allowed_opts and argnr < first_req: + argnr = first_req + document.body[p] = "\\begin_inset Argument %d" % argnr + i = i + 1 + + +def revert_latexargs(document): + " Revert InsetArgument to old syntax " + + i = 0 + rx = re.compile(r'^\\begin_inset Argument (\d+)$') + args = dict() + while True: + # Search for Argument insets + i = find_token(document.body, "\\begin_inset Argument", i) + if i == -1: + return + m = rx.match(document.body[i]) + if not m: + # No ID: inset already reverted + i = i + 1 + continue + # Find containing paragraph layout + parent = get_containing_layout(document.body, i) + if parent == False: + document.warning("Malformed lyx document: Can't find parent paragraph layout") + i = i + 1 + continue + parbeg = parent[1] + parend = parent[2] + # Collect all arguments in this paragraph + realparend = parend + for p in range(parbeg, parend): + m = rx.match(document.body[p]) + if m: + val = int(m.group(1)) + j = find_end_of_inset(document.body, p) + # Revert to old syntax + document.body[p] = "\\begin_inset Argument" + if j == -1: + document.warning("Malformed lyx document: Can't find end of Argument inset") + continue + if val > 0: + args[val] = document.body[p : j + 1] + # Adjust range end + realparend = realparend - len(document.body[p : j + 1]) + # Remove arg inset at this position + del document.body[p : j + 1] + if p >= realparend: + break + # Now sort the arg insets + subst = [""] + for f in sorted(args): + subst += args[f] + del args[f] + # Insert the sorted arg insets at paragraph begin + document.body[parbeg + 1:parbeg + 1] = subst + + i = parbeg + 1 + len(subst) + + +def revert_Argument_to_TeX_brace(document, line, n, nmax, environment): + ''' + Reverts an InsetArgument to TeX-code + usage: + revert_Argument_to_TeX_brace(document, LineOfBeginLayout, StartArgument, EndArgument, isEnvironment) + LineOfBeginLayout is the line of the \begin_layout statement + StartArgument is the number of the first argument that needs to be converted + EndArgument is the number of the last argument that needs to be converted or the last defined one + isEnvironment must be true, if the layout id for a LaTeX environment + ''' + lineArg = 0 + while lineArg != -1 and n < nmax + 1: + lineArg = find_token(document.body, "\\begin_inset Argument " + str(n), line) + if lineArg != -1: + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", lineArg) + # we have to assure that no other inset is in the Argument + beginInset = find_token(document.body, "\\begin_inset", beginPlain) + endInset = find_token(document.body, "\\end_inset", beginPlain) + k = beginPlain + 1 + l = k + while beginInset < endInset and beginInset != -1: + beginInset = find_token(document.body, "\\begin_inset", k) + endInset = find_token(document.body, "\\end_inset", l) + k = beginInset + 1 + l = endInset + 1 + if environment == False: + document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}{") + del(document.body[lineArg : beginPlain + 1]) + else: + document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}") + document.body[lineArg : beginPlain + 1] = put_cmd_in_ert("{") + n = n + 1 + + +def revert_IEEEtran(document): + ''' + Reverts InsetArgument of + Page headings + Biography + Biography without photo + to TeX-code + ''' + if document.textclass == "IEEEtran": + i = 0 + j = 0 + k = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Page headings", i) + if i != -1: + revert_Argument_to_TeX_brace(document, i, 1, 1, False) + i = i + 1 + if j != -1: + j = find_token(document.body, "\\begin_layout Biography without photo", j) + if j != -1: + revert_Argument_to_TeX_brace(document, j, 1, 1, True) + j = j + 1 + if k != -1: + k = find_token(document.body, "\\begin_layout Biography", k) + kA = find_token(document.body, "\\begin_layout Biography without photo", k) + if k == kA and k != -1: + k = k + 1 + continue + if k != -1: + # start with the second argument, therefore 2 + revert_Argument_to_TeX_brace(document, k, 2, 2, True) + k = k + 1 + if i == -1 and j == -1 and k == -1: + return + + +def convert_TeX_brace_to_Argument(document, line, n, nmax, inset, environment): + ''' + Converts TeX code for mandatory arguments to an InsetArgument + The conversion of TeX code for optional arguments must be done with another routine + !!! Be careful if the braces are different in your case as expected here: + - "}{" separates mandatory arguments of commands + - "}" + "{" separates mandatory arguments of commands + - "}" + " " + "{" separates mandatory arguments of commands + - { and } surround a mandatory argument of an environment + usage: + convert_TeX_brace_to_Argument(document, LineOfBeginLayout/Inset, StartArgument, EndArgument, isInset, isEnvironment) + LineOfBeginLayout/Inset is the line of the \begin_layout or \begin_inset statement + StartArgument is the number of the first ERT that needs to be converted + EndArgument is the number of the last ERT that needs to be converted + isInset must be true, if braces inside an InsetLayout needs to be converted + isEnvironment must be true, if the layout is for a LaTeX environment + Todo: this routine can currently handle only one mandatory argument of environments + ''' + lineERT = line + endn = line + loop = 1 + while lineERT != -1 and n < nmax + 1: + lineERT = find_token(document.body, "\\begin_inset ERT", lineERT) + if environment == False and lineERT != -1: + bracePair = find_token(document.body, "}{", lineERT) + # assure that the "}{" is in this ERT + if bracePair == lineERT + 5: + end = find_token(document.body, "\\end_inset", bracePair) + document.body[lineERT : end + 1] = ["\\end_layout", "", "\\end_inset"] + if loop == 1: + # in the case that n > 1 we have optional arguments before + # therefore detect them if any + if n > 1: + # first check if there is an argument + lineArg = find_token(document.body, "\\begin_inset Argument", line) + if lineArg < lineERT and lineArg != -1: + # we have an argument, so now search backwards for its end + # we must now assure that we don't find other insets like e.g. a newline + endInsetArg = lineERT + endLayoutArg = endInsetArg + while endInsetArg != endLayoutArg + 2 and endInsetArg != -1: + endInsetArg = endInsetArg - 1 + endLayoutArg = endInsetArg + endInsetArg = find_token_backwards(document.body, "\\end_inset", endInsetArg) + endLayoutArg = find_token_backwards(document.body, "\\end_layout", endLayoutArg) + line = endInsetArg + 1 + if inset == False: + document.body[line + 1 : line + 1] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + else: + document.body[line + 4 : line + 4] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + else: + document.body[endn : endn] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + n = n + 1 + endn = end + loop = loop + 1 + # now check the case that we have "}" + "{" in two ERTs + else: + endBrace = find_token(document.body, "}", lineERT) + if endBrace == lineERT + 5: + beginBrace = find_token(document.body, "{", endBrace) + # assure that the ERTs are consecutive (11 or 12 depending if there is a space between the ERTs or not) + if beginBrace == endBrace + 11 or beginBrace == endBrace + 12: + end = find_token(document.body, "\\end_inset", beginBrace) + document.body[lineERT : end + 1] = ["\\end_layout", "", "\\end_inset"] + if loop == 1: + # in the case that n > 1 we have optional arguments before + # therefore detect them if any + if n > 1: + # first check if there is an argument + lineArg = find_token(document.body, "\\begin_inset Argument", line) + if lineArg < lineERT and lineArg != -1: + # we have an argument, so now search backwards for its end + # we must now assure that we don't find other insets like e.g. a newline + endInsetArg = lineERT + endLayoutArg = endInsetArg + while endInsetArg != endLayoutArg + 2 and endInsetArg != -1: + endInsetArg = endInsetArg - 1 + endLayoutArg = endInsetArg + endInsetArg = find_token_backwards(document.body, "\\end_inset", endInsetArg) + endLayoutArg = find_token_backwards(document.body, "\\end_layout", endLayoutArg) + line = endInsetArg + 1 + if inset == False: + document.body[line + 1 : line + 1] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + else: + document.body[line + 4 : line + 4] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + else: + document.body[endn : endn] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + n = n + 1 + loop = loop + 1 + # set the line where the next argument will be inserted + if beginBrace == endBrace + 11: + endn = end - 11 + else: + endn = end - 12 + else: + lineERT = lineERT + 1 + if environment == True and lineERT != -1: + opening = find_token(document.body, "{", lineERT) + if opening == lineERT + 5: # assure that the "{" is in this ERT + end = find_token(document.body, "\\end_inset", opening) + document.body[lineERT : end + 1] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + n = n + 1 + lineERT2 = find_token(document.body, "\\begin_inset ERT", lineERT) + closing = find_token(document.body, "}", lineERT2) + if closing == lineERT2 + 5: # assure that the "}" is in this ERT + end2 = find_token(document.body, "\\end_inset", closing) + document.body[lineERT2 : end2 + 1] = ["\\end_layout", "", "\\end_inset"] + else: + lineERT = lineERT + 1 + + +def convert_IEEEtran(document): + ''' + Converts ERT of + Page headings + Biography + Biography without photo + to InsetArgument + ''' + if document.textclass == "IEEEtran": + i = 0 + j = 0 + k = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Page headings", i) + if i != -1: + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) + i = i + 1 + if j != -1: + j = find_token(document.body, "\\begin_layout Biography without photo", j) + if j != -1: + convert_TeX_brace_to_Argument(document, j, 1, 1, False, True) + j = j + 1 + if k != -1: + # assure that we don't handle Biography Biography without photo + k = find_token(document.body, "\\begin_layout Biography", k) + kA = find_token(document.body, "\\begin_layout Biography without photo", k - 1) + if k == kA and k != -1: + k = k + 1 + continue + if k != -1: + # the argument we want to convert is the second one + convert_TeX_brace_to_Argument(document, k, 2, 2, False, True) + k = k + 1 + if i == -1 and j == -1 and k == -1: + return + + +def revert_AASTeX(document): + " Reverts InsetArgument of Altaffilation to TeX-code " + if document.textclass == "aastex": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Altaffilation", i) + if i != -1: + revert_Argument_to_TeX_brace(document, i, 1, 1, False) + i = i + 1 + if i == -1: + return + + +def convert_AASTeX(document): + " Converts ERT of Altaffilation to InsetArgument " + if document.textclass == "aastex": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Altaffilation", i) + if i != -1: + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) + i = i + 1 + if i == -1: + return + + +def revert_AGUTeX(document): + " Reverts InsetArgument of Author affiliation to TeX-code " + if document.textclass == "agutex": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Author affiliation", i) + if i != -1: + revert_Argument_to_TeX_brace(document, i, 1, 1, False) + i = i + 1 + if i == -1: + return + + +def convert_AGUTeX(document): + " Converts ERT of Author affiliation to InsetArgument " + if document.textclass == "agutex": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Author affiliation", i) + if i != -1: + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) + i = i + 1 + if i == -1: + return + + +def revert_IJMP(document): + " Reverts InsetArgument of MarkBoth to TeX-code " + if document.textclass == "ijmpc" or document.textclass == "ijmpd": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout MarkBoth", i) + if i != -1: + revert_Argument_to_TeX_brace(document, i, 1, 1, False) + i = i + 1 + if i == -1: + return + + +def convert_IJMP(document): + " Converts ERT of MarkBoth to InsetArgument " + if document.textclass == "ijmpc" or document.textclass == "ijmpd": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout MarkBoth", i) + if i != -1: + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) + i = i + 1 + if i == -1: + return + + +def revert_SIGPLAN(document): + " Reverts InsetArgument of MarkBoth to TeX-code " + if document.textclass == "sigplanconf": + i = 0 + j = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Conference", i) + if i != -1: + revert_Argument_to_TeX_brace(document, i, 1, 1, False) + i = i + 1 + if j != -1: + j = find_token(document.body, "\\begin_layout Author", j) + if j != -1: + revert_Argument_to_TeX_brace(document, j, 1, 2, False) + j = j + 1 + if i == -1 and j == -1: + return + + +def convert_SIGPLAN(document): + " Converts ERT of MarkBoth to InsetArgument " + if document.textclass == "sigplanconf": + i = 0 + j = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Conference", i) + if i != -1: + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) + i = i + 1 + if j != -1: + j = find_token(document.body, "\\begin_layout Author", j) + if j != -1: + convert_TeX_brace_to_Argument(document, j, 1, 2, False, False) + j = j + 1 + if i == -1 and j == -1: + return + + +def revert_SIGGRAPH(document): + " Reverts InsetArgument of Flex CRcat to TeX-code " + if document.textclass == "acmsiggraph": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_inset Flex CRcat", i) + if i != -1: + revert_Argument_to_TeX_brace(document, i, 1, 3, False) + i = i + 1 + if i == -1: + return + + +def convert_SIGGRAPH(document): + " Converts ERT of Flex CRcat to InsetArgument " + if document.textclass == "acmsiggraph": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_inset Flex CRcat", i) + if i != -1: + convert_TeX_brace_to_Argument(document, i, 1, 3, True, False) + i = i + 1 + if i == -1: + return + + +def revert_EuropeCV(document): + " Reverts InsetArgument of Flex CRcat to TeX-code " + if document.textclass == "europecv": + i = 0 + j = 0 + k = 0 + m = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Item", i) + if i != -1: + revert_Argument_to_TeX_brace(document, i, 2, 2, False) + i = i + 1 + if j != -1: + j = find_token(document.body, "\\begin_layout BulletedItem", j) + if j != -1: + revert_Argument_to_TeX_brace(document, j, 2, 2, False) + j = j + 1 + if k != -1: + k = find_token(document.body, "\\begin_layout Language", k) + if k != -1: + revert_Argument_to_TeX_brace(document, k, 2, 6, False) + k = k + 1 + if m != -1: + m = find_token(document.body, "\\begin_layout LastLanguage", m) + if m != -1: + revert_Argument_to_TeX_brace(document, m, 2, 6, False) + m = m + 1 + if i == -1 and j == -1 and k == -1 and m == -1: + return + + +def convert_EuropeCV(document): + " Converts ERT of Flex CRcat to InsetArgument " + if document.textclass == "europecv": + i = 0 + j = 0 + k = 0 + m = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Item", i) + if i != -1: + convert_TeX_brace_to_Argument(document, i, 2, 2, False, False) + i = i + 1 + if j != -1: + j = find_token(document.body, "\\begin_layout BulletedItem", j) + if j != -1: + convert_TeX_brace_to_Argument(document, j, 2, 2, False, False) + j = j + 1 + if k != -1: + k = find_token(document.body, "\\begin_layout Language", k) + if k != -1: + convert_TeX_brace_to_Argument(document, k, 2, 6, False, False) + k = k + 1 + if m != -1: + m = find_token(document.body, "\\begin_layout LastLanguage", m) + if m != -1: + convert_TeX_brace_to_Argument(document, m, 2, 6, False, False) + m = m + 1 + if i == -1 and j == -1 and k == -1 and m == -1: + return + + +def revert_literate(document): + " Revert Literate document to old format " + if del_token(document.header, "noweb", 0): + document.textclass = "literate-" + document.textclass + i = 0 + while True: + i = find_token(document.body, "\\begin_layout Chunk", i) + if i == -1: + break + document.body[i] = "\\begin_layout Scrap" + i = i + 1 + + +def convert_literate(document): + " Convert Literate document to new format" + i = find_token(document.header, "\\textclass", 0) + if (i != -1) and "literate-" in document.header[i]: + document.textclass = document.header[i].replace("\\textclass literate-", "") + j = find_token(document.header, "\\begin_modules", 0) + if (j != -1): + document.header.insert(j + 1, "noweb") + else: + document.header.insert(i + 1, "\\end_modules") + document.header.insert(i + 1, "noweb") + document.header.insert(i + 1, "\\begin_modules") + i = 0 + while True: + i = find_token(document.body, "\\begin_layout Scrap", i) + if i == -1: + break + document.body[i] = "\\begin_layout Chunk" + i = i + 1 + + +def revert_itemargs(document): + " Reverts \\item arguments to TeX-code " + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Argument item:", i) + if i == -1: + return + j = find_end_of_inset(document.body, i) + # Find containing paragraph layout + parent = get_containing_layout(document.body, i) + if parent == False: + document.warning("Malformed lyx document: Can't find parent paragraph layout") + i = i + 1 + continue + parbeg = parent[1] + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) + endPlain = find_end_of_layout(document.body, beginPlain) + content = document.body[beginPlain + 1 : endPlain] + del document.body[i:j+1] + subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + document.body[parbeg + 1:parbeg + 1] = subst + i = i + 1 + + +def revert_garamondx_newtxmath(document): + " Revert native garamond newtxmath definition to LaTeX " + + i = find_token(document.header, "\\font_math", 0) + if i == -1: + return + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + val = get_value(document.header, "\\font_math", i) + if val == "garamondx-ntxm": + add_to_preamble(document, "\\usepackage[garamondx]{newtxmath}") + document.header[i] = "\\font_math auto" + + +def revert_garamondx(document): + " Revert native garamond font definition to LaTeX " + + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + i = find_token(document.header, "\\font_roman garamondx", 0) + if i != -1: + osf = False + j = find_token(document.header, "\\font_osf true", 0) + if j != -1: + osf = True + preamble = "\\usepackage" + if osf: + preamble += "[osfI]" + preamble += "{garamondx}" + add_to_preamble(document, [preamble]) + document.header[i] = "\\font_roman default" + ## # Conversion hub @@ -211,12 +1837,76 @@ convert = [ [416, []], [417, [convert_japanese_encodings]], [418, []], + [419, []], + [420, [convert_biblio_style]], + [421, [convert_longtable_captions]], + [422, [convert_use_packages]], + [423, [convert_use_mathtools]], + [424, [convert_cite_engine_type]], + [425, []], + [426, []], + [427, []], + [428, [convert_cell_rotation]], + [429, [convert_table_rotation]], + [430, [convert_listoflistings]], + [431, [convert_use_amssymb]], + [432, []], + [433, [convert_armenian]], + [434, []], + [435, []], + [436, []], + [437, []], + [438, []], + [439, []], + [440, []], + [441, [convert_mdnomath]], + [442, []], + [443, []], + [444, []], + [445, []], + [446, [convert_latexargs]], + [447, [convert_IEEEtran, convert_AASTeX, convert_AGUTeX, convert_IJMP, convert_SIGPLAN, convert_SIGGRAPH, convert_EuropeCV]], + [448, [convert_literate]], + [449, []], + [450, []] ] revert = [ + [449, [revert_garamondx, revert_garamondx_newtxmath]], + [448, [revert_itemargs]], + [447, [revert_literate]], + [446, [revert_IEEEtran, revert_AASTeX, revert_AGUTeX, revert_IJMP, revert_SIGPLAN, revert_SIGGRAPH, revert_EuropeCV]], + [445, [revert_latexargs]], + [444, [revert_uop]], + [443, [revert_biolinum]], + [442, []], + [441, [revert_newtxmath]], + [440, [revert_mdnomath]], + [439, [revert_mathfonts]], + [438, [revert_minionpro]], + [437, [revert_ipadeco, revert_ipachar]], + [436, [revert_texgyre]], + [435, [revert_mathdesign]], + [434, [revert_txtt]], + [433, [revert_libertine]], + [432, [revert_armenian]], + [431, [revert_languages, revert_ancientgreek]], + [430, [revert_use_amssymb]], + [429, [revert_listoflistings]], + [428, [revert_table_rotation]], + [427, [revert_cell_rotation]], + [426, [revert_tipa]], + [425, [revert_verbatim]], + [424, [revert_cancel]], + [423, [revert_cite_engine_type]], + [422, [revert_use_mathtools]], + [421, [revert_use_packages]], + [420, [revert_longtable_captions]], + [419, [revert_biblio_style]], + [418, [revert_australian]], [417, [revert_justification]], [416, [revert_japanese_encodings]], - [415, [revert_negative_space,revert_math_spaces]], + [415, [revert_negative_space, revert_math_spaces]], [414, [revert_undertilde]], [413, [revert_visible_space]] ]