document.preamble.extend(text)
+def insert_to_preamble(index, document, text):
+ """ Insert text to the preamble at a given line"""
+
+ document.preamble.insert(index, text)
+
# Convert a LyX length into a LaTeX length
def convert_len(len):
units = {"text%":"\\backslash\ntextwidth", "col%":"\\backslash\ncolumnwidth",
return retval
+#Bug 5022....
+#Might should do latex2ert first, then deal with stuff that DOESN'T
+#end up inside ERT. That routine could be modified so that it returned
+#a list of lines, and we could then skip ERT bits and only deal with
+#the other bits.
def latex2lyx(data):
'''Takes a string, possibly multi-line, and returns the result of
converting LaTeX constructs into LyX constructs. Returns a list of
return retval
-def lyx2latex(lines):
+def lyx2latex(document, lines):
'Convert some LyX stuff into corresponding LaTeX stuff, as best we can.'
# clean up multiline stuff
content = ""
#skip all that stuff
continue
+ # this needs to be added to the preamble because of cases like
+ # \textmu, \textbackslash, etc.
+ add_to_preamble(document, ['% added by lyx2lyx for converted index entries',
+ '\\@ifundefined{textmu}',
+ ' {\\usepackage{textcomp}}{}'])
# a lossless reversion is not possible
# try at least to handle some common insets and settings
- # do not replace inside ERTs
if ert_end >= curline:
line = line.replace(r'\backslash', r'\\')
else:
+ line = line.replace('&', '\\&{}')
+ line = line.replace('#', '\\#{}')
+ line = line.replace('^', '\\^{}')
+ line = line.replace('%', '\\%{}')
+ line = line.replace('_', '\\_{}')
+ line = line.replace('$', '\\${}')
+
# Do the LyX text --> LaTeX conversion
for rep in reps:
- line = line.replace(rep[1], rep[0])
+ line = line.replace(rep[1], rep[0] + "{}")
line = line.replace(r'\backslash', r'\textbackslash{}')
line = line.replace(r'\series bold', r'\bfseries{}').replace(r'\series default', r'\mdseries{}')
line = line.replace(r'\shape italic', r'\itshape{}').replace(r'\shape smallcaps', r'\scshape{}')
setupstart = ""
setupend = ""
# write the preamble
- add_to_preamble(document,
- ['% Commands inserted by lyx2lyx for PDF properties',
- '\\usepackage[unicode=true'
+ # babel must be loaded before hyperref and hyperref the first part
+ # of the preamble, like in LyX 1.6
+ insert_to_preamble(0, document,
+ '% Commands inserted by lyx2lyx for PDF properties\n'
+ + '\\usepackage{babel}\n'
+ + '\\usepackage[unicode=true'
+ bookmarks
+ breaklinks
+ pdfborder
+ colorlinks
+ pagemode
+ ']\n'
- ' {hyperref}\n'
+ + ' {hyperref}\n'
+ setupstart
+ title
+ author
+ subject
+ keywords
+ otheroptions
- + setupend])
+ + setupend)
def remove_inzip_options(document):
m = r1.match(document.body[i + 2])
if m == None:
document.warning("Unable to match: " + document.body[i+2])
- i += 1
- continue
- fullcontent = m.group(1)
- linelist = latex2lyx(fullcontent)
+ # this can happen with empty index insets!
+ linelist = [""]
+ else:
+ fullcontent = m.group(1)
+ linelist = latex2lyx(fullcontent)
#document.warning(fullcontent)
linelist = ["\\begin_inset Index", "status collapsed", "\\begin_layout Standard", ""] + \
if j == -1:
return
- content = lyx2latex(document.body[i:j])
+ content = lyx2latex(document, document.body[i:j])
# escape quotes
content = content.replace('"', r'\"')
document.body[i:j] = ["\\begin_inset CommandInset index", "LatexCommand index",
if i == -1:
return
nextline = i + 1
- if r0.match(document.body[nextline]):
- previewline = document.body[nextline]
- nextline += 1
- else:
- previewline = ""
m = r1.match(document.body[nextline])
if m == None:
document.warning("Malformed LyX document: No LatexCommand line for `" +
continue
cmd = m.group(1)
nextline += 1
+ if r0.match(document.body[nextline]):
+ previewline = document.body[nextline]
+ nextline += 1
+ else:
+ previewline = ""
m = r2.match(document.body[nextline])
if m == None:
document.warning("Malformed LyX document: No filename line for `" + \
document.body[i] = "\\begin_layout Plain Layout"
i += 1
+
+def revert_tabulators(document):
+ "Revert tabulators to 4 spaces"
+ i = 0
+ while True:
+ i = find_token(document.body, "\t", i)
+ if i == -1:
+ return
+ document.body[i] = document.body[i].replace("\t", " ")
+ i += 1
+
+
+def revert_tabsize(document):
+ "Revert the tabsize parameter of listings"
+ i = 0
+ j = 0
+ while True:
+ # either it is the only parameter
+ i = find_token(document.body, 'lstparams "tabsize=4"', i)
+ if i != -1:
+ del document.body[i]
+ # or the last one
+ j = find_token(document.body, "lstparams", j)
+ if j == -1:
+ return
+ pos = document.body[j].find(",tabsize=")
+ document.body[j] = document.body[j][:pos] + '"'
+ i += 1
+ j += 1
+
+
+def revert_mongolian(document):
+ "Set language Mongolian to English"
+ i = 0
+ if document.language == "mongolian":
+ 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 mongolian", j)
+ if j == -1:
+ return
+ document.body[j] = document.body[j].replace("\\lang mongolian", "\\lang english")
+ j = j + 1
+
+
+def revert_default_options(document):
+ ' Remove param use_default_options '
+ i = find_token(document.header, "\\use_default_options", 0)
+ if i != -1:
+ del document.header[i]
+
+
+def convert_default_options(document):
+ ' Add param use_default_options and set it to false '
+ i = find_token(document.header, "\\textclass", 0)
+ if i == -1:
+ document.warning("Malformed LyX document: Missing `\\textclass'.")
+ return
+ document.header.insert(i, '\\use_default_options false')
+
+
##
# Conversion hub
#
[337, [convert_display_enum]],
[338, []],
[339, []],
- [340, [add_plain_layout]]
+ [340, [add_plain_layout]],
+ [341, []],
+ [342, []],
+ [343, [convert_default_options]]
]
-revert = [[339, []],
+revert = [[342, [revert_default_options]],
+ [341, [revert_mongolian]],
+ [340, [revert_tabulators, revert_tabsize]],
+ [339, []],
[338, [revert_removed_modules]],
[337, [revert_polytonicgreek]],
[336, [revert_display_enum]],