# -*- coding: utf-8 -*-
# This file is part of lyx2lyx
# -*- coding: utf-8 -*-
-# Copyright (C) 2008 José Matos <jamatos@lyx.org>
+# Copyright (C) 2010 The LyX team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
l = document.body[m].find(option)
if l != -1:
val = document.body[m][l:].split('"')[1]
- document.body[m] = document.body[m][:l-1] + document.body[m][l+len(option + '="' + val + '"'):]
+ document.body[m] = document.body[m][:l - 1] + document.body[m][l+len(option + '="' + val + '"'):]
return l
def find_end_of_inset(lines, i):
return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
+# Note that text can be either a list of lines or a single line.
def add_to_preamble(document, text):
""" Add text to the preamble if it is not already there.
Only the first line is checked!"""
+ if not type(text) is list:
+ # split on \n just in case
+ # it'll give us the one element list we want
+ # if there's no \n, too
+ text = text.split('\n')
+
if find_token(document.preamble, text[0], 0) != -1:
return
return string
-# This routine wraps some content in an ERT inset. It returns a
-# LIST of strings. This is how lyx2lyx works: with a list of strings,
-# each representing a line of a LyX file. Embedded newlines confuse
+# This routine wraps some content in an ERT inset.
+#
+# NOTE: The function accepts either a single string or a LIST of strings as
+# argument. But it returns a LIST of strings, split on \n, so that it does
+# not have embedded newlines.
+#
+# This is how lyx2lyx represents a LyX document: as a list of strings,
+# each representing a line of a LyX file. Embedded newlines confuse
# lyx2lyx very much.
-# For this same reason, we expect as input a LIST of strings, not
-# something with embedded newlines. That said, if any of your strings
-# do have embedded newlines, the string will eventually get split on
-# them and you'll get a list back.
#
# A call to this routine will often go something like this:
# i = find_token('\\begin_inset FunkyInset', ...)
# ...
# j = find_end_of_inset(document.body, i)
# content = ...extract content from insets
+# # that could be as simple as:
+# # content = lyx2latex(document[i:j + 1])
# ert = put_cmd_in_ert(content)
# document.body[i:j] = ert
# Now, before we continue, we need to reset i appropriately. Normally,
# this would be:
# i += len(ert)
# That puts us right after the ERT we just inserted.
-def put_cmd_in_ert(strlist):
+#
+def put_cmd_in_ert(arg):
ret = ["\\begin_inset ERT", "status collapsed", "\\begin_layout Plain Layout", ""]
# Despite the warnings just given, it will be faster for us to work
# with a single string internally. That way, we only go through the
# unicode_reps loop once.
- s = "\n".join(strlist)
+ if type(arg) is list:
+ s = "\n".join(arg)
+ else:
+ s = arg
for rep in unicode_reps:
- s = s.replace(rep[1], rep[0].replace('\\\\', '\\'))
+ s = s.replace(rep[1], rep[0].replace('\\\\', '\\'))
s = s.replace('\\', "\\backslash\n")
ret += s.splitlines()
ret += ["\\end_layout", "\\end_inset"]
# clean up multiline stuff
content = ""
ert_end = 0
+ note_end = 0
+ hspace = ""
for curline in range(len(lines)):
line = lines[curline]
- if line.startswith("\\begin_inset ERT"):
+ if line.startswith("\\begin_inset Note Note"):
+ # We want to skip LyX notes, so remember where the inset ends
+ note_end = find_end_of_inset(lines, curline + 1)
+ continue
+ elif note_end >= curline:
+ # Skip LyX notes
+ continue
+ elif line.startswith("\\begin_inset ERT"):
# We don't want to replace things inside ERT, so figure out
# where the end of the inset is.
ert_end = find_end_of_inset(lines, curline + 1)
line = "''"
else:
line = "'"
+ elif line.startswith("\\begin_inset space"):
+ line = line[18:].strip()
+ if line.startswith("\\hspace"):
+ # Account for both \hspace and \hspace*
+ hspace = line[:-2]
+ continue
+ elif line == "\\space{}":
+ line = "\\ "
+ elif line == "\\thinspace{}":
+ line = "\\,"
+ elif hspace != "":
+ # The LyX length is in line[8:], after the \length keyword
+ # latex_length returns "bool,length"
+ length = latex_length(line[8:]).split(",")[1]
+ line = hspace + "{" + length + "}"
+ hspace = ""
elif line.isspace() or \
line.startswith("\\begin_layout") or \
line.startswith("\\end_layout") or \
# a lossless reversion is not possible
# try at least to handle some common insets and settings
if ert_end >= curline:
- line = line.replace(r'\backslash', r'\\')
+ line = line.replace(r'\backslash', '\\')
else:
- line = line.replace('&', '\\&{}')
- line = line.replace('#', '\\#{}')
- line = line.replace('^', '\\^{}')
- line = line.replace('%', '\\%{}')
- line = line.replace('_', '\\_{}')
- line = line.replace('$', '\\${}')
+ # No need to add "{}" after single-nonletter macros
+ line = line.replace('&', '\\&')
+ line = line.replace('#', '\\#')
+ line = line.replace('^', '\\textasciicircum{}')
+ line = line.replace('%', '\\%')
+ line = line.replace('_', '\\_')
+ line = line.replace('$', '\\$')
# Do the LyX text --> LaTeX conversion
for rep in unicode_reps:
end = string[i + len(unit):]
string = value + latex_unit + end
if plus > minus:
- value = string[plus+1:i]
+ value = string[plus + 1:i]
value = str(float(value)/100)
- begin = string[:plus+1]
+ begin = string[:plus + 1]
end = string[i+len(unit):]
string = begin + value + latex_unit + end
if plus < minus:
- value = string[minus+1:i]
+ value = string[minus + 1:i]
value = str(float(value)/100)
- begin = string[:minus+1]
+ begin = string[:minus + 1]
string = begin + value + latex_unit
# replace + and -, but only if the - is not the first character
def revert_flex_inset(document, name, LaTeXname, position):
" Convert flex insets to TeX code "
- i = 0
- z = 0
+ i = position
while True:
- i = find_token(document.body, '\\begin_inset Flex ' + name, position)
+ i = find_token(document.body, '\\begin_inset Flex ' + name, i)
if i == -1:
return
- else:
- z = find_end_of_inset(document.body, i)
- if z == -1:
- document.warning("Malformed LyX document: Can't find end of Flex " + name + " inset.")
- return
- # remove the \end_inset
- document.body[z - 2:z + 1] = put_cmd_in_ert("}")
- # we need to reset character layouts if necessary
- j = find_token(document.body, '\\emph on', i)
- k = find_token(document.body, '\\noun on', i)
- l = find_token(document.body, '\\series', i)
- m = find_token(document.body, '\\family', i)
- n = find_token(document.body, '\\shape', i)
- o = find_token(document.body, '\\color', i)
- p = find_token(document.body, '\\size', i)
- q = find_token(document.body, '\\bar under', i)
- r = find_token(document.body, '\\uuline on', i)
- s = find_token(document.body, '\\uwave on', i)
- t = find_token(document.body, '\\strikeout on', i)
- if j != -1 and j < z:
- document.body.insert(z-2, "\\emph default")
- if k != -1 and k < z:
- document.body.insert(z-2, "\\noun default")
- if l != -1 and l < z:
- document.body.insert(z-2, "\\series default")
- if m != -1 and m < z:
- document.body.insert(z-2, "\\family default")
- if n != -1 and n < z:
- document.body.insert(z-2, "\\shape default")
- if o != -1 and o < z:
- document.body.insert(z-2, "\\color inherit")
- if p != -1 and p < z:
- document.body.insert(z-2, "\\size default")
- if q != -1 and q < z:
- document.body.insert(z-2, "\\bar default")
- if r != -1 and r < z:
- document.body.insert(z-2, "\\uuline default")
- if s != -1 and s < z:
- document.body.insert(z-2, "\\uwave default")
- if t != -1 and t < z:
- document.body.insert(z-2, "\\strikeout default")
- document.body[i:i+4] = put_cmd_in_ert(LaTeXname + "{")
+ z = find_end_of_inset(document.body, i)
+ if z == -1:
+ document.warning("Malformed LyX document: Can't find end of Flex " + name + " inset.")
+ return
+ # remove the \end_inset
+ document.body[z - 2:z + 1] = put_cmd_in_ert("}")
+ # we need to reset character layouts if necessary
+ j = find_token(document.body, '\\emph on', i)
+ k = find_token(document.body, '\\noun on', i)
+ l = find_token(document.body, '\\series', i)
+ m = find_token(document.body, '\\family', i)
+ n = find_token(document.body, '\\shape', i)
+ o = find_token(document.body, '\\color', i)
+ p = find_token(document.body, '\\size', i)
+ q = find_token(document.body, '\\bar under', i)
+ r = find_token(document.body, '\\uuline on', i)
+ s = find_token(document.body, '\\uwave on', i)
+ t = find_token(document.body, '\\strikeout on', i)
+ if j != -1 and j < z:
+ document.body.insert(z - 2, "\\emph default")
+ if k != -1 and k < z:
+ document.body.insert(z - 2, "\\noun default")
+ if l != -1 and l < z:
+ document.body.insert(z - 2, "\\series default")
+ if m != -1 and m < z:
+ document.body.insert(z - 2, "\\family default")
+ if n != -1 and n < z:
+ document.body.insert(z - 2, "\\shape default")
+ if o != -1 and o < z:
+ document.body.insert(z - 2, "\\color inherit")
+ if p != -1 and p < z:
+ document.body.insert(z - 2, "\\size default")
+ if q != -1 and q < z:
+ document.body.insert(z - 2, "\\bar default")
+ if r != -1 and r < z:
+ document.body.insert(z - 2, "\\uuline default")
+ if s != -1 and s < z:
+ document.body.insert(z - 2, "\\uwave default")
+ if t != -1 and t < z:
+ document.body.insert(z - 2, "\\strikeout default")
+ document.body[i:i + 4] = put_cmd_in_ert(LaTeXname + "{")
i += 1
i = find_token(document.body, name + ' on', i)
if i == -1:
return changed
+ j = find_token(document.body, name + ' default', i)
+ k = find_token(document.body, name + ' on', i + 1)
+ # if there is no default set, the style ends with the layout
+ # assure hereby that we found the correct layout end
+ if j != -1 and (j < k or k == -1):
+ document.body[j:j + 1] = put_cmd_in_ert("}")
else:
- j = find_token(document.body, name + ' default', i)
- k = find_token(document.body, name + ' on', i + 1)
- # if there is no default set, the style ends with the layout
- # assure hereby that we found the correct layout end
- if j != -1 and (j < k or k ==-1):
- document.body[j:j+1] = put_cmd_in_ert("}")
+ j = find_token(document.body, '\\end_layout', i)
+ document.body[j:j] = put_cmd_in_ert("}")
+ document.body[i:i + 1] = put_cmd_in_ert(LaTeXname + "{")
+ changed = True
+ i += 1
+
+
+def revert_layout_command(document, name, LaTeXname, position):
+ " Reverts a command from a layout to TeX code "
+ i = position
+ while True:
+ i = find_token(document.body, '\\begin_layout ' + name, i)
+ if i == -1:
+ return
+ k = -1
+ # find the next layout
+ j = i + 1
+ while k == -1:
+ j = find_token(document.body, '\\begin_layout', j)
+ l = len(document.body)
+ # if nothing was found it was the last layout of the document
+ if j == -1:
+ document.body[l - 4:l - 4] = put_cmd_in_ert("}")
+ k = 0
+ # exclude plain layout because this can be TeX code or another inset
+ elif document.body[j] != '\\begin_layout Plain Layout':
+ document.body[j - 2:j - 2] = put_cmd_in_ert("}")
+ k = 0
else:
- j = find_token(document.body, '\\end_layout', i)
- document.body[j:j] = put_cmd_in_ert("}")
- document.body[i:i+1] = put_cmd_in_ert(LaTeXname + "{")
- changed = True
+ j += 1
+ document.body[i] = '\\begin_layout Standard'
+ document.body[i + 1:i + 1] = put_cmd_in_ert(LaTeXname + "{")
i += 1
continue
# don't set a box for longtables, only delete tabularvalignment
# the alignment is 2 lines below \\begin_inset Tabular
- p = document.body[i+2].find("islongtable")
+ p = document.body[i + 2].find("islongtable")
if p > -1:
- q = document.body[i+2].find("tabularvalignment")
+ q = document.body[i + 2].find("tabularvalignment")
if q > -1:
- document.body[i+2] = document.body[i+2][:q-1]
- document.body[i+2] = document.body[i+2] + '>'
+ document.body[i + 2] = document.body[i + 2][:q - 1]
+ document.body[i + 2] = document.body[i + 2] + '>'
i = i + 1
# when no longtable
if p == -1:
tabularvalignment = 'c'
# which valignment is specified?
- m = document.body[i+2].find('tabularvalignment="top"')
+ m = document.body[i + 2].find('tabularvalignment="top"')
if m > -1:
tabularvalignment = 't'
- m = document.body[i+2].find('tabularvalignment="bottom"')
+ m = document.body[ i+ 2].find('tabularvalignment="bottom"')
if m > -1:
tabularvalignment = 'b'
# delete tabularvalignment
- q = document.body[i+2].find("tabularvalignment")
+ q = document.body[i + 2].find("tabularvalignment")
if q > -1:
- document.body[i+2] = document.body[i+2][:q-1]
- document.body[i+2] = document.body[i+2] + '>'
+ document.body[i + 2] = document.body[i + 2][:q - 1]
+ document.body[i + 2] = document.body[i + 2] + '>'
# don't add a box when centered
if tabularvalignment == 'c':
'\\begin_layout Plain Layout\n\n\n\\backslash\n' \
'phantom{\n\\end_layout\n\n\\end_inset\n')
substi = substi.split('\n')
- document.body[i : i+4] = substi
+ document.body[i:i + 4] = substi
i += len(substi)
j = find_token(document.body, "\\end_layout", i)
if j == -1:
'\\begin_layout Plain Layout\n\n' \
'}\n\\end_layout\n\n\\end_inset\n')
substj = substj.split('\n')
- document.body[j : j+4] = substj
+ document.body[j:j + 4] = substj
i += len(substj)
'\\begin_layout Plain Layout\n\n\n\\backslash\n' \
'hphantom{\n\\end_layout\n\n\\end_inset\n')
substi = substi.split('\n')
- document.body[i : i+4] = substi
+ document.body[i:i + 4] = substi
i += len(substi)
j = find_token(document.body, "\\end_layout", i)
if j == -1:
'\\begin_layout Plain Layout\n\n' \
'}\n\\end_layout\n\n\\end_inset\n')
substj = substj.split('\n')
- document.body[j : j+4] = substj
+ document.body[j:j + 4] = substj
i += len(substj)
'\\begin_layout Plain Layout\n\n\n\\backslash\n' \
'vphantom{\n\\end_layout\n\n\\end_inset\n')
substi = substi.split('\n')
- document.body[i : i+4] = substi
+ document.body[i:i + 4] = substi
i += len(substi)
j = find_token(document.body, "\\end_layout", i)
if j == -1:
'\\begin_layout Plain Layout\n\n' \
'}\n\\end_layout\n\n\\end_inset\n')
substj = substj.split('\n')
- document.body[j : j+4] = substj
+ document.body[j:j + 4] = substj
i += len(substj)
ishortcut = get_value(document.header, '\\shortcut', i, k)
if ishortcut != "" and indices == "true":
preamble += "\\newindex[" + iname + "]{" + ishortcut + "}\n"
- del document.header[i:k+1]
+ del document.header[i:k + 1]
i = 0
if preamble != "":
insert_to_preamble(0, document, preamble)
# escape quotes
content = content.replace('"', r'\"')
subst = [old_put_cmd_in_ert("\\sindex[" + itype + "]{" + content + "}")]
- document.body[i:k+1] = subst
+ document.body[i:k + 1] = subst
i = i + 1
i = 0
while True:
j = find_token(document.body, "type", i, k)
del document.body[j]
elif indices == "false":
- del document.body[i:k+1]
+ del document.body[i:k + 1]
else:
subst = [old_put_cmd_in_ert("\\printindex[" + ptype + "]{}")]
- document.body[i:k+1] = subst
+ document.body[i:k + 1] = subst
i = i + 1
continue
ptype = get_value(document.body, 'type', i, k).strip('"')
if indices == "false":
- del document.body[i:k+1]
+ del document.body[i:k + 1]
else:
subst = [old_put_cmd_in_ert("\\printsubindex[" + ptype + "]{}")]
- document.body[i:k+1] = subst
+ document.body[i:k + 1] = subst
i = i + 1
i = i + 1
continue
if indices == "false":
- del document.body[i:k+1]
+ del document.body[i:k + 1]
else:
subst = [old_put_cmd_in_ert("\\" + ctype + "{}")]
- document.body[i:k+1] = subst
+ document.body[i:k + 1] = subst
i = i + 1
if i == -1:
break
# the alignment is 2 lines below \\begin_inset Tabular
- j = document.body[i+2].find("longtabularalignment")
+ j = document.body[i + 2].find("longtabularalignment")
if j == -1:
break
- document.body[i+2] = document.body[i+2][:j-1]
- document.body[i+2] = document.body[i+2] + '>'
+ document.body[i + 2] = document.body[i + 2][:j - 1]
+ document.body[i + 2] = document.body[i + 2] + '>'
i = i + 1
subst = [old_put_cmd_in_ert("\\vspace*{" + length + "}")]
else:
subst = [old_put_cmd_in_ert("\\vspace{" + length + "}")]
- document.body[i:i+2] = subst
+ document.body[i:i + 2] = subst
i = i + 1
protected = (document.body[i].find("\\hspace*{}") != -1)
# only revert if a custom length was set and if
# it used a percent length
- length = get_value(document.body, '\\length', i+1)
+ length = get_value(document.body, '\\length', i + 1)
if length == '':
document.warning("Malformed lyx document: Missing '\\length' in Space inset.")
return
subst = [old_put_cmd_in_ert("\\hspace*{" + length + "}")]
else:
subst = [old_put_cmd_in_ert("\\hspace{" + length + "}")]
- document.body[i:i+3] = subst
+ document.body[i:i + 3] = subst
i = i + 2
if i == -1:
break
protected = (document.body[i].find("\\hspace*{}") != -1)
- length = get_value(document.body, '\\length', i+1)
+ length = get_value(document.body, '\\length', i + 1)
if length == '':
document.warning("Malformed lyx document: Missing '\\length' in Space inset.")
return
subst = [old_put_cmd_in_ert("\\hspace*{" + length + "}")]
else:
subst = [old_put_cmd_in_ert("\\hspace{" + length + "}")]
- document.body[i:i+3] = subst
+ document.body[i:i + 3] = subst
i = i + 2
def convert_author_id(document):
#If the layout is Standard we need to remove it, otherwise there
#will be paragraph breaks that shouldn't be there.
k = find_token(document.body, "\\begin_layout Standard", i)
- if k == i+2:
- del document.body[i : i+3]
- del document.body[j-5 : j-2]
+ if k == i + 2:
+ del document.body[i:i + 3]
+ del document.body[j - 5:j - 2]
i -= 6
else:
del document.body[i]
- del document.body[j-1]
+ del document.body[j - 1]
i -= 2
if found != -1:
has_equal_spacing = True
content = [document.body[i][21:]]
- content += document.body[i+1:j]
+ content += document.body[i + 1:j]
subst = put_cmd_in_ert(content)
- document.body[i:j+1] = subst
+ document.body[i:j + 1] = subst
i += len(subst)
else:
for curline in range(i,j):
+ ', ' + str(blueout) + '}\n'
+ '\\color{document_fontcolor}\n')
-
def revert_shadedboxcolor(document):
" Reverts shaded box color to preamble code "
i = 0
if document.body[k].startswith("type"):
typ = document.body[k][4:].strip().strip('"')
if arg != "version" or typ != "lyxinfo":
- i = j+1
+ i = j + 1
continue
# We do not actually know the version of LyX used to produce the document.
s = [version]
# Now we want to check if the line after "\end_inset" is empty. It normally
# is, so we want to remove it, too.
- lastline = j+1
- if document.body[j+1].strip() == "":
- lastline = j+2
+ lastline = j + 1
+ if document.body[j + 1].strip() == "":
+ lastline = j + 2
document.body[i: lastline] = s
- i = i+1
+ i = i + 1
def revert_math_scale(document):
del document.header[i]
+def revert_DIN_C_pagesizes(document):
+ i = 0
+ " Revert DIN C page sizes to default "
+ i = find_token(document.header, '\\papersize', 0)
+ if i != -1:
+ size = document.header[i][11:]
+ if size == "c0paper" or size == "c1paper" or size == "c2paper" \
+ or size == "c3paper" or size == "c4paper" or size == "c5paper" \
+ or size == "c6paper":
+ del document.header[i]
+
+
def convert_html_quotes(document):
" Remove quotes around html_latex_start and html_latex_end "
i = find_token(document.body, '\\begin_inset Argument', i)
if i == -1:
return
- document.body[i] = "\\begin_inset OptArg"
- i += 1
+ document.body[i] = "\\begin_inset OptArg"
+ i += 1
def revert_makebox(document):
# only revert frameless boxes without an inner box
i = find_token(document.body, '\\begin_inset Box Frameless', i)
if i == -1:
+ # remove the option use_makebox
+ revert_use_makebox(document)
return
- else:
- z = find_end_of_inset(document.body, i)
- if z == -1:
- document.warning("Malformed LyX document: Can't find end of box inset.")
+ z = find_end_of_inset(document.body, i)
+ if z == -1:
+ document.warning("Malformed LyX document: Can't find end of box inset.")
+ return
+ j = find_token(document.body, 'use_makebox 1', i)
+ # assure we found the makebox of the current box
+ if j < z and j != -1:
+ y = find_token(document.body, "\\begin_layout", i)
+ if y > z or y == -1:
+ document.warning("Malformed LyX document: Can't find layout in box.")
return
- j = find_token(document.body, 'use_makebox 1', i)
- # assure we found the makebox of the current box
- if j > i + 7 or j == -1:
- return
- else:
- # remove the \end_inset
- document.body[z - 2:z + 1] = put_cmd_in_ert("}")
- # determine the alignment
- k = find_token(document.body, 'hor_pos', j - 4)
- align = document.body[k][9]
- # determine the width
- l = find_token(document.body, 'width "', j + 1)
- length = document.body[l][7:]
- # remove trailing '"'
- length = length[:-1]
- # latex_length returns "bool,length"
- length = latex_length(length).split(",")[1]
- subst = "\\makebox[" + length + "][" \
- + align + "]{"
- document.body[i:i+13] = put_cmd_in_ert(subst)
+ # remove the \end_layout \end_inset pair
+ document.body[z - 2:z + 1] = put_cmd_in_ert("}")
+ # determine the alignment
+ k = find_token(document.body, 'hor_pos', j - 4)
+ align = document.body[k][9]
+ # determine the width
+ l = find_token(document.body, 'width "', j + 1)
+ length = document.body[l][7:]
+ # remove trailing '"'
+ length = length[:-1]
+ # latex_length returns "bool,length"
+ length = latex_length(length).split(",")[1]
+ subst = "\\makebox[" + length + "][" \
+ + align + "]{"
+ document.body[i:y + 1] = put_cmd_in_ert(subst)
i += 1
+def revert_use_makebox(document):
+ " Deletes use_makebox option of boxes "
+ h = 0
+ while 1:
+ # remove the option use_makebox
+ h = find_token(document.body, 'use_makebox', 0)
+ if h == -1:
+ return
+ del document.body[h]
+ h += 1
+
+
+def convert_use_makebox(document):
+ " Adds use_makebox option for boxes "
+ i = 0
+ while 1:
+ # remove the option use_makebox
+ i = find_token(document.body, '\\begin_inset Box', i)
+ if i == -1:
+ return
+ k = find_token(document.body, 'use_parbox', i)
+ if k == -1:
+ document.warning("Malformed LyX document: Can't find use_parbox statement in box.")
+ return
+ document.body.insert(k + 1, "use_makebox 0")
+ i = k + 1
+
+
def revert_IEEEtran(document):
" Convert IEEEtran layouts and styles to TeX code "
+ if document.textclass != "IEEEtran":
+ return
revert_flex_inset(document, "IEEE membership", "\\IEEEmembership", 0)
revert_flex_inset(document, "Lowercase", "\\MakeLowercase", 0)
+ layouts = ("Special Paper Notice", "After Title Text", "Publication ID",
+ "Page headings", "Biography without photo")
+ latexcmd = {"Special Paper Notice": "\\IEEEspecialpapernotice",
+ "After Title Text": "\\IEEEaftertitletext",
+ "Publication ID": "\\IEEEpubid"}
+ obsoletedby = {"Page headings": "MarkBoth",
+ "Biography without photo": "BiographyNoPhoto"}
+ for layout in layouts:
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_layout ' + layout, i)
+ if i == -1:
+ break
+ j = find_end_of(document.body, i, '\\begin_layout', '\\end_layout')
+ if j == -1:
+ document.warning("Malformed LyX document: Can't find end of " + layout + " layout.")
+ i += 1
+ continue
+ if layout in obsoletedby:
+ document.body[i] = "\\begin_layout " + obsoletedby[layout]
+ i = j
+ else:
+ content = lyx2latex(document, document.body[i:j + 1])
+ add_to_preamble(document, [latexcmd[layout] + "{" + content + "}"])
+ del document.body[i:j + 1]
+
+
+def revert_nameref(document):
+ " Convert namerefs to regular references "
+ cmds = ["Nameref", "nameref"]
+ foundone = False
+ rx = re.compile(r'reference "(.*)"')
+ for cmd in cmds:
+ i = 0
+ oldcmd = "LatexCommand " + cmd
+ while 1:
+ # It seems better to look for this, as most of the reference
+ # insets won't be ones we care about.
+ i = find_token(document.body, oldcmd, i)
+ if i == -1:
+ break
+ cmdloc = i
+ i += 1
+ # Make sure it is actually in an inset!
+ # We could just check document.lines[i-1], but that relies
+ # upon something that might easily change.
+ # We'll look back a few lines.
+ stins = cmdloc - 10
+ if stins < 0:
+ stins = 0
+ stins = find_token(document.body, "\\begin_inset CommandInset ref", stins)
+ if stins == -1 or stins > cmdloc:
+ continue
+ endins = find_end_of_inset(document.body, stins)
+ if endins == -1:
+ document.warning("Can't find end of inset at line " + stins + "!!")
+ continue
+ if endins < cmdloc:
+ continue
+ refline = find_token(document.body, "reference", stins)
+ if refline == -1 or refline > endins:
+ document.warning("Can't find reference for inset at line " + stinst + "!!")
+ continue
+ m = rx.match(document.body[refline])
+ if not m:
+ document.warning("Can't match reference line: " + document.body[ref])
+ continue
+ foundone = True
+ ref = m.group(1)
+ newcontent = ['\\begin_inset ERT', 'status collapsed', '', \
+ '\\begin_layout Plain Layout', '', '\\backslash', \
+ cmd + '{' + ref + '}', '\\end_layout', '', '\\end_inset']
+ document.body[stins:endins + 1] = newcontent
+ if foundone:
+ add_to_preamble(document, "\usepackage{nameref}")
+
+
+def remove_Nameref(document):
+ " Convert Nameref commands to nameref commands "
+ i = 0
+ while 1:
+ # It seems better to look for this, as most of the reference
+ # insets won't be ones we care about.
+ i = find_token(document.body, "LatexCommand Nameref" , i)
+ if i == -1:
+ break
+ cmdloc = i
+ i += 1
+
+ # Make sure it is actually in an inset!
+ # We could just check document.lines[i-1], but that relies
+ # upon something that might easily change.
+ # We'll look back a few lines.
+ stins = cmdloc - 10
+ if stins < 0:
+ stins = 0
+ stins = find_token(document.body, "\\begin_inset CommandInset ref", stins)
+ if stins == -1 or stins > cmdloc:
+ continue
+ endins = find_end_of_inset(document.body, stins)
+ if endins == -1:
+ document.warning("Can't find end of inset at line " + stins + "!!")
+ continue
+ if endins < cmdloc:
+ continue
+ document.body[cmdloc] = "LatexCommand nameref"
+
+
+def revert_mathrsfs(document):
+ " Load mathrsfs if \mathrsfs us use in the document "
+ i = 0
+ end = len(document.body) - 1
+ while True:
+ j = document.body[i].find("\\mathscr{")
+ if j != -1:
+ add_to_preamble(document, ["% this command was inserted by lyx2lyx"])
+ add_to_preamble(document, ["\\usepackage{mathrsfs}"])
+ break
+ if i == end:
+ break
+ i += 1
+
+
+def convert_mathdots(document):
+ " Load mathdots automatically "
+ while True:
+ i = find_token(document.header, "\\use_esint" , 0)
+ if i != -1:
+ document.header.insert(i + 1, "\\use_mathdots 1")
+ break
+
+
+def revert_mathdots(document):
+ " Load mathdots if used in the document "
+ i = 0
+ ddots = re.compile(r'\\begin_inset Formula .*\\ddots', re.DOTALL)
+ vdots = re.compile(r'\\begin_inset Formula .*\\vdots', re.DOTALL)
+ iddots = re.compile(r'\\begin_inset Formula .*\\iddots', re.DOTALL)
+ mathdots = find_token(document.header, "\\use_mathdots" , 0)
+ no = find_token(document.header, "\\use_mathdots 0" , 0)
+ auto = find_token(document.header, "\\use_mathdots 1" , 0)
+ yes = find_token(document.header, "\\use_mathdots 2" , 0)
+ if mathdots != -1:
+ del document.header[mathdots]
+ 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.")
+ return
+ k = ddots.search("\n".join(document.body[i:j]))
+ l = vdots.search("\n".join(document.body[i:j]))
+ m = iddots.search("\n".join(document.body[i:j]))
+ if (yes == -1) and ((no != -1) or (not k and not l and not m) or (auto != -1 and not m)):
+ i += 1
+ continue
+ # use \@ifundefined to catch also the "auto" case
+ add_to_preamble(document, ["% this command was inserted by lyx2lyx"])
+ add_to_preamble(document, ["\\@ifundefined{iddots}{\\usepackage{mathdots}}\n"])
+ return
+
+
+def convert_rule(document):
+ " Convert \\lyxline to CommandInset line "
+ i = 0
+ while True:
+ i = find_token(document.body, "\\lyxline" , i)
+ if i != -1:
+ j = find_token(document.body, "\\color" , i - 2)
+ if j == i - 2:
+ color = document.body[j] + '\n'
+ else:
+ color = ''
+ k = find_token(document.body, "\\begin_layout Standard" , i - 4)
+ # we need to handle the case that \lyxline is in a separate paragraph and that it is colored
+ # the result is then an extra empty paragraph which we get by adding an empty ERT inset
+ if k == i - 4 and j == i - 2 and document.body[i - 1] == '':
+ layout = '\\begin_inset ERT\nstatus collapsed\n\n\\begin_layout Plain Layout\n\n\n\\end_layout\n\n\\end_inset\n' \
+ + '\\end_layout\n\n' \
+ + '\\begin_layout Standard\n'
+ elif k == i - 2 and document.body[i - 1] == '':
+ layout = ''
+ else:
+ layout = '\\end_layout\n\n' \
+ + '\\begin_layout Standard\n'
+ l = find_token(document.body, "\\begin_layout Standard" , i + 4)
+ if l == i + 4 and document.body[i + 1] == '':
+ layout2 = ''
+ else:
+ layout2 = '\\end_layout\n' \
+ + '\n\\begin_layout Standard\n'
+ subst = layout \
+ + '\\noindent\n\n' \
+ + color \
+ + '\\begin_inset CommandInset line\n' \
+ + 'LatexCommand rule\n' \
+ + 'offset "0.5ex"\n' \
+ + 'width "100line%"\n' \
+ + 'height "1pt"\n' \
+ + '\n\\end_inset\n\n\n' \
+ + layout2
+ document.body[i] = subst
+ i += 1
+ else:
+ return
+
+
+def revert_rule(document):
+ " Revert line insets to Tex code "
+ i = 0
+ while 1:
+ i = find_token(document.body, "\\begin_inset CommandInset line" , i)
+ if i != -1:
+ # find end of inset
+ j = find_token(document.body, "\\end_inset" , i)
+ # assure we found the end_inset of the current inset
+ if j > i + 6 or j == -1:
+ document.warning("Malformed LyX document: Can't find end of line inset.")
+ return
+ # determine the optional offset
+ k = find_token(document.body, 'offset', i)
+ if k != -1 and k < j:
+ offset = document.body[k][8:]
+ else:
+ offset = '0"'
+ # determine the width
+ l = find_token(document.body, 'width', k + 1)
+ width = document.body[l][7:]
+ # determine the height
+ m = find_token(document.body, 'height', l + 1)
+ height = document.body[m][8:]
+ # remove trailing '"'
+ offset = offset[:-1]
+ width = width[:-1]
+ height = height[:-1]
+ # output the \rule command
+ if offset <> "0":
+ subst = "\\rule[" + offset + "]{" + width + "}{" + height + "}"
+ else:
+ subst = "\\rule{" + width + "}{" + height + "}"
+ document.body[i:j + 1] = put_cmd_in_ert(subst)
+ i += 1
+ else:
+ return
+
+def revert_diagram(document):
+ " Add the feyn package if \\Diagram is used in math "
+ i = 0
+ re_diagram = re.compile(r'\\begin_inset Formula .*\\Diagram', re.DOTALL)
+ 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.")
+ return
+ m = re_diagram.search("\n".join(document.body[i:j]))
+ if not m:
+ i += 1
+ continue
+ add_to_preamble(document, ["% this command was inserted by lyx2lyx"])
+ add_to_preamble(document, "\\usepackage{feyn}")
+ # only need to do it once!
+ return
+
##
[391, []],
[392, [convert_beamer_args]],
[393, [convert_optarg]],
- [394, []]
+ [394, [convert_use_makebox]],
+ [395, []],
+ [396, []],
+ [397, [remove_Nameref]],
+ [398, []],
+ [399, [convert_mathdots]],
+ [400, [convert_rule]],
+ [401, []]
]
-revert = [[393, [revert_makebox]],
+revert = [[400, [revert_diagram]],
+ [399, [revert_rule]],
+ [398, [revert_mathdots]],
+ [397, [revert_mathrsfs]],
+ [396, []],
+ [395, [revert_nameref]],
+ [394, [revert_DIN_C_pagesizes]],
+ [393, [revert_makebox]],
[392, [revert_argument]],
[391, [revert_beamer_args]],
[390, [revert_align_decimal, revert_IEEEtran]],