2014-03-23 12:33:05 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# This file is part of lyx2lyx
|
|
|
|
# -*- coding: utf-8 -*-
|
2015-10-28 01:27:32 +00:00
|
|
|
# Copyright (C) 2015 The LyX team
|
2014-03-23 12:33:05 +00:00
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or
|
|
|
|
# modify it under the terms of the GNU General Public License
|
|
|
|
# as published by the Free Software Foundation; either version 2
|
|
|
|
# of the License, or (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software
|
|
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
""" Convert files to the file format generated by lyx 2.2"""
|
|
|
|
|
|
|
|
import re, string
|
|
|
|
import unicodedata
|
|
|
|
import sys, os
|
|
|
|
|
|
|
|
# Uncomment only what you need to import, please.
|
|
|
|
|
|
|
|
#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
|
2015-04-09 09:01:44 +00:00
|
|
|
|
2015-07-16 20:04:08 +00:00
|
|
|
from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert, lyx2latex, \
|
2015-11-24 22:56:26 +00:00
|
|
|
length_in_bp
|
2015-04-09 09:01:44 +00:00
|
|
|
# insert_to_preamble, latex_length, revert_flex_inset, \
|
2014-03-23 12:33:05 +00:00
|
|
|
# revert_font_attrs, hex2ratio, str2bool
|
|
|
|
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
from parser_tools import find_token, find_token_backwards, find_re, \
|
|
|
|
find_end_of_inset, find_end_of_layout, find_nonempty_line, \
|
|
|
|
get_containing_layout, get_value, check_token
|
2014-03-23 12:33:05 +00:00
|
|
|
|
2015-10-19 05:10:09 +00:00
|
|
|
####################################################################
|
|
|
|
# Private helper functions
|
|
|
|
|
|
|
|
def revert_Argument_to_TeX_brace(document, line, endline, n, nmax, environment, opt, nolastopt):
|
|
|
|
'''
|
|
|
|
Reverts an InsetArgument to TeX-code
|
|
|
|
usage:
|
|
|
|
revert_Argument_to_TeX_brace(document, LineOfBegin, LineOfEnd, StartArgument, EndArgument, isEnvironment, isOpt, notLastOpt)
|
|
|
|
LineOfBegin is the line of the \begin_layout or \begin_inset statement
|
|
|
|
LineOfEnd is the line of the \end_layout or \end_inset statement, if "0" is given, the end of the file is used instead
|
|
|
|
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 is for a LaTeX environment
|
|
|
|
isOpt must be true, if the argument is an optional one
|
|
|
|
notLastOpt must be true if the argument is mandatory and followed by optional ones
|
|
|
|
'''
|
|
|
|
lineArg = 0
|
|
|
|
wasOpt = False
|
|
|
|
while lineArg != -1 and n < nmax + 1:
|
|
|
|
lineArg = find_token(document.body, "\\begin_inset Argument " + str(n), line)
|
|
|
|
if lineArg > endline and endline != 0:
|
|
|
|
return wasOpt
|
|
|
|
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:
|
|
|
|
if opt == False:
|
|
|
|
if nolastopt == False:
|
|
|
|
document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}{")
|
|
|
|
else:
|
|
|
|
document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}")
|
|
|
|
del(document.body[lineArg : beginPlain + 1])
|
|
|
|
wasOpt = False
|
|
|
|
else:
|
|
|
|
document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("]")
|
|
|
|
document.body[lineArg : beginPlain + 1] = put_cmd_in_ert("[")
|
|
|
|
wasOpt = True
|
|
|
|
else:
|
|
|
|
if opt == False:
|
|
|
|
document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}")
|
|
|
|
document.body[lineArg : beginPlain + 1] = put_cmd_in_ert("{")
|
|
|
|
wasOpt = False
|
|
|
|
else:
|
|
|
|
document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("]")
|
|
|
|
document.body[lineArg : beginPlain + 1] = put_cmd_in_ert("[")
|
|
|
|
wasOpt = True
|
|
|
|
n += 1
|
|
|
|
return wasOpt
|
|
|
|
|
|
|
|
|
2014-03-23 12:33:05 +00:00
|
|
|
###############################################################################
|
|
|
|
###
|
|
|
|
### Conversion and reversion routines
|
|
|
|
###
|
|
|
|
###############################################################################
|
|
|
|
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
def convert_separator(document):
|
|
|
|
"""
|
|
|
|
Convert layout separators to separator insets and add (LaTeX) paragraph
|
|
|
|
breaks in order to mimic previous LaTeX export.
|
|
|
|
"""
|
|
|
|
|
|
|
|
parins = ["\\begin_inset Separator parbreak", "\\end_inset", ""]
|
|
|
|
parlay = ["\\begin_layout Standard", "\\begin_inset Separator parbreak",
|
|
|
|
"\\end_inset", "", "\\end_layout", ""]
|
|
|
|
sty_dict = {
|
|
|
|
"family" : "default",
|
|
|
|
"series" : "default",
|
|
|
|
"shape" : "default",
|
|
|
|
"size" : "default",
|
|
|
|
"bar" : "default",
|
|
|
|
"color" : "inherit"
|
|
|
|
}
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while 1:
|
|
|
|
i = find_token(document.body, "\\begin_deeper", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
|
|
|
|
j = find_token_backwards(document.body, "\\end_layout", i-1)
|
|
|
|
if j != -1:
|
|
|
|
# reset any text style before inserting the inset
|
|
|
|
lay = get_containing_layout(document.body, j-1)
|
|
|
|
if lay != False:
|
|
|
|
content = "\n".join(document.body[lay[1]:lay[2]])
|
2015-03-11 12:04:46 +00:00
|
|
|
for val in list(sty_dict.keys()):
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
if content.find("\\%s" % val) != -1:
|
|
|
|
document.body[j:j] = ["\\%s %s" % (val, sty_dict[val])]
|
|
|
|
i = i + 1
|
|
|
|
j = j + 1
|
|
|
|
document.body[j:j] = parins
|
|
|
|
i = i + len(parins) + 1
|
|
|
|
else:
|
|
|
|
i = i + 1
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while 1:
|
|
|
|
i = find_token(document.body, "\\align", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
|
|
|
|
lay = get_containing_layout(document.body, i)
|
|
|
|
if lay != False and lay[0] == "Plain Layout":
|
|
|
|
i = i + 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
j = find_token_backwards(document.body, "\\end_layout", i-1)
|
|
|
|
if j != -1:
|
|
|
|
lay = get_containing_layout(document.body, j-1)
|
|
|
|
if lay != False and lay[0] == "Standard" \
|
|
|
|
and find_token(document.body, "\\align", lay[1], lay[2]) == -1 \
|
|
|
|
and find_token(document.body, "\\begin_inset VSpace", lay[1], lay[2]) == -1:
|
|
|
|
# reset any text style before inserting the inset
|
|
|
|
content = "\n".join(document.body[lay[1]:lay[2]])
|
2015-03-11 12:04:46 +00:00
|
|
|
for val in list(sty_dict.keys()):
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
if content.find("\\%s" % val) != -1:
|
|
|
|
document.body[j:j] = ["\\%s %s" % (val, sty_dict[val])]
|
|
|
|
i = i + 1
|
|
|
|
j = j + 1
|
|
|
|
document.body[j:j] = parins
|
|
|
|
i = i + len(parins) + 1
|
|
|
|
else:
|
|
|
|
i = i + 1
|
|
|
|
else:
|
|
|
|
i = i + 1
|
|
|
|
|
|
|
|
regexp = re.compile(r'^\\begin_layout (?:(-*)|(\s*))(Separator|EndOfSlide)(?:(-*)|(\s*))$', re.IGNORECASE)
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while 1:
|
|
|
|
i = find_re(document.body, regexp, i)
|
|
|
|
if i == -1:
|
|
|
|
return
|
|
|
|
|
|
|
|
j = find_end_of_layout(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Missing `\\end_layout'.")
|
|
|
|
return
|
|
|
|
|
|
|
|
lay = get_containing_layout(document.body, j-1)
|
|
|
|
if lay != False:
|
|
|
|
lines = document.body[lay[3]:lay[2]]
|
|
|
|
else:
|
|
|
|
lines = []
|
|
|
|
|
|
|
|
document.body[i:j+1] = parlay
|
|
|
|
if len(lines) > 0:
|
|
|
|
document.body[i+1:i+1] = lines
|
|
|
|
|
|
|
|
i = i + len(parlay) + len(lines) + 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_separator(document):
|
|
|
|
" Revert separator insets to layout separators "
|
|
|
|
|
2014-05-19 17:39:51 +00:00
|
|
|
beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
|
|
|
|
if document.textclass in beamer_classes:
|
|
|
|
beglaysep = "\\begin_layout Separator"
|
|
|
|
else:
|
|
|
|
beglaysep = "\\begin_layout --Separator--"
|
|
|
|
|
|
|
|
parsep = [beglaysep, "", "\\end_layout", ""]
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
comert = ["\\begin_inset ERT", "status collapsed", "",
|
|
|
|
"\\begin_layout Plain Layout", "%", "\\end_layout",
|
|
|
|
"", "\\end_inset", ""]
|
|
|
|
empert = ["\\begin_inset ERT", "status collapsed", "",
|
|
|
|
"\\begin_layout Plain Layout", " ", "\\end_layout",
|
|
|
|
"", "\\end_inset", ""]
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while 1:
|
|
|
|
i = find_token(document.body, "\\begin_inset Separator", i)
|
|
|
|
if i == -1:
|
|
|
|
return
|
|
|
|
|
|
|
|
lay = get_containing_layout(document.body, i)
|
|
|
|
if lay == False:
|
|
|
|
document.warning("Malformed LyX document: Can't convert separator inset at line " + str(i))
|
|
|
|
i = i + 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
layoutname = lay[0]
|
|
|
|
beg = lay[1]
|
|
|
|
end = lay[2]
|
|
|
|
kind = get_value(document.body, "\\begin_inset Separator", i, i+1, "plain").split()[1]
|
|
|
|
before = document.body[beg+1:i]
|
|
|
|
something_before = len(before) > 0 and len("".join(before)) > 0
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
after = document.body[j+1:end]
|
|
|
|
something_after = len(after) > 0 and len("".join(after)) > 0
|
|
|
|
if kind == "plain":
|
|
|
|
beg = beg + len(before) + 1
|
|
|
|
elif something_before:
|
|
|
|
document.body[i:i] = ["\\end_layout", ""]
|
|
|
|
i = i + 2
|
|
|
|
j = j + 2
|
|
|
|
beg = i
|
|
|
|
end = end + 2
|
|
|
|
|
|
|
|
if kind == "plain":
|
|
|
|
if something_after:
|
|
|
|
document.body[beg:j+1] = empert
|
|
|
|
i = i + len(empert)
|
|
|
|
else:
|
|
|
|
document.body[beg:j+1] = comert
|
|
|
|
i = i + len(comert)
|
|
|
|
else:
|
|
|
|
if something_after:
|
|
|
|
if layoutname == "Standard":
|
|
|
|
if not something_before:
|
|
|
|
document.body[beg:j+1] = parsep
|
|
|
|
i = i + len(parsep)
|
|
|
|
document.body[i:i] = ["", "\\begin_layout Standard"]
|
|
|
|
i = i + 2
|
|
|
|
else:
|
|
|
|
document.body[beg:j+1] = ["\\begin_layout Standard"]
|
|
|
|
i = i + 1
|
|
|
|
else:
|
|
|
|
document.body[beg:j+1] = ["\\begin_deeper"]
|
|
|
|
i = i + 1
|
|
|
|
end = end + 1 - (j + 1 - beg)
|
|
|
|
if not something_before:
|
|
|
|
document.body[i:i] = parsep
|
|
|
|
i = i + len(parsep)
|
|
|
|
end = end + len(parsep)
|
|
|
|
document.body[i:i] = ["\\begin_layout Standard"]
|
|
|
|
document.body[end+2:end+2] = ["", "\\end_deeper", ""]
|
|
|
|
i = i + 4
|
|
|
|
else:
|
|
|
|
next_par_is_aligned = False
|
|
|
|
k = find_nonempty_line(document.body, end+1)
|
|
|
|
if k != -1 and check_token(document.body[k], "\\begin_layout"):
|
|
|
|
lay = get_containing_layout(document.body, k)
|
|
|
|
next_par_is_aligned = lay != False and \
|
|
|
|
find_token(document.body, "\\align", lay[1], lay[2]) != -1
|
|
|
|
if k != -1 and not next_par_is_aligned \
|
|
|
|
and not check_token(document.body[k], "\\end_deeper") \
|
|
|
|
and not check_token(document.body[k], "\\begin_deeper"):
|
|
|
|
if layoutname == "Standard":
|
2014-05-19 17:39:51 +00:00
|
|
|
document.body[beg:j+1] = [beglaysep]
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
i = i + 1
|
|
|
|
else:
|
2014-05-19 17:39:51 +00:00
|
|
|
document.body[beg:j+1] = ["\\begin_deeper", beglaysep]
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
end = end + 2 - (j + 1 - beg)
|
|
|
|
document.body[end+1:end+1] = ["", "\\end_deeper", ""]
|
|
|
|
i = i + 3
|
|
|
|
else:
|
2014-05-19 17:39:51 +00:00
|
|
|
if something_before:
|
|
|
|
del document.body[i:end+1]
|
|
|
|
else:
|
|
|
|
del document.body[i:end-1]
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
|
|
|
|
i = i + 1
|
|
|
|
|
2014-03-23 12:33:05 +00:00
|
|
|
|
2014-05-27 20:10:02 +00:00
|
|
|
def revert_smash(document):
|
|
|
|
" Set amsmath to on if smash commands are used "
|
|
|
|
|
2014-05-27 20:17:35 +00:00
|
|
|
commands = ["smash[t]", "smash[b]", "notag"]
|
2014-05-27 20:10:02 +00:00
|
|
|
i = find_token(document.header, "\\use_package amsmath", 0)
|
|
|
|
if i == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find \\use_package amsmath.")
|
2015-11-29 04:55:00 +00:00
|
|
|
return
|
2014-05-27 20:10:02 +00:00
|
|
|
value = get_value(document.header, "\\use_package amsmath", i).split()[1]
|
|
|
|
if value != "1":
|
|
|
|
# nothing to do if package is not auto but on or off
|
2015-11-29 04:55:00 +00:00
|
|
|
return
|
2014-05-27 20:10:02 +00:00
|
|
|
j = 0
|
|
|
|
while True:
|
|
|
|
j = find_token(document.body, '\\begin_inset Formula', j)
|
|
|
|
if j == -1:
|
|
|
|
return
|
|
|
|
k = find_end_of_inset(document.body, j)
|
|
|
|
if k == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(j))
|
|
|
|
j += 1
|
|
|
|
continue
|
|
|
|
code = "\n".join(document.body[j:k])
|
|
|
|
for c in commands:
|
|
|
|
if code.find("\\%s" % c) != -1:
|
|
|
|
# set amsmath to on, since it is loaded by the newer format
|
|
|
|
document.header[i] = "\\use_package amsmath 2"
|
|
|
|
return
|
|
|
|
j = k
|
|
|
|
|
|
|
|
|
2014-07-05 11:38:55 +00:00
|
|
|
def revert_swissgerman(document):
|
|
|
|
" Set language german-ch-old to german "
|
|
|
|
i = 0
|
|
|
|
if document.language == "german-ch-old":
|
|
|
|
document.language = "german"
|
|
|
|
i = find_token(document.header, "\\language", 0)
|
|
|
|
if i != -1:
|
|
|
|
document.header[i] = "\\language german"
|
|
|
|
j = 0
|
|
|
|
while True:
|
|
|
|
j = find_token(document.body, "\\lang german-ch-old", j)
|
|
|
|
if j == -1:
|
|
|
|
return
|
|
|
|
document.body[j] = document.body[j].replace("\\lang german-ch-old", "\\lang german")
|
|
|
|
j = j + 1
|
|
|
|
|
|
|
|
|
2015-06-14 08:47:31 +00:00
|
|
|
def revert_use_package(document, pkg, commands, oldauto, supported):
|
2014-08-24 22:44:09 +00:00
|
|
|
# oldauto defines how the version we are reverting to behaves:
|
|
|
|
# if it is true, the old version uses the package automatically.
|
|
|
|
# if it is false, the old version never uses the package.
|
2015-06-14 08:47:31 +00:00
|
|
|
# If "supported" is true, the target version also supports this
|
|
|
|
# package natively.
|
2014-08-24 22:44:09 +00:00
|
|
|
regexp = re.compile(r'(\\use_package\s+%s)' % pkg)
|
2015-06-14 08:47:31 +00:00
|
|
|
p = find_re(document.header, regexp, 0)
|
2014-08-24 22:44:09 +00:00
|
|
|
value = "1" # default is auto
|
2015-06-14 08:47:31 +00:00
|
|
|
if p != -1:
|
|
|
|
value = get_value(document.header, "\\use_package" , p).split()[1]
|
|
|
|
if not supported:
|
|
|
|
del document.header[p]
|
|
|
|
if value == "2" and not supported: # on
|
2014-08-24 22:44:09 +00:00
|
|
|
add_to_preamble(document, ["\\usepackage{" + pkg + "}"])
|
|
|
|
elif value == "1" and not oldauto: # auto
|
|
|
|
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:
|
2015-06-14 08:47:31 +00:00
|
|
|
if supported:
|
|
|
|
document.header[p] = "\\use_package " + pkg + " 2"
|
|
|
|
else:
|
|
|
|
add_to_preamble(document, ["\\usepackage{" + pkg + "}"])
|
2014-08-24 22:44:09 +00:00
|
|
|
return
|
|
|
|
i = j
|
|
|
|
|
|
|
|
|
|
|
|
mathtools_commands = ["xhookrightarrow", "xhookleftarrow", "xRightarrow", \
|
|
|
|
"xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", \
|
|
|
|
"xLeftarrow", "xleftharpoondown", "xleftharpoonup", \
|
|
|
|
"xleftrightarrow", "xLeftrightarrow", "xleftrightharpoons", \
|
|
|
|
"xmapsto"]
|
2014-08-31 10:30:14 +00:00
|
|
|
|
2014-08-24 22:44:09 +00:00
|
|
|
def revert_xarrow(document):
|
|
|
|
"remove use_package mathtools"
|
2015-06-14 08:47:31 +00:00
|
|
|
revert_use_package(document, "mathtools", mathtools_commands, False, True)
|
2014-08-24 22:44:09 +00:00
|
|
|
|
2014-08-31 10:30:14 +00:00
|
|
|
|
|
|
|
def revert_beamer_lemma(document):
|
|
|
|
" Reverts beamer lemma layout to ERT "
|
2015-04-12 08:07:42 +00:00
|
|
|
|
2014-08-31 10:30:14 +00:00
|
|
|
beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
|
|
|
|
if document.textclass not in beamer_classes:
|
|
|
|
return
|
|
|
|
|
|
|
|
consecutive = False
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_layout Lemma", 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 Lemma layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
arg1 = find_token(document.body, "\\begin_inset Argument 1", i, j)
|
|
|
|
endarg1 = find_end_of_inset(document.body, arg1)
|
|
|
|
arg2 = find_token(document.body, "\\begin_inset Argument 2", i, j)
|
|
|
|
endarg2 = find_end_of_inset(document.body, arg2)
|
|
|
|
subst1 = []
|
|
|
|
subst2 = []
|
|
|
|
if arg1 != -1:
|
|
|
|
beginPlain1 = find_token(document.body, "\\begin_layout Plain Layout", arg1, endarg1)
|
|
|
|
if beginPlain1 == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find arg1 plain Layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
endPlain1 = find_end_of_inset(document.body, beginPlain1)
|
|
|
|
content1 = document.body[beginPlain1 + 1 : endPlain1 - 2]
|
|
|
|
subst1 = put_cmd_in_ert("<") + content1 + put_cmd_in_ert(">")
|
|
|
|
if arg2 != -1:
|
|
|
|
beginPlain2 = find_token(document.body, "\\begin_layout Plain Layout", arg2, endarg2)
|
|
|
|
if beginPlain2 == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find arg2 plain Layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
endPlain2 = find_end_of_inset(document.body, beginPlain2)
|
|
|
|
content2 = document.body[beginPlain2 + 1 : endPlain2 - 2]
|
|
|
|
subst2 = put_cmd_in_ert("[") + content2 + put_cmd_in_ert("]")
|
|
|
|
|
|
|
|
# remove Arg insets
|
|
|
|
if arg1 < arg2:
|
|
|
|
del document.body[arg2 : endarg2 + 1]
|
|
|
|
if arg1 != -1:
|
|
|
|
del document.body[arg1 : endarg1 + 1]
|
|
|
|
if arg2 < arg1:
|
|
|
|
del document.body[arg1 : endarg1 + 1]
|
|
|
|
if arg2 != -1:
|
|
|
|
del document.body[arg2 : endarg2 + 1]
|
|
|
|
|
|
|
|
# index of end layout has probably changed
|
|
|
|
j = find_end_of_layout(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of Lemma layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
begcmd = []
|
|
|
|
|
|
|
|
# if this is not a consecutive env, add start command
|
|
|
|
if not consecutive:
|
|
|
|
begcmd = put_cmd_in_ert("\\begin{lemma}")
|
|
|
|
|
|
|
|
# has this a consecutive lemma?
|
|
|
|
consecutive = document.body[j + 2] == "\\begin_layout Lemma"
|
|
|
|
|
|
|
|
# if this is not followed by a consecutive env, add end command
|
|
|
|
if not consecutive:
|
|
|
|
document.body[j : j + 1] = put_cmd_in_ert("\\end{lemma}") + ["\\end_layout"]
|
|
|
|
|
|
|
|
document.body[i : i + 1] = ["\\begin_layout Standard", ""] + begcmd + subst1 + subst2
|
|
|
|
|
|
|
|
i = j
|
|
|
|
|
2015-01-09 10:24:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
def revert_question_env(document):
|
|
|
|
"""
|
|
|
|
Reverts question and question* environments of
|
|
|
|
theorems-ams-extended-bytype module to ERT
|
|
|
|
"""
|
|
|
|
|
|
|
|
# Do we use theorems-ams-extended-bytype module?
|
2015-11-29 04:58:50 +00:00
|
|
|
if not "theorems-ams-extended-bytype" in document.get_module_list():
|
2015-01-09 10:24:45 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
consecutive = False
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_layout Question", i)
|
|
|
|
if i == -1:
|
|
|
|
return
|
|
|
|
|
|
|
|
starred = document.body[i] == "\\begin_layout Question*"
|
|
|
|
|
|
|
|
j = find_end_of_layout(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of Question layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
# if this is not a consecutive env, add start command
|
|
|
|
begcmd = []
|
|
|
|
if not consecutive:
|
|
|
|
if starred:
|
|
|
|
begcmd = put_cmd_in_ert("\\begin{question*}")
|
|
|
|
else:
|
|
|
|
begcmd = put_cmd_in_ert("\\begin{question}")
|
|
|
|
|
|
|
|
# has this a consecutive theorem of same type?
|
|
|
|
consecutive = False
|
|
|
|
if starred:
|
|
|
|
consecutive = document.body[j + 2] == "\\begin_layout Question*"
|
|
|
|
else:
|
|
|
|
consecutive = document.body[j + 2] == "\\begin_layout Question"
|
|
|
|
|
|
|
|
# if this is not followed by a consecutive env, add end command
|
|
|
|
if not consecutive:
|
|
|
|
if starred:
|
|
|
|
document.body[j : j + 1] = put_cmd_in_ert("\\end{question*}") + ["\\end_layout"]
|
|
|
|
else:
|
|
|
|
document.body[j : j + 1] = put_cmd_in_ert("\\end{question}") + ["\\end_layout"]
|
|
|
|
|
|
|
|
document.body[i : i + 1] = ["\\begin_layout Standard", ""] + begcmd
|
|
|
|
|
|
|
|
add_to_preamble(document, "\\providecommand{\questionname}{Question}")
|
|
|
|
|
|
|
|
if starred:
|
|
|
|
add_to_preamble(document, "\\theoremstyle{plain}\n" \
|
|
|
|
"\\newtheorem*{question*}{\\protect\\questionname}")
|
|
|
|
else:
|
|
|
|
add_to_preamble(document, "\\theoremstyle{plain}\n" \
|
|
|
|
"\\newtheorem{question}{\\protect\\questionname}")
|
|
|
|
|
|
|
|
i = j
|
|
|
|
|
2015-02-24 20:58:27 +00:00
|
|
|
|
|
|
|
def convert_dashes(document):
|
|
|
|
"convert -- and --- to \\twohyphens and \\threehyphens"
|
|
|
|
|
|
|
|
if document.backend != "latex":
|
|
|
|
return
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while i < len(document.body):
|
|
|
|
words = document.body[i].split()
|
|
|
|
if len(words) > 1 and words[0] == "\\begin_inset" and \
|
2015-03-01 21:16:45 +00:00
|
|
|
words[1] in ["CommandInset", "ERT", "External", "Formula", "Graphics", "IPA", "listings"]:
|
2015-03-01 09:52:13 +00:00
|
|
|
# must not replace anything in insets that store LaTeX contents in .lyx files
|
2015-03-01 10:16:57 +00:00
|
|
|
# (math and command insets withut overridden read() and write() methods
|
2015-02-24 20:58:27 +00:00
|
|
|
# filtering out IPA makes Text::readParToken() more simple
|
|
|
|
# skip ERT as well since it is not needed there
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of " + words[1] + " inset at line " + str(i))
|
|
|
|
i += 1
|
|
|
|
else:
|
|
|
|
i = j
|
|
|
|
continue
|
|
|
|
while True:
|
|
|
|
j = document.body[i].find("--")
|
|
|
|
if j == -1:
|
|
|
|
break
|
|
|
|
front = document.body[i][:j]
|
|
|
|
back = document.body[i][j+2:]
|
|
|
|
# We can have an arbitrary number of consecutive hyphens.
|
|
|
|
# These must be split into the corresponding number of two and three hyphens
|
|
|
|
# We must match what LaTeX does: First try emdash, then endash, then single hyphen
|
|
|
|
if back.find("-") == 0:
|
|
|
|
back = back[1:]
|
|
|
|
if len(back) > 0:
|
|
|
|
document.body.insert(i+1, back)
|
|
|
|
document.body[i] = front + "\\threehyphens"
|
|
|
|
else:
|
|
|
|
if len(back) > 0:
|
|
|
|
document.body.insert(i+1, back)
|
|
|
|
document.body[i] = front + "\\twohyphens"
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_dashes(document):
|
|
|
|
"convert \\twohyphens and \\threehyphens to -- and ---"
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while i < len(document.body):
|
2015-02-26 19:34:36 +00:00
|
|
|
words = document.body[i].split()
|
|
|
|
if len(words) > 1 and words[0] == "\\begin_inset" and \
|
2015-03-01 21:16:45 +00:00
|
|
|
words[1] in ["CommandInset", "ERT", "External", "Formula", "Graphics", "IPA", "listings"]:
|
2015-02-26 19:34:36 +00:00
|
|
|
# see convert_dashes
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of " + words[1] + " inset at line " + str(i))
|
|
|
|
i += 1
|
|
|
|
else:
|
|
|
|
i = j
|
|
|
|
continue
|
2015-02-24 20:58:27 +00:00
|
|
|
replaced = False
|
|
|
|
if document.body[i].find("\\twohyphens") >= 0:
|
|
|
|
document.body[i] = document.body[i].replace("\\twohyphens", "--")
|
|
|
|
replaced = True
|
|
|
|
if document.body[i].find("\\threehyphens") >= 0:
|
|
|
|
document.body[i] = document.body[i].replace("\\threehyphens", "---")
|
|
|
|
replaced = True
|
|
|
|
if replaced and i+1 < len(document.body) and \
|
|
|
|
(document.body[i+1].find("\\") != 0 or \
|
|
|
|
document.body[i+1].find("\\twohyphens") == 0 or
|
|
|
|
document.body[i+1].find("\\threehyphens") == 0) and \
|
|
|
|
len(document.body[i]) + len(document.body[i+1]) <= 80:
|
|
|
|
document.body[i] = document.body[i] + document.body[i+1]
|
|
|
|
document.body[i+1:i+2] = []
|
|
|
|
else:
|
|
|
|
i += 1
|
|
|
|
|
2015-04-12 08:07:42 +00:00
|
|
|
|
2015-03-01 10:16:57 +00:00
|
|
|
# order is important for the last three!
|
|
|
|
phrases = ["LyX", "LaTeX2e", "LaTeX", "TeX"]
|
|
|
|
|
|
|
|
def is_part_of_converted_phrase(line, j, phrase):
|
|
|
|
"is phrase part of an already converted phrase?"
|
|
|
|
for p in phrases:
|
|
|
|
converted = "\\SpecialCharNoPassThru \\" + p
|
|
|
|
pos = j + len(phrase) - len(converted)
|
|
|
|
if pos >= 0:
|
|
|
|
if line[pos:pos+len(converted)] == converted:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def convert_phrases(document):
|
|
|
|
"convert special phrases from plain text to \\SpecialCharNoPassThru"
|
|
|
|
|
|
|
|
if document.backend != "latex":
|
|
|
|
return
|
|
|
|
|
|
|
|
for phrase in phrases:
|
|
|
|
i = 0
|
|
|
|
while i < len(document.body):
|
|
|
|
words = document.body[i].split()
|
|
|
|
if len(words) > 1 and words[0] == "\\begin_inset" and \
|
2015-03-01 21:16:45 +00:00
|
|
|
words[1] in ["CommandInset", "External", "Formula", "Graphics", "listings"]:
|
2015-03-01 10:16:57 +00:00
|
|
|
# must not replace anything in insets that store LaTeX contents in .lyx files
|
|
|
|
# (math and command insets withut overridden read() and write() methods
|
|
|
|
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
|
|
|
|
else:
|
|
|
|
i = j
|
|
|
|
continue
|
|
|
|
if document.body[i].find("\\") == 0:
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
j = document.body[i].find(phrase)
|
|
|
|
if j == -1:
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
if not is_part_of_converted_phrase(document.body[i], j, phrase):
|
|
|
|
front = document.body[i][:j]
|
|
|
|
back = document.body[i][j+len(phrase):]
|
|
|
|
if len(back) > 0:
|
|
|
|
document.body.insert(i+1, back)
|
2015-04-12 08:07:42 +00:00
|
|
|
# We cannot use SpecialChar since we do not know whether we are outside passThru
|
2015-03-01 10:16:57 +00:00
|
|
|
document.body[i] = front + "\\SpecialCharNoPassThru \\" + phrase
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_phrases(document):
|
|
|
|
"convert special phrases to plain text"
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while i < len(document.body):
|
2015-03-02 19:57:26 +00:00
|
|
|
words = document.body[i].split()
|
2015-03-01 10:16:57 +00:00
|
|
|
if len(words) > 1 and words[0] == "\\begin_inset" and \
|
2015-03-01 21:16:45 +00:00
|
|
|
words[1] in ["CommandInset", "External", "Formula", "Graphics", "listings"]:
|
2015-03-01 10:16:57 +00:00
|
|
|
# see convert_phrases
|
|
|
|
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
|
|
|
|
else:
|
|
|
|
i = j
|
|
|
|
continue
|
|
|
|
replaced = False
|
|
|
|
for phrase in phrases:
|
|
|
|
# we can replace SpecialChar since LyX ensures that it cannot be inserted into passThru parts
|
|
|
|
if document.body[i].find("\\SpecialChar \\" + phrase) >= 0:
|
|
|
|
document.body[i] = document.body[i].replace("\\SpecialChar \\" + phrase, phrase)
|
|
|
|
replaced = True
|
|
|
|
if document.body[i].find("\\SpecialCharNoPassThru \\" + phrase) >= 0:
|
|
|
|
document.body[i] = document.body[i].replace("\\SpecialCharNoPassThru \\" + phrase, phrase)
|
|
|
|
replaced = True
|
|
|
|
if replaced and i+1 < len(document.body) and \
|
|
|
|
(document.body[i+1].find("\\") != 0 or \
|
|
|
|
document.body[i+1].find("\\SpecialChar") == 0) and \
|
|
|
|
len(document.body[i]) + len(document.body[i+1]) <= 80:
|
|
|
|
document.body[i] = document.body[i] + document.body[i+1]
|
|
|
|
document.body[i+1:i+2] = []
|
|
|
|
i -= 1
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
2015-03-23 20:28:04 +00:00
|
|
|
def convert_specialchar_internal(document, forward):
|
|
|
|
specialchars = {"\\-":"softhyphen", "\\textcompwordmark{}":"ligaturebreak", \
|
|
|
|
"\\@.":"endofsentence", "\\ldots{}":"ldots", \
|
|
|
|
"\\menuseparator":"menuseparator", "\\slash{}":"breakableslash", \
|
|
|
|
"\\nobreakdash-":"nobreakdash", "\\LyX":"LyX", \
|
|
|
|
"\\TeX":"TeX", "\\LaTeX2e":"LaTeX2e", \
|
|
|
|
"\\LaTeX":"LaTeX" # must be after LaTeX2e
|
|
|
|
}
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while i < len(document.body):
|
|
|
|
words = document.body[i].split()
|
|
|
|
if len(words) > 1 and words[0] == "\\begin_inset" and \
|
|
|
|
words[1] in ["CommandInset", "External", "Formula", "Graphics", "listings"]:
|
|
|
|
# see convert_phrases
|
|
|
|
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
|
|
|
|
else:
|
|
|
|
i = j
|
|
|
|
continue
|
|
|
|
for key, value in specialchars.iteritems():
|
|
|
|
if forward:
|
|
|
|
document.body[i] = document.body[i].replace("\\SpecialChar " + key, "\\SpecialChar " + value)
|
|
|
|
document.body[i] = document.body[i].replace("\\SpecialCharNoPassThru " + key, "\\SpecialCharNoPassThru " + value)
|
|
|
|
else:
|
|
|
|
document.body[i] = document.body[i].replace("\\SpecialChar " + value, "\\SpecialChar " + key)
|
|
|
|
document.body[i] = document.body[i].replace("\\SpecialCharNoPassThru " + value, "\\SpecialCharNoPassThru " + key)
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
|
|
|
def convert_specialchar(document):
|
|
|
|
"convert special characters to new syntax"
|
|
|
|
convert_specialchar_internal(document, True)
|
|
|
|
|
|
|
|
|
|
|
|
def revert_specialchar(document):
|
|
|
|
"convert special characters to old syntax"
|
|
|
|
convert_specialchar_internal(document, False)
|
|
|
|
|
2015-04-12 08:07:42 +00:00
|
|
|
|
2015-04-06 04:00:11 +00:00
|
|
|
def revert_georgian(document):
|
2015-05-03 00:16:32 +00:00
|
|
|
"Set the document language to English but assure Georgian output"
|
2015-03-23 20:28:04 +00:00
|
|
|
|
2015-04-06 04:00:11 +00:00
|
|
|
if document.language == "georgian":
|
|
|
|
document.language = "english"
|
|
|
|
i = find_token(document.header, "\\language georgian", 0)
|
|
|
|
if i != -1:
|
|
|
|
document.header[i] = "\\language english"
|
|
|
|
j = find_token(document.header, "\\language_package default", 0)
|
|
|
|
if j != -1:
|
|
|
|
document.header[j] = "\\language_package babel"
|
|
|
|
k = find_token(document.header, "\\options", 0)
|
|
|
|
if k != -1:
|
|
|
|
document.header[k] = document.header[k].replace("\\options", "\\options georgian,")
|
|
|
|
else:
|
|
|
|
l = find_token(document.header, "\\use_default_options", 0)
|
|
|
|
document.header.insert(l + 1, "\\options georgian")
|
2015-04-09 09:01:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
def revert_sigplan_doi(document):
|
|
|
|
" Reverts sigplanconf DOI layout to ERT "
|
|
|
|
|
|
|
|
if document.textclass != "sigplanconf":
|
|
|
|
return
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_layout DOI", 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 DOI layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\doi{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# no need to reset i
|
|
|
|
|
2015-03-23 20:28:04 +00:00
|
|
|
|
2015-04-20 10:15:20 +00:00
|
|
|
def revert_ex_itemargs(document):
|
|
|
|
" Reverts \\item arguments of the example environments (Linguistics module) to TeX-code "
|
|
|
|
|
2015-11-29 04:58:50 +00:00
|
|
|
if not "linguistics" in document.get_module_list():
|
2015-04-20 10:15:20 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
example_layouts = ["Numbered Examples (consecutive)", "Subexample"]
|
|
|
|
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 += 1
|
|
|
|
continue
|
|
|
|
parbeg = parent[3]
|
|
|
|
layoutname = parent[0]
|
|
|
|
if layoutname in example_layouts:
|
|
|
|
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 : parbeg] = subst
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
2015-04-20 16:14:42 +00:00
|
|
|
def revert_forest(document):
|
|
|
|
" Reverts the forest environment (Linguistics module) to TeX-code "
|
|
|
|
|
2015-11-29 04:58:50 +00:00
|
|
|
if not "linguistics" in document.get_module_list():
|
2015-04-20 16:14:42 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_inset Flex Structure Tree", 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 Structure Tree inset")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i)
|
|
|
|
endPlain = find_end_of_layout(document.body, beginPlain)
|
|
|
|
content = lyx2latex(document, document.body[beginPlain : endPlain])
|
|
|
|
|
|
|
|
add_to_preamble(document, ["\\usepackage{forest}"])
|
|
|
|
|
|
|
|
document.body[i:j + 1] = ["\\begin_inset ERT", "status collapsed", "",
|
|
|
|
"\\begin_layout Plain Layout", "", "\\backslash",
|
|
|
|
"begin{forest}", "\\end_layout", "", "\\begin_layout Plain Layout",
|
|
|
|
content, "\\end_layout", "", "\\begin_layout Plain Layout",
|
|
|
|
"\\backslash", "end{forest}", "", "\\end_layout", "", "\\end_inset"]
|
|
|
|
# no need to reset i
|
|
|
|
|
|
|
|
|
2015-04-21 18:33:35 +00:00
|
|
|
def revert_glossgroup(document):
|
|
|
|
" Reverts the GroupGlossedWords inset (Linguistics module) to TeX-code "
|
|
|
|
|
2015-11-29 04:58:50 +00:00
|
|
|
if not "linguistics" in document.get_module_list():
|
2015-04-21 18:33:35 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_inset Flex GroupGlossedWords", 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 GroupGlossedWords inset")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i)
|
|
|
|
endPlain = find_end_of_layout(document.body, beginPlain)
|
|
|
|
content = lyx2latex(document, document.body[beginPlain : endPlain])
|
|
|
|
|
|
|
|
document.body[i:j + 1] = ["{", "", content, "", "}"]
|
|
|
|
# no need to reset i
|
|
|
|
|
|
|
|
|
|
|
|
def revert_newgloss(document):
|
|
|
|
" Reverts the new Glosse insets (Linguistics module) to the old format "
|
|
|
|
|
2015-11-29 04:58:50 +00:00
|
|
|
if not "linguistics" in document.get_module_list():
|
2015-04-21 18:33:35 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
glosses = ("\\begin_inset Flex Glosse", "\\begin_inset Flex Tri-Glosse")
|
|
|
|
for glosse in glosses:
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, glosse, i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of Glosse inset")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
arg = find_token(document.body, "\\begin_inset Argument 1", i, j)
|
|
|
|
endarg = find_end_of_inset(document.body, arg)
|
|
|
|
argcontent = ""
|
|
|
|
if arg != -1:
|
|
|
|
argbeginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg, endarg)
|
|
|
|
if argbeginPlain == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find arg plain Layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
argendPlain = find_end_of_inset(document.body, argbeginPlain)
|
|
|
|
argcontent = lyx2latex(document, document.body[argbeginPlain : argendPlain - 2])
|
|
|
|
|
|
|
|
document.body[j:j] = ["", "\\begin_layout Plain Layout","\\backslash", "glt ",
|
|
|
|
argcontent, "\\end_layout"]
|
|
|
|
|
|
|
|
# remove Arg insets and paragraph, if it only contains this inset
|
|
|
|
if document.body[arg - 1] == "\\begin_layout Plain Layout" and find_end_of_layout(document.body, arg - 1) == endarg + 3:
|
|
|
|
del document.body[arg - 1 : endarg + 4]
|
|
|
|
else:
|
|
|
|
del document.body[arg : endarg + 1]
|
|
|
|
|
|
|
|
beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i)
|
|
|
|
endPlain = find_end_of_layout(document.body, beginPlain)
|
|
|
|
content = lyx2latex(document, document.body[beginPlain : endPlain])
|
|
|
|
|
|
|
|
document.body[beginPlain + 1:endPlain] = [content]
|
|
|
|
i = beginPlain + 1
|
|
|
|
|
|
|
|
|
|
|
|
def convert_newgloss(document):
|
|
|
|
" Converts Glosse insets (Linguistics module) to the new format "
|
|
|
|
|
2015-11-29 04:58:50 +00:00
|
|
|
if not "linguistics" in document.get_module_list():
|
2015-04-21 18:33:35 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
glosses = ("\\begin_inset Flex Glosse", "\\begin_inset Flex Tri-Glosse")
|
|
|
|
for glosse in glosses:
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, glosse, i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of Glosse inset")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
k = i
|
|
|
|
while True:
|
|
|
|
argcontent = []
|
|
|
|
beginPlain = find_token(document.body, "\\begin_layout Plain Layout", k, j)
|
|
|
|
if beginPlain == -1:
|
|
|
|
break
|
|
|
|
endPlain = find_end_of_layout(document.body, beginPlain)
|
|
|
|
if endPlain == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of Glosse layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
glt = find_token(document.body, "\\backslash", beginPlain, endPlain)
|
|
|
|
if glt != -1 and document.body[glt + 1].startswith("glt"):
|
|
|
|
document.body[glt + 1] = document.body[glt + 1].lstrip("glt").lstrip()
|
|
|
|
argcontent = document.body[glt + 1 : endPlain]
|
|
|
|
document.body[beginPlain + 1 : endPlain] = ["\\begin_inset Argument 1", "status open", "",
|
|
|
|
"\\begin_layout Plain Layout", "\\begin_inset ERT", "status open", "",
|
|
|
|
"\\begin_layout Plain Layout", ""] + argcontent + ["\\end_layout", "", "\\end_inset", "",
|
|
|
|
"\\end_layout", "", "\\end_inset"]
|
|
|
|
else:
|
|
|
|
content = document.body[beginPlain + 1 : endPlain]
|
|
|
|
document.body[beginPlain + 1 : endPlain] = ["\\begin_inset ERT", "status open", "",
|
|
|
|
"\\begin_layout Plain Layout"] + content + ["\\end_layout", "", "\\end_inset"]
|
|
|
|
|
|
|
|
endPlain = find_end_of_layout(document.body, beginPlain)
|
|
|
|
k = endPlain
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
|
|
|
|
i = endPlain + 1
|
|
|
|
|
|
|
|
|
2015-05-11 19:30:32 +00:00
|
|
|
def convert_BoxFeatures(document):
|
|
|
|
" adds new box features "
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "height_special", i)
|
|
|
|
if i == -1:
|
|
|
|
return
|
2015-05-18 20:36:29 +00:00
|
|
|
document.body[i+1:i+1] = ['thickness "0.4pt"', 'separation "3pt"', 'shadowsize "4pt"']
|
|
|
|
i = i + 4
|
2015-05-11 19:30:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
def revert_BoxFeatures(document):
|
2015-05-15 01:41:43 +00:00
|
|
|
" outputs new box features as TeX code "
|
2015-05-11 19:30:32 +00:00
|
|
|
|
|
|
|
i = 0
|
|
|
|
defaultSep = "3pt"
|
|
|
|
defaultThick = "0.4pt"
|
|
|
|
defaultShadow = "4pt"
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "height_special", i)
|
|
|
|
if i == -1:
|
|
|
|
return
|
|
|
|
# read out the values
|
|
|
|
beg = document.body[i+1].find('"');
|
|
|
|
end = document.body[i+1].rfind('"');
|
|
|
|
thickness = document.body[i+1][beg+1:end];
|
|
|
|
beg = document.body[i+2].find('"');
|
|
|
|
end = document.body[i+2].rfind('"');
|
|
|
|
separation = document.body[i+2][beg+1:end];
|
|
|
|
beg = document.body[i+3].find('"');
|
|
|
|
end = document.body[i+3].rfind('"');
|
|
|
|
shadowsize = document.body[i+3][beg+1:end];
|
|
|
|
# delete the specification
|
|
|
|
del document.body[i+1:i+4]
|
|
|
|
# output ERT
|
2015-05-14 20:23:44 +00:00
|
|
|
# first output the closing brace
|
2015-05-11 19:30:32 +00:00
|
|
|
if shadowsize != defaultShadow or separation != defaultSep or thickness != defaultThick:
|
|
|
|
document.body[i + 10 : i + 10] = put_cmd_in_ert("}")
|
|
|
|
# now output the lengths
|
|
|
|
if shadowsize != defaultShadow or separation != defaultSep or thickness != defaultThick:
|
|
|
|
document.body[i - 10 : i - 10] = put_cmd_in_ert("{")
|
|
|
|
if thickness != defaultThick:
|
|
|
|
document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness]
|
|
|
|
if separation != defaultSep and thickness == defaultThick:
|
|
|
|
document.body[i - 5 : i - 4] = ["{\\backslash fboxsep " + separation]
|
|
|
|
if separation != defaultSep and thickness != defaultThick:
|
|
|
|
document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness + "\\backslash fboxsep " + separation]
|
|
|
|
if shadowsize != defaultShadow and separation == defaultSep and thickness == defaultThick:
|
|
|
|
document.body[i - 5 : i - 4] = ["{\\backslash shadowsize " + shadowsize]
|
|
|
|
if shadowsize != defaultShadow and separation != defaultSep and thickness == defaultThick:
|
|
|
|
document.body[i - 5 : i - 4] = ["{\\backslash fboxsep " + separation + "\\backslash shadowsize " + shadowsize]
|
|
|
|
if shadowsize != defaultShadow and separation == defaultSep and thickness != defaultThick:
|
|
|
|
document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness + "\\backslash shadowsize " + shadowsize]
|
|
|
|
if shadowsize != defaultShadow and separation != defaultSep and thickness != defaultThick:
|
|
|
|
document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness + "\\backslash fboxsep " + separation + "\\backslash shadowsize " + shadowsize]
|
|
|
|
i = i + 11
|
|
|
|
|
|
|
|
|
Fix bug #4812 (Layout in local directory lost on Save As, Copying)
The "save-as" part of the bug is fixed by extending the \textclass tag
such that, if a local layout file is used, its path relative to the
document directory is now stored together with the name. If a relative
path cannot be used, an absolute one is used but, in this case, the
document is not usable on a different platform.
The "copy" part is fixed by introducing a new \origin tag, which is
written when the file is saved. This tag stores the absolute path of
the document directory. If the document is manually copied to a
different location, the local layout file is retrivied by using
\origin (which is only updated on save).
This new tag may prove useful also for locating other files when the
document is manually moved to a different directory.
As in the original implementation the files needed for the layout
(for example, a latex class) had to be in the same directory as the
layout file, this directory has also to be added to TEXINPUTS.
2015-05-13 19:40:51 +00:00
|
|
|
def convert_origin(document):
|
|
|
|
" Insert the origin tag "
|
|
|
|
|
|
|
|
i = find_token(document.header, "\\textclass ", 0)
|
|
|
|
if i == -1:
|
|
|
|
document.warning("Malformed LyX document: No \\textclass!!")
|
2015-11-29 04:55:00 +00:00
|
|
|
return
|
Fix bug #4812 (Layout in local directory lost on Save As, Copying)
The "save-as" part of the bug is fixed by extending the \textclass tag
such that, if a local layout file is used, its path relative to the
document directory is now stored together with the name. If a relative
path cannot be used, an absolute one is used but, in this case, the
document is not usable on a different platform.
The "copy" part is fixed by introducing a new \origin tag, which is
written when the file is saved. This tag stores the absolute path of
the document directory. If the document is manually copied to a
different location, the local layout file is retrivied by using
\origin (which is only updated on save).
This new tag may prove useful also for locating other files when the
document is manually moved to a different directory.
As in the original implementation the files needed for the layout
(for example, a latex class) had to be in the same directory as the
layout file, this directory has also to be added to TEXINPUTS.
2015-05-13 19:40:51 +00:00
|
|
|
if document.dir == "":
|
|
|
|
origin = "stdin"
|
|
|
|
else:
|
2015-11-11 20:35:12 +00:00
|
|
|
relpath = ''
|
|
|
|
if document.systemlyxdir and document.systemlyxdir != '':
|
|
|
|
try:
|
|
|
|
if os.path.isabs(document.dir):
|
|
|
|
absdir = os.path.normpath(document.dir)
|
|
|
|
else:
|
|
|
|
absdir = os.path.normpath(os.path.abspath(document.dir))
|
|
|
|
if os.path.isabs(document.systemlyxdir):
|
|
|
|
abssys = os.path.normpath(document.systemlyxdir)
|
|
|
|
else:
|
|
|
|
abssys = os.path.normpath(os.path.abspath(document.systemlyxdir))
|
|
|
|
relpath = os.path.relpath(absdir, abssys)
|
|
|
|
if relpath.find('..') == 0:
|
|
|
|
relpath = ''
|
|
|
|
except:
|
|
|
|
relpath = ''
|
|
|
|
if relpath == '':
|
|
|
|
origin = document.dir.replace('\\', '/') + '/'
|
|
|
|
else:
|
|
|
|
origin = os.path.join("/systemlyxdir", relpath).replace('\\', '/') + '/'
|
2015-05-17 16:02:47 +00:00
|
|
|
if os.name != 'nt':
|
|
|
|
origin = unicode(origin, sys.getfilesystemencoding())
|
Fix bug #4812 (Layout in local directory lost on Save As, Copying)
The "save-as" part of the bug is fixed by extending the \textclass tag
such that, if a local layout file is used, its path relative to the
document directory is now stored together with the name. If a relative
path cannot be used, an absolute one is used but, in this case, the
document is not usable on a different platform.
The "copy" part is fixed by introducing a new \origin tag, which is
written when the file is saved. This tag stores the absolute path of
the document directory. If the document is manually copied to a
different location, the local layout file is retrivied by using
\origin (which is only updated on save).
This new tag may prove useful also for locating other files when the
document is manually moved to a different directory.
As in the original implementation the files needed for the layout
(for example, a latex class) had to be in the same directory as the
layout file, this directory has also to be added to TEXINPUTS.
2015-05-13 19:40:51 +00:00
|
|
|
document.header[i:i] = ["\\origin " + origin]
|
|
|
|
|
|
|
|
|
|
|
|
def revert_origin(document):
|
|
|
|
" Remove the origin tag "
|
|
|
|
|
|
|
|
i = find_token(document.header, "\\origin ", 0)
|
|
|
|
if i == -1:
|
|
|
|
document.warning("Malformed LyX document: No \\origin!!")
|
2015-11-29 04:55:00 +00:00
|
|
|
return
|
Fix bug #4812 (Layout in local directory lost on Save As, Copying)
The "save-as" part of the bug is fixed by extending the \textclass tag
such that, if a local layout file is used, its path relative to the
document directory is now stored together with the name. If a relative
path cannot be used, an absolute one is used but, in this case, the
document is not usable on a different platform.
The "copy" part is fixed by introducing a new \origin tag, which is
written when the file is saved. This tag stores the absolute path of
the document directory. If the document is manually copied to a
different location, the local layout file is retrivied by using
\origin (which is only updated on save).
This new tag may prove useful also for locating other files when the
document is manually moved to a different directory.
As in the original implementation the files needed for the layout
(for example, a latex class) had to be in the same directory as the
layout file, this directory has also to be added to TEXINPUTS.
2015-05-13 19:40:51 +00:00
|
|
|
del document.header[i]
|
|
|
|
|
|
|
|
|
2015-05-14 20:23:44 +00:00
|
|
|
color_names = ["brown", "darkgray", "gray", \
|
|
|
|
"lightgray", "lime", "olive", "orange", \
|
|
|
|
"pink", "purple", "teal", "violet"]
|
|
|
|
|
|
|
|
def revert_textcolor(document):
|
2015-06-14 00:15:30 +00:00
|
|
|
" revert new \\textcolor colors to TeX code "
|
2015-05-14 20:23:44 +00:00
|
|
|
|
|
|
|
i = 0
|
|
|
|
j = 0
|
|
|
|
xcolor = False
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\color ", i)
|
|
|
|
if i == -1:
|
|
|
|
return
|
|
|
|
else:
|
|
|
|
for color in list(color_names):
|
|
|
|
if document.body[i] == "\\color " + color:
|
|
|
|
# register that xcolor must be loaded in the preamble
|
|
|
|
if xcolor == False:
|
|
|
|
xcolor = True
|
2015-06-13 10:48:36 +00:00
|
|
|
add_to_preamble(document, ["\\@ifundefined{rangeHsb}{\usepackage{xcolor}}{}"])
|
2015-05-14 20:23:44 +00:00
|
|
|
# find the next \\color and/or the next \\end_layout
|
|
|
|
j = find_token(document.body, "\\color", i + 1)
|
|
|
|
k = find_token(document.body, "\\end_layout", i + 1)
|
|
|
|
if j == -1 and k != -1:
|
|
|
|
j = k +1
|
|
|
|
# output TeX code
|
|
|
|
# first output the closing brace
|
|
|
|
if k < j:
|
|
|
|
document.body[k: k] = put_cmd_in_ert("}")
|
|
|
|
else:
|
|
|
|
document.body[j: j] = put_cmd_in_ert("}")
|
|
|
|
# now output the \textcolor command
|
|
|
|
document.body[i : i + 1] = put_cmd_in_ert("\\textcolor{" + color + "}{")
|
|
|
|
i = i + 1
|
|
|
|
|
|
|
|
|
2015-05-16 01:22:37 +00:00
|
|
|
def convert_colorbox(document):
|
|
|
|
" adds color settings for boxes "
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while True:
|
2015-05-18 20:36:29 +00:00
|
|
|
i = find_token(document.body, "shadowsize", i)
|
2015-05-16 01:22:37 +00:00
|
|
|
if i == -1:
|
|
|
|
return
|
2015-05-18 20:36:29 +00:00
|
|
|
document.body[i+1:i+1] = ['framecolor "black"', 'backgroundcolor "none"']
|
|
|
|
i = i + 3
|
2015-05-16 01:22:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
def revert_colorbox(document):
|
|
|
|
" outputs color settings for boxes as TeX code "
|
|
|
|
|
2015-06-02 01:52:02 +00:00
|
|
|
binset = 0
|
2015-05-16 01:22:37 +00:00
|
|
|
defaultframecolor = "black"
|
2015-06-01 18:57:45 +00:00
|
|
|
defaultbackcolor = "none"
|
2015-05-16 01:22:37 +00:00
|
|
|
while True:
|
2015-06-02 01:52:02 +00:00
|
|
|
binset = find_token(document.body, "\\begin_inset Box", binset)
|
|
|
|
if binset == -1:
|
2015-05-16 01:22:37 +00:00
|
|
|
return
|
2015-06-02 01:52:02 +00:00
|
|
|
|
|
|
|
einset = find_end_of_inset(document.body, binset)
|
|
|
|
if einset == -1:
|
2015-06-01 19:19:11 +00:00
|
|
|
document.warning("Malformed LyX document: Can't find end of box inset!")
|
2015-06-02 01:52:02 +00:00
|
|
|
binset += 1
|
2015-06-01 19:19:11 +00:00
|
|
|
continue
|
2015-06-02 01:52:02 +00:00
|
|
|
|
|
|
|
blay = find_token(document.body, "\\begin_layout", binset, einset)
|
|
|
|
if blay == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find start of layout!")
|
|
|
|
binset = einset
|
|
|
|
continue
|
|
|
|
|
|
|
|
# doing it this way, we make sure only to find a framecolor option
|
|
|
|
frame = find_token(document.body, "framecolor", binset, blay)
|
|
|
|
if frame == -1:
|
|
|
|
binset = einset
|
|
|
|
continue
|
|
|
|
|
|
|
|
beg = document.body[frame].find('"')
|
|
|
|
end = document.body[frame].rfind('"')
|
2015-11-04 00:36:39 +00:00
|
|
|
framecolor = document.body[frame][beg + 1 : end]
|
2015-06-02 01:52:02 +00:00
|
|
|
|
|
|
|
# this should be on the next line
|
|
|
|
bgcolor = frame + 1
|
|
|
|
beg = document.body[bgcolor].find('"')
|
|
|
|
end = document.body[bgcolor].rfind('"')
|
2015-11-04 00:36:39 +00:00
|
|
|
backcolor = document.body[bgcolor][beg + 1 : end]
|
2015-06-02 01:52:02 +00:00
|
|
|
|
|
|
|
# delete those bits
|
2015-11-04 00:36:39 +00:00
|
|
|
del document.body[frame : frame + 2]
|
2015-06-02 01:52:02 +00:00
|
|
|
# adjust end of inset
|
|
|
|
einset -= 2
|
|
|
|
|
|
|
|
if document.body[binset] == "\\begin_inset Box Boxed" and \
|
|
|
|
framecolor != defaultframecolor:
|
|
|
|
document.body[binset] = "\\begin_inset Box Frameless"
|
|
|
|
|
2015-05-16 01:22:37 +00:00
|
|
|
# output TeX code
|
|
|
|
# first output the closing brace
|
2015-06-02 01:52:02 +00:00
|
|
|
if framecolor == defaultframecolor and backcolor == defaultbackcolor:
|
|
|
|
# nothing needed
|
|
|
|
pass
|
|
|
|
else:
|
2015-11-04 00:36:39 +00:00
|
|
|
# we also neeed to load xcolor in the preamble but only once
|
|
|
|
add_to_preamble(document, ["\\@ifundefined{rangeHsb}{\usepackage{xcolor}}{}"])
|
2015-06-02 01:52:02 +00:00
|
|
|
document.body[einset + 1 : einset + 1] = put_cmd_in_ert("}")
|
|
|
|
if framecolor != defaultframecolor:
|
2015-11-04 00:36:39 +00:00
|
|
|
document.body[binset:binset] = put_cmd_in_ert("\\fcolorbox{" + framecolor + "}{" + backcolor + "}{")
|
2015-06-02 01:52:02 +00:00
|
|
|
else:
|
2015-11-04 00:36:39 +00:00
|
|
|
document.body[binset:binset] = put_cmd_in_ert("\\colorbox{" + backcolor + "}{")
|
2015-06-02 01:52:02 +00:00
|
|
|
|
|
|
|
binset = einset
|
2015-05-16 01:22:37 +00:00
|
|
|
|
|
|
|
|
2015-05-17 11:43:37 +00:00
|
|
|
def revert_mathmulticol(document):
|
|
|
|
" Convert formulas to ERT if they contain multicolumns "
|
|
|
|
|
|
|
|
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
|
|
|
|
lines = document.body[i:j]
|
|
|
|
lines[0] = lines[0].replace('\\begin_inset Formula', '').lstrip()
|
|
|
|
code = "\n".join(lines)
|
2015-05-17 14:39:14 +00:00
|
|
|
converted = False
|
|
|
|
k = 0
|
|
|
|
n = 0
|
|
|
|
while n >= 0:
|
|
|
|
n = code.find("\\multicolumn", k)
|
|
|
|
# no need to convert degenerated multicolumn cells,
|
|
|
|
# they work in old LyX versions as "math ERT"
|
|
|
|
if n != -1 and code.find("\\multicolumn{1}", k) != n:
|
|
|
|
ert = put_cmd_in_ert(code)
|
|
|
|
document.body[i:j+1] = ert
|
|
|
|
converted = True
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
k = n + 12
|
|
|
|
if converted:
|
2015-05-17 11:43:37 +00:00
|
|
|
i = find_end_of_inset(document.body, i)
|
|
|
|
else:
|
|
|
|
i = j
|
|
|
|
|
|
|
|
|
2015-05-24 01:34:36 +00:00
|
|
|
def revert_jss(document):
|
|
|
|
" Reverts JSS In_Preamble commands to ERT in preamble "
|
|
|
|
|
|
|
|
if document.textclass != "jss":
|
|
|
|
return
|
|
|
|
|
|
|
|
h = 0
|
|
|
|
m = 0
|
|
|
|
j = 0
|
|
|
|
k = 0
|
|
|
|
n = 0
|
|
|
|
while True:
|
|
|
|
# at first revert the inset layouts because they can be part of the In_Preamble layouts
|
|
|
|
while m != -1 or j != -1 or h != -1 or k != -1 or n != -1:
|
|
|
|
# \pkg
|
|
|
|
if h != -1:
|
2015-05-27 21:31:21 +00:00
|
|
|
h = find_token(document.body, "\\begin_inset Flex Pkg", h)
|
2015-05-24 01:34:36 +00:00
|
|
|
if h != -1:
|
|
|
|
endh = find_end_of_inset(document.body, h)
|
|
|
|
document.body[endh - 2 : endh + 1] = put_cmd_in_ert("}")
|
|
|
|
document.body[h : h + 4] = put_cmd_in_ert("\\pkg{")
|
|
|
|
h = h + 5
|
|
|
|
# \proglang
|
|
|
|
if m != -1:
|
2015-05-27 21:31:21 +00:00
|
|
|
m = find_token(document.body, "\\begin_inset Flex Proglang", m)
|
2015-05-24 01:34:36 +00:00
|
|
|
if m != -1:
|
|
|
|
endm = find_end_of_inset(document.body, m)
|
|
|
|
document.body[endm - 2 : endm + 1] = put_cmd_in_ert("}")
|
|
|
|
document.body[m : m + 4] = put_cmd_in_ert("\\proglang{")
|
|
|
|
m = m + 5
|
|
|
|
# \code
|
|
|
|
if j != -1:
|
2015-05-27 21:31:21 +00:00
|
|
|
j = find_token(document.body, "\\begin_inset Flex Code", j)
|
2015-05-24 01:34:36 +00:00
|
|
|
if j != -1:
|
2015-05-27 21:31:21 +00:00
|
|
|
# assure that we are not in a Code Chunk inset
|
|
|
|
if document.body[j][-1] == "e":
|
|
|
|
endj = find_end_of_inset(document.body, j)
|
|
|
|
document.body[endj - 2 : endj + 1] = put_cmd_in_ert("}")
|
|
|
|
document.body[j : j + 4] = put_cmd_in_ert("\\code{")
|
|
|
|
j = j + 5
|
|
|
|
else:
|
|
|
|
j = j + 1
|
2015-05-24 01:34:36 +00:00
|
|
|
# \email
|
|
|
|
if k != -1:
|
|
|
|
k = find_token(document.body, "\\begin_inset Flex E-mail", k)
|
|
|
|
if k != -1:
|
|
|
|
endk = find_end_of_inset(document.body, k)
|
|
|
|
document.body[endk - 2 : endk + 1] = put_cmd_in_ert("}")
|
|
|
|
document.body[k : k + 4] = put_cmd_in_ert("\\email{")
|
|
|
|
k = k + 5
|
|
|
|
# \url
|
|
|
|
if n != -1:
|
|
|
|
n = find_token(document.body, "\\begin_inset Flex URL", n)
|
|
|
|
if n != -1:
|
|
|
|
endn = find_end_of_inset(document.body, n)
|
|
|
|
document.body[endn - 2 : endn + 1] = put_cmd_in_ert("}")
|
|
|
|
document.body[n : n + 4] = put_cmd_in_ert("\\url{")
|
|
|
|
n = n + 5
|
|
|
|
# now revert the In_Preamble layouts
|
|
|
|
# \title
|
|
|
|
i = find_token(document.body, "\\begin_layout Title", 0)
|
|
|
|
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 Title layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\title{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# \author
|
|
|
|
i = find_token(document.body, "\\begin_layout Author", 0)
|
|
|
|
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 Author layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\author{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# \Plainauthor
|
|
|
|
i = find_token(document.body, "\\begin_layout Plain Author", 0)
|
|
|
|
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 Plain Author layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\Plainauthor{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# \Plaintitle
|
|
|
|
i = find_token(document.body, "\\begin_layout Plain Title", 0)
|
|
|
|
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 Plain Title layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\Plaintitle{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# \Shorttitle
|
|
|
|
i = find_token(document.body, "\\begin_layout Short Title", 0)
|
|
|
|
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 Short Title layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\Shorttitle{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# \Abstract
|
|
|
|
i = find_token(document.body, "\\begin_layout Abstract", 0)
|
|
|
|
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 Abstract layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\Abstract{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# \Keywords
|
|
|
|
i = find_token(document.body, "\\begin_layout Keywords", 0)
|
|
|
|
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 Keywords layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\Keywords{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# \Plainkeywords
|
|
|
|
i = find_token(document.body, "\\begin_layout Plain Keywords", 0)
|
|
|
|
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 Plain Keywords layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\Plainkeywords{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# \Address
|
|
|
|
i = find_token(document.body, "\\begin_layout Address", 0)
|
|
|
|
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 Address layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\Address{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# finally handle the code layouts
|
|
|
|
h = 0
|
|
|
|
m = 0
|
|
|
|
j = 0
|
|
|
|
k = 0
|
2015-05-27 00:13:04 +00:00
|
|
|
while m != -1 or j != -1 or h != -1 or k != -1:
|
2015-05-24 01:34:36 +00:00
|
|
|
# \CodeChunk
|
|
|
|
if h != -1:
|
2015-05-27 21:31:21 +00:00
|
|
|
h = find_token(document.body, "\\begin_inset Flex Code Chunk", h)
|
2015-05-24 01:34:36 +00:00
|
|
|
if h != -1:
|
2015-05-27 21:31:21 +00:00
|
|
|
endh = find_end_of_inset(document.body, h)
|
|
|
|
document.body[endh + 1 : endh] = ["\\end_layout"]
|
|
|
|
document.body[endh : endh + 1] = put_cmd_in_ert("\\end{CodeChunk}")
|
2015-05-24 01:34:36 +00:00
|
|
|
document.body[h : h + 3] = put_cmd_in_ert("\\begin{CodeChunk}")
|
|
|
|
document.body[h - 1 : h] = ["\\begin_layout Standard"]
|
|
|
|
h = h + 1
|
|
|
|
# \CodeInput
|
|
|
|
if j != -1:
|
|
|
|
j = find_token(document.body, "\\begin_layout Code Input", j)
|
|
|
|
if j != -1:
|
|
|
|
endj = find_end_of_layout(document.body, j)
|
|
|
|
document.body[endj : endj + 1] = ["\\end_layout", "", "\\begin_layout Standard"]
|
|
|
|
document.body[endj + 3 : endj + 4] = put_cmd_in_ert("\\end{CodeInput}")
|
|
|
|
document.body[endj + 13 : endj + 13] = ["\\end_layout", "", "\\begin_layout Standard"]
|
|
|
|
document.body[j + 1 : j] = ["\\end_layout", "", "\\begin_layout Standard"]
|
|
|
|
document.body[j : j + 1] = put_cmd_in_ert("\\begin{CodeInput}")
|
|
|
|
j = j + 1
|
|
|
|
# \CodeOutput
|
|
|
|
if k != -1:
|
|
|
|
k = find_token(document.body, "\\begin_layout Code Output", k)
|
|
|
|
if k != -1:
|
|
|
|
endk = find_end_of_layout(document.body, k)
|
2015-05-25 23:15:29 +00:00
|
|
|
document.body[endk : endk + 1] = ["\\end_layout", "", "\\begin_layout Standard"]
|
2015-05-24 01:34:36 +00:00
|
|
|
document.body[endk + 3 : endk + 4] = put_cmd_in_ert("\\end{CodeOutput}")
|
|
|
|
document.body[endk + 13 : endk + 13] = ["\\end_layout", "", "\\begin_layout Standard"]
|
|
|
|
document.body[k + 1 : k] = ["\\end_layout", "", "\\begin_layout Standard"]
|
|
|
|
document.body[k : k + 1] = put_cmd_in_ert("\\begin{CodeOutput}")
|
|
|
|
k = k + 1
|
2015-05-27 21:31:21 +00:00
|
|
|
# \Code
|
|
|
|
if m != -1:
|
|
|
|
m = find_token(document.body, "\\begin_layout Code", m)
|
|
|
|
if m != -1:
|
|
|
|
endm = find_end_of_layout(document.body, m)
|
|
|
|
document.body[endm : endm + 1] = ["\\end_layout", "", "\\begin_layout Standard"]
|
|
|
|
document.body[endm + 3 : endm + 4] = put_cmd_in_ert("\\end{Code}")
|
|
|
|
document.body[endm + 13 : endm + 13] = ["\\end_layout", "", "\\begin_layout Standard"]
|
|
|
|
document.body[m + 1 : m] = ["\\end_layout", "", "\\begin_layout Standard"]
|
|
|
|
document.body[m : m + 1] = put_cmd_in_ert("\\begin{Code}")
|
|
|
|
m = m + 1
|
2015-05-24 01:34:36 +00:00
|
|
|
|
|
|
|
|
2015-05-24 11:50:21 +00:00
|
|
|
def convert_subref(document):
|
|
|
|
" converts sub: ref prefixes to subref: "
|
|
|
|
|
|
|
|
# 1) label insets
|
|
|
|
rx = re.compile(r'^name \"sub:(.+)$')
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_inset CommandInset label", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of Label inset at line " + str(i))
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
for p in range(i, j):
|
|
|
|
m = rx.match(document.body[p])
|
|
|
|
if m:
|
|
|
|
label = m.group(1)
|
|
|
|
document.body[p] = "name \"subsec:" + label
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
# 2) xref insets
|
|
|
|
rx = re.compile(r'^reference \"sub:(.+)$')
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_inset CommandInset ref", 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 Ref inset at line " + str(i))
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
for p in range(i, j):
|
|
|
|
m = rx.match(document.body[p])
|
|
|
|
if m:
|
|
|
|
label = m.group(1)
|
|
|
|
document.body[p] = "reference \"subsec:" + label
|
|
|
|
break
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def revert_subref(document):
|
|
|
|
" reverts subref: ref prefixes to sub: "
|
|
|
|
|
|
|
|
# 1) label insets
|
|
|
|
rx = re.compile(r'^name \"subsec:(.+)$')
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_inset CommandInset label", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of Label inset at line " + str(i))
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
for p in range(i, j):
|
|
|
|
m = rx.match(document.body[p])
|
|
|
|
if m:
|
|
|
|
label = m.group(1)
|
|
|
|
document.body[p] = "name \"sub:" + label
|
|
|
|
break
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
# 2) xref insets
|
|
|
|
rx = re.compile(r'^reference \"subsec:(.+)$')
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_inset CommandInset ref", 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 Ref inset at line " + str(i))
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
for p in range(i, j):
|
|
|
|
m = rx.match(document.body[p])
|
|
|
|
if m:
|
|
|
|
label = m.group(1)
|
|
|
|
document.body[p] = "reference \"sub:" + label
|
|
|
|
break
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
2015-07-16 18:44:47 +00:00
|
|
|
def convert_nounzip(document):
|
|
|
|
" remove the noUnzip parameter of graphics insets "
|
|
|
|
|
|
|
|
rx = re.compile(r'\s*noUnzip\s*$')
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_inset Graphics", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of graphics inset at line " + str(i))
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
k = find_re(document.body, rx, i, j)
|
|
|
|
if k != -1:
|
|
|
|
del document.body[k]
|
|
|
|
j = j - 1
|
|
|
|
i = j + 1
|
|
|
|
|
|
|
|
|
2015-07-16 20:04:08 +00:00
|
|
|
def convert_revert_external_bbox(document, forward):
|
|
|
|
" add units to bounding box of external insets "
|
|
|
|
|
|
|
|
rx = re.compile(r'^\s*boundingBox\s+\S+\s+\S+\s+\S+\s+\S+\s*$')
|
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_inset External", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
if j == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of external inset at line " + str(i))
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
k = find_re(document.body, rx, i, j)
|
|
|
|
if k == -1:
|
|
|
|
i = j + 1
|
|
|
|
continue
|
|
|
|
tokens = document.body[k].split()
|
|
|
|
if forward:
|
|
|
|
for t in range(1, 5):
|
|
|
|
tokens[t] += "bp"
|
|
|
|
else:
|
|
|
|
for t in range(1, 5):
|
|
|
|
tokens[t] = length_in_bp(tokens[t])
|
|
|
|
document.body[k] = "\tboundingBox " + tokens[1] + " " + tokens[2] + " " + \
|
|
|
|
tokens[3] + " " + tokens[4]
|
|
|
|
i = j + 1
|
|
|
|
|
|
|
|
|
|
|
|
def convert_external_bbox(document):
|
|
|
|
convert_revert_external_bbox(document, True)
|
|
|
|
|
|
|
|
|
|
|
|
def revert_external_bbox(document):
|
|
|
|
convert_revert_external_bbox(document, False)
|
|
|
|
|
|
|
|
|
2015-10-19 05:10:09 +00:00
|
|
|
def revert_tcolorbox_1(document):
|
|
|
|
" Reverts the Flex:Subtitle inset of tcolorbox to TeX-code "
|
|
|
|
i = -1
|
|
|
|
while True:
|
|
|
|
i = find_token(document.header, "tcolorbox", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
flex = 0
|
|
|
|
flexEnd = -1
|
|
|
|
flex = find_token(document.body, "\\begin_inset Flex Subtitle", flex)
|
|
|
|
if flex == -1:
|
|
|
|
return flexEnd
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
wasOpt = revert_Argument_to_TeX_brace(document, flex, flexEnd, 1, 1, False, True, False)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, 0, 2, 2, False, False, False)
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
if wasOpt == True:
|
|
|
|
document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\tcbsubtitle")
|
|
|
|
else:
|
|
|
|
document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\tcbsubtitle{")
|
|
|
|
document.body[flexEnd + 4 : flexEnd + 7] = put_cmd_in_ert("}")
|
|
|
|
flex += 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_tcolorbox_2(document):
|
|
|
|
" Reverts the Flex:Raster_Color_Box inset of tcolorbox to TeX-code "
|
|
|
|
i = -1
|
|
|
|
while True:
|
|
|
|
i = find_token(document.header, "tcolorbox", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
flex = 0
|
|
|
|
flexEnd = -1
|
|
|
|
flex = find_token(document.body, "\\begin_inset Flex Raster Color Box", flex)
|
|
|
|
if flex == -1:
|
|
|
|
return flexEnd
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, flexEnd, 1, 1, True, True, False)
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\begin{tcbraster}")
|
|
|
|
document.body[flexEnd + 4 : flexEnd + 7] = put_cmd_in_ert("\\end{tcbraster}")
|
|
|
|
flex += 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_tcolorbox_3(document):
|
|
|
|
" Reverts the Flex:Custom_Color_Box_1 inset of tcolorbox to TeX-code "
|
|
|
|
i = -1
|
|
|
|
while True:
|
|
|
|
i = find_token(document.header, "tcolorbox", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
flex = 0
|
|
|
|
flexEnd = -1
|
|
|
|
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 1", flex)
|
|
|
|
if flex == -1:
|
|
|
|
return flexEnd
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, flexEnd, 1, 1, True, True, False)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, 0, 2, 2, True, False, False)
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\begin{cBoxA}")
|
|
|
|
document.body[flexEnd + 4 : flexEnd + 7] = put_cmd_in_ert("{}\\end{cBoxA}")
|
|
|
|
flex += 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_tcolorbox_4(document):
|
|
|
|
" Reverts the Flex:Custom_Color_Box_2 inset of tcolorbox to TeX-code "
|
|
|
|
i = -1
|
|
|
|
while True:
|
|
|
|
i = find_token(document.header, "tcolorbox", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
flex = 0
|
|
|
|
flexEnd = -1
|
|
|
|
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 2", flex)
|
|
|
|
if flex == -1:
|
|
|
|
return flexEnd
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, flexEnd, 1, 1, True, True, False)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, 0, 2, 2, True, False, False)
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\begin{cBoxB}")
|
|
|
|
document.body[flexEnd + 4 : flexEnd + 7] = put_cmd_in_ert("{}\\end{cBoxB}")
|
|
|
|
flex += 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_tcolorbox_5(document):
|
|
|
|
" Reverts the Flex:Custom_Color_Box_3 inset of tcolorbox to TeX-code "
|
|
|
|
i = -1
|
|
|
|
while True:
|
|
|
|
i = find_token(document.header, "tcolorbox", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
flex = 0
|
|
|
|
flexEnd = -1
|
|
|
|
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 3", flex)
|
|
|
|
if flex == -1:
|
|
|
|
return flexEnd
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, flexEnd, 1, 1, True, True, False)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, 0, 2, 2, True, False, False)
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\begin{cBoxC}")
|
|
|
|
document.body[flexEnd + 4 : flexEnd + 7] = put_cmd_in_ert("{}\\end{cBoxC}")
|
|
|
|
flex += 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_tcolorbox_6(document):
|
|
|
|
" Reverts the Flex:Custom_Color_Box_4 inset of tcolorbox to TeX-code "
|
|
|
|
i = -1
|
|
|
|
while True:
|
|
|
|
i = find_token(document.header, "tcolorbox", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
flex = 0
|
|
|
|
flexEnd = -1
|
|
|
|
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 4", flex)
|
|
|
|
if flex == -1:
|
|
|
|
return flexEnd
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, flexEnd, 1, 1, True, True, False)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, 0, 2, 2, True, False, False)
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\begin{cBoxD}")
|
|
|
|
document.body[flexEnd + 4 : flexEnd + 7] = put_cmd_in_ert("{}\\end{cBoxD}")
|
|
|
|
flex += 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_tcolorbox_7(document):
|
|
|
|
" Reverts the Flex:Custom_Color_Box_5 inset of tcolorbox to TeX-code "
|
|
|
|
i = -1
|
|
|
|
while True:
|
|
|
|
i = find_token(document.header, "tcolorbox", i)
|
|
|
|
if i == -1:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
flex = 0
|
|
|
|
flexEnd = -1
|
|
|
|
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 5", flex)
|
|
|
|
if flex == -1:
|
|
|
|
return flexEnd
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, flexEnd, 1, 1, True, True, False)
|
|
|
|
revert_Argument_to_TeX_brace(document, flex, 0, 2, 2, True, False, False)
|
|
|
|
flexEnd = find_end_of_inset(document.body, flex)
|
|
|
|
document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\begin{cBoxE}")
|
|
|
|
document.body[flexEnd + 4 : flexEnd + 7] = put_cmd_in_ert("{}\\end{cBoxE}")
|
|
|
|
flex += 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_tcolorbox_8(document):
|
|
|
|
" Reverts the layout New Color Box Type of tcolorbox to TeX-code "
|
|
|
|
i = 0
|
|
|
|
j = 0
|
|
|
|
k = 0
|
|
|
|
while True:
|
|
|
|
if i != -1:
|
|
|
|
i = find_token(document.body, "\\begin_layout New Color Box Type", i)
|
|
|
|
if i != -1:
|
|
|
|
j = find_end_of_layout(document.body, i)
|
|
|
|
wasOpt = revert_Argument_to_TeX_brace(document, i, j, 1, 1, False, True, False)
|
|
|
|
revert_Argument_to_TeX_brace(document, i, 0, 2, 2, False, False, True)
|
|
|
|
revert_Argument_to_TeX_brace(document, i, 0, 3, 4, False, True, False)
|
|
|
|
document.body[i] = document.body[i].replace("\\begin_layout New Color Box Type", "\\begin_layout Standard")
|
|
|
|
if wasOpt == True:
|
|
|
|
document.body[i + 1 : i + 1] = put_cmd_in_ert("\\newtcolorbox")
|
|
|
|
else:
|
|
|
|
document.body[i + 1 : i + 1] = put_cmd_in_ert("\\newtcolorbox{")
|
|
|
|
k = find_end_of_inset(document.body, j)
|
|
|
|
k = find_token(document.body, "\\end_inset", k + 1)
|
|
|
|
k = find_token(document.body, "\\end_inset", k + 1)
|
|
|
|
if wasOpt == True:
|
|
|
|
k = find_token(document.body, "\\end_inset", k + 1)
|
|
|
|
document.body[k + 2 : j + 2] = put_cmd_in_ert("{")
|
|
|
|
j = find_token(document.body, "\\begin_layout Standard", j + 1)
|
|
|
|
document.body[j - 2 : j - 2] = put_cmd_in_ert("}")
|
|
|
|
i += 1
|
|
|
|
if i == -1:
|
|
|
|
return
|
|
|
|
|
|
|
|
|
2015-10-28 01:27:32 +00:00
|
|
|
def revert_moderncv_1(document):
|
|
|
|
" Reverts the new inset of moderncv to TeX-code in preamble "
|
|
|
|
|
|
|
|
if document.textclass != "moderncv":
|
|
|
|
return
|
|
|
|
i = 0
|
|
|
|
j = 0
|
|
|
|
lineArg = 0
|
|
|
|
while True:
|
|
|
|
# at first revert the new styles
|
|
|
|
# \moderncvicons
|
|
|
|
i = find_token(document.body, "\\begin_layout CVIcons", 0)
|
|
|
|
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 CVIcons layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\moderncvicons{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# \hintscolumnwidth
|
|
|
|
i = find_token(document.body, "\\begin_layout CVColumnWidth", 0)
|
|
|
|
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 CVColumnWidth layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
content = lyx2latex(document, document.body[i:j + 1])
|
|
|
|
add_to_preamble(document, ["\\setlength{\hintscolumnwidth}{" + content + "}"])
|
|
|
|
del document.body[i:j + 1]
|
|
|
|
# now change the new styles to the obsolete ones
|
|
|
|
# \name
|
|
|
|
i = find_token(document.body, "\\begin_layout Name", 0)
|
|
|
|
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 Name layout")
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
lineArg = find_token(document.body, "\\begin_inset Argument 1", i)
|
|
|
|
if lineArg > j and j != 0:
|
|
|
|
return
|
|
|
|
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
|
|
|
|
Arg2 = document.body[l + 5 : l + 6]
|
|
|
|
# rename the style
|
|
|
|
document.body[i : i + 1]= ["\\begin_layout FirstName"]
|
|
|
|
# delete the Argument inset
|
|
|
|
del( document.body[endInset - 2 : endInset + 3])
|
|
|
|
del( document.body[lineArg : beginPlain + 1])
|
|
|
|
document.body[i + 4 : i + 4]= ["\\begin_layout FamilyName"] + Arg2 + ["\\end_layout"] + [""]
|
|
|
|
|
|
|
|
|
|
|
|
def revert_moderncv_2(document):
|
|
|
|
" Reverts the phone inset of moderncv to the obsoleted mobile or fax "
|
|
|
|
|
|
|
|
if document.textclass != "moderncv":
|
|
|
|
return
|
|
|
|
i = 0
|
|
|
|
j = 0
|
|
|
|
lineArg = 0
|
|
|
|
while True:
|
|
|
|
# \phone
|
|
|
|
i = find_token(document.body, "\\begin_layout Phone", 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 Phone layout")
|
|
|
|
i += 1
|
|
|
|
return
|
|
|
|
lineArg = find_token(document.body, "\\begin_inset Argument 1", i)
|
|
|
|
if lineArg > j and j != 0:
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
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
|
|
|
|
Arg = document.body[beginPlain + 1 : beginPlain + 2]
|
|
|
|
# rename the style
|
|
|
|
if Arg[0] == "mobile":
|
|
|
|
document.body[i : i + 1]= ["\\begin_layout Mobile"]
|
|
|
|
if Arg[0] == "fax":
|
|
|
|
document.body[i : i + 1]= ["\\begin_layout Fax"]
|
|
|
|
# delete the Argument inset
|
|
|
|
del(document.body[endInset - 2 : endInset + 1])
|
|
|
|
del(document.body[lineArg : beginPlain + 3])
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
|
|
|
def convert_moderncv(document):
|
|
|
|
" Convert the Fax and Mobile inset of moderncv to the new phone inset "
|
|
|
|
|
|
|
|
if document.textclass != "moderncv":
|
|
|
|
return
|
|
|
|
i = 0
|
|
|
|
j = 0
|
|
|
|
lineArg = 0
|
|
|
|
while True:
|
|
|
|
# \mobile
|
|
|
|
i = find_token(document.body, "\\begin_layout Mobile", 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 Mobile layout")
|
|
|
|
i += 1
|
|
|
|
return
|
|
|
|
document.body[i + 1 : i + 1] = ["\\begin_inset Argument 1", "status open", "",
|
|
|
|
"\\begin_layout Plain Layout", "mobile", "\\end_layout", "",
|
|
|
|
"\\end_inset", ""]
|
|
|
|
# \fax
|
|
|
|
i = find_token(document.body, "\\begin_layout Fax", 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 Fax layout")
|
|
|
|
i += 1
|
|
|
|
return
|
|
|
|
document.body[i + 1 : i + 1] = ["\\begin_inset Argument 1", "status open", "",
|
|
|
|
"\\begin_layout Plain Layout", "fax", "\\end_layout", "",
|
|
|
|
"\\end_inset", ""]
|
|
|
|
# \firstname and \familyname
|
|
|
|
i1 = find_token(document.body, "\\begin_layout FirstName", 0)
|
|
|
|
if i1 == -1:
|
|
|
|
return
|
|
|
|
j1 = find_end_of_layout(document.body, i1)
|
|
|
|
if j1 == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of FirstName layout")
|
|
|
|
i1 += 1
|
|
|
|
return
|
|
|
|
FirstName = document.body[i1 + 1 : i1 + 2]
|
|
|
|
i2 = find_token(document.body, "\\begin_layout FamilyName", 0)
|
|
|
|
if i2 == -1:
|
|
|
|
return
|
|
|
|
j2 = find_end_of_layout(document.body, i2)
|
|
|
|
if j2 == -1:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of FamilyName layout")
|
|
|
|
i2 += 1
|
|
|
|
return
|
|
|
|
FamilyName = document.body[i2 + 1 : i2 + 2]
|
|
|
|
if j1 > j2:
|
|
|
|
k = j1
|
|
|
|
l = i2
|
|
|
|
else:
|
|
|
|
k = j2
|
|
|
|
l = i1
|
|
|
|
document.body[k + 1 : k + 1] = ["\\begin_layout Name", "\\begin_inset Argument 1", "status open", "",
|
|
|
|
"\\begin_layout Plain Layout", FirstName[0], "\\end_layout", "",
|
|
|
|
"\\end_inset", "", FamilyName[0], "\\end_layout", ""]
|
|
|
|
#document.body[i2 + 1 : i2 + 1] = ["hellok: ", str(k)]
|
|
|
|
del(document.body[l : k])
|
|
|
|
i += 1
|
|
|
|
i1 += 1
|
|
|
|
i2 += 1
|
|
|
|
|
2015-11-04 00:18:13 +00:00
|
|
|
|
|
|
|
def revert_achemso(document):
|
|
|
|
" Reverts the flex inset Latin to TeX code "
|
2015-11-04 01:18:28 +00:00
|
|
|
|
|
|
|
if document.textclass != "achemso":
|
|
|
|
return
|
2015-11-04 00:18:13 +00:00
|
|
|
i = 0
|
|
|
|
j = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_inset Flex Latin", i)
|
|
|
|
if i != -1:
|
|
|
|
j = find_end_of_inset(document.body, i)
|
|
|
|
else:
|
|
|
|
return
|
|
|
|
if j != -1:
|
|
|
|
beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i)
|
|
|
|
endPlain = find_end_of_layout(document.body, beginPlain)
|
|
|
|
content = lyx2latex(document, document.body[beginPlain : endPlain])
|
|
|
|
document.body[i:j + 1] = put_cmd_in_ert("\\latin{" + content + "}")
|
|
|
|
else:
|
|
|
|
document.warning("Malformed LyX document: Can't find end of flex inset Latin")
|
|
|
|
return
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
2015-11-09 06:33:57 +00:00
|
|
|
fontsettings = ["\\font_roman", "\\font_sans", "\\font_typewriter", "\\font_math", \
|
|
|
|
"\\font_sf_scale", "\\font_tt_scale"]
|
|
|
|
fontdefaults = ["default", "default", "default", "auto", "100", "100"]
|
|
|
|
fontquotes = [True, True, True, True, False, False]
|
|
|
|
|
|
|
|
def convert_fontsettings(document):
|
|
|
|
" Duplicate font settings "
|
|
|
|
|
|
|
|
i = find_token(document.header, "\\use_non_tex_fonts ", 0)
|
|
|
|
if i == -1:
|
|
|
|
document.warning("Malformed LyX document: No \\use_non_tex_fonts!")
|
|
|
|
use_non_tex_fonts = "false"
|
|
|
|
else:
|
|
|
|
use_non_tex_fonts = get_value(document.header, "\\use_non_tex_fonts", i)
|
|
|
|
j = 0
|
|
|
|
for f in fontsettings:
|
|
|
|
i = find_token(document.header, f + " ", 0)
|
|
|
|
if i == -1:
|
|
|
|
document.warning("Malformed LyX document: No " + f + "!")
|
2015-12-12 18:19:41 +00:00
|
|
|
# we can fix that
|
|
|
|
# note that with i = -1, this will insert at the end
|
|
|
|
# of the header
|
|
|
|
value = fontdefaults[j]
|
|
|
|
else:
|
|
|
|
value = document.header[i][len(f):].strip()
|
2015-11-09 06:33:57 +00:00
|
|
|
if fontquotes[j]:
|
|
|
|
if use_non_tex_fonts == "true":
|
|
|
|
document.header[i:i+1] = [f + ' "' + fontdefaults[j] + '" "' + value + '"']
|
|
|
|
else:
|
|
|
|
document.header[i:i+1] = [f + ' "' + value + '" "' + fontdefaults[j] + '"']
|
|
|
|
else:
|
|
|
|
if use_non_tex_fonts == "true":
|
|
|
|
document.header[i:i+1] = [f + ' ' + fontdefaults[j] + ' ' + value]
|
|
|
|
else:
|
|
|
|
document.header[i:i+1] = [f + ' ' + value + ' ' + fontdefaults[j]]
|
|
|
|
j = j + 1
|
|
|
|
|
|
|
|
|
|
|
|
def revert_fontsettings(document):
|
|
|
|
" Merge font settings "
|
|
|
|
|
|
|
|
i = find_token(document.header, "\\use_non_tex_fonts ", 0)
|
|
|
|
if i == -1:
|
|
|
|
document.warning("Malformed LyX document: No \\use_non_tex_fonts!")
|
|
|
|
use_non_tex_fonts = "false"
|
|
|
|
else:
|
|
|
|
use_non_tex_fonts = get_value(document.header, "\\use_non_tex_fonts", i)
|
|
|
|
j = 0
|
|
|
|
for f in fontsettings:
|
|
|
|
i = find_token(document.header, f + " ", 0)
|
|
|
|
if i == -1:
|
|
|
|
document.warning("Malformed LyX document: No " + f + "!")
|
|
|
|
j = j + 1
|
|
|
|
continue
|
|
|
|
line = get_value(document.header, f, i)
|
|
|
|
if fontquotes[j]:
|
|
|
|
q1 = line.find('"')
|
|
|
|
q2 = line.find('"', q1+1)
|
|
|
|
q3 = line.find('"', q2+1)
|
|
|
|
q4 = line.find('"', q3+1)
|
|
|
|
if q1 == -1 or q2 == -1 or q3 == -1 or q4 == -1:
|
|
|
|
document.warning("Malformed LyX document: Missing quotes!")
|
|
|
|
j = j + 1
|
|
|
|
continue
|
|
|
|
if use_non_tex_fonts == "true":
|
|
|
|
document.header[i:i+1] = [f + ' ' + line[q3+1:q4]]
|
|
|
|
else:
|
|
|
|
document.header[i:i+1] = [f + ' ' + line[q1+1:q2]]
|
|
|
|
else:
|
|
|
|
if use_non_tex_fonts == "true":
|
|
|
|
document.header[i:i+1] = [f + ' ' + line.split()[1]]
|
2015-11-28 17:13:07 +00:00
|
|
|
else:
|
|
|
|
document.header[i:i+1] = [f + ' ' + line.split()[0]]
|
2015-11-09 06:33:57 +00:00
|
|
|
j = j + 1
|
|
|
|
|
|
|
|
|
2015-11-18 00:14:30 +00:00
|
|
|
def revert_solution(document):
|
2015-11-29 02:51:57 +00:00
|
|
|
" Reverts the solution environment of the theorem module to TeX code "
|
2015-11-18 00:14:30 +00:00
|
|
|
|
2015-11-29 02:51:57 +00:00
|
|
|
# Do we use one of the modules that provides Solution?
|
2015-11-18 00:14:30 +00:00
|
|
|
have_mod = False
|
|
|
|
mods = document.get_module_list()
|
|
|
|
for mod in mods:
|
2015-11-18 01:36:49 +00:00
|
|
|
if mod == "theorems-std" or mod == "theorems-bytype" \
|
|
|
|
or mod == "theorems-ams" or mod == "theorems-ams-bytype":
|
2015-11-18 00:14:30 +00:00
|
|
|
have_mod = True
|
2015-11-29 04:42:09 +00:00
|
|
|
break
|
2015-11-18 00:14:30 +00:00
|
|
|
if not have_mod:
|
|
|
|
return
|
2015-11-29 04:42:09 +00:00
|
|
|
|
2015-11-18 00:14:30 +00:00
|
|
|
consecutive = False
|
2015-11-29 02:51:57 +00:00
|
|
|
is_starred = False
|
2015-11-18 00:14:30 +00:00
|
|
|
i = 0
|
|
|
|
while True:
|
|
|
|
i = find_token(document.body, "\\begin_layout Solution", i)
|
|
|
|
if i == -1:
|
|
|
|
return
|
2015-11-29 04:42:09 +00:00
|
|
|
|
2015-11-29 02:51:57 +00:00
|
|
|
is_starred = document.body[i].startswith("\\begin_layout Solution*")
|
|
|
|
if is_starred == True:
|
|
|
|
LaTeXName = "sol*"
|
|
|
|
LyXName = "Solution*"
|
|
|
|
theoremName = "newtheorem*"
|
|
|
|
else:
|
|
|
|
LaTeXName = "sol"
|
|
|
|
LyXName = "Solution"
|
|
|
|
theoremName = "newtheorem"
|
2015-11-29 04:42:09 +00:00
|
|
|
|
2015-11-18 00:14:30 +00:00
|
|
|
j = find_end_of_layout(document.body, i)
|
|
|
|
if j == -1:
|
2015-11-29 03:26:14 +00:00
|
|
|
document.warning("Malformed LyX document: Can't find end of " + LyXName + " layout")
|
2015-11-18 00:14:30 +00:00
|
|
|
i += 1
|
|
|
|
continue
|
2015-11-29 04:42:09 +00:00
|
|
|
|
2015-11-18 00:14:30 +00:00
|
|
|
# if this is not a consecutive env, add start command
|
|
|
|
begcmd = []
|
|
|
|
if not consecutive:
|
2015-11-29 04:42:09 +00:00
|
|
|
begcmd = put_cmd_in_ert("\\begin{%s}" % (LaTeXName))
|
|
|
|
|
2015-11-18 00:14:30 +00:00
|
|
|
# has this a consecutive theorem of same type?
|
2015-11-29 02:51:57 +00:00
|
|
|
consecutive = document.body[j + 2] == "\\begin_layout " + LyXName
|
2015-11-29 04:42:09 +00:00
|
|
|
|
2015-11-18 00:14:30 +00:00
|
|
|
# if this is not followed by a consecutive env, add end command
|
|
|
|
if not consecutive:
|
2015-11-29 04:42:09 +00:00
|
|
|
document.body[j : j + 1] = put_cmd_in_ert("\\end{%s}" % (LaTeXName)) + ["\\end_layout"]
|
|
|
|
|
2015-11-18 00:14:30 +00:00
|
|
|
document.body[i : i + 1] = ["\\begin_layout Standard", ""] + begcmd
|
2015-11-29 04:42:09 +00:00
|
|
|
|
2015-11-29 02:51:57 +00:00
|
|
|
add_to_preamble(document, "\\theoremstyle{definition}")
|
2015-11-29 04:42:09 +00:00
|
|
|
if is_starred or mod == "theorems-bytype" or mod == "theorems-ams-bytype":
|
|
|
|
add_to_preamble(document, "\\%s{%s}{\\protect\\solutionname}" % \
|
|
|
|
(theoremName, LaTeXName))
|
|
|
|
else: # mod == "theorems-std" or mod == "theorems-ams" and not is_starred
|
|
|
|
add_to_preamble(document, "\\%s{%s}[thm]{\\protect\\solutionname}" % \
|
|
|
|
(theoremName, LaTeXName))
|
|
|
|
|
2015-11-29 02:51:57 +00:00
|
|
|
add_to_preamble(document, "\\providecommand{\solutionname}{Solution}")
|
2015-11-18 00:14:30 +00:00
|
|
|
i = j
|
|
|
|
|
|
|
|
|
2015-11-24 22:56:26 +00:00
|
|
|
def revert_verbatim_star(document):
|
|
|
|
from lyx_2_1 import revert_verbatim
|
|
|
|
revert_verbatim(document, True)
|
|
|
|
|
|
|
|
|
2014-03-23 12:33:05 +00:00
|
|
|
##
|
|
|
|
# Conversion hub
|
|
|
|
#
|
|
|
|
|
2014-08-24 22:44:09 +00:00
|
|
|
supported_versions = ["2.2.0", "2.2"]
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
convert = [
|
|
|
|
[475, [convert_separator]],
|
2014-05-27 20:10:02 +00:00
|
|
|
# nothing to do for 476: We consider it a bug that older versions
|
|
|
|
# did not load amsmath automatically for these commands, and do not
|
|
|
|
# want to hardcode amsmath off.
|
|
|
|
[476, []],
|
2014-07-05 11:38:55 +00:00
|
|
|
[477, []],
|
2014-08-31 10:30:14 +00:00
|
|
|
[478, []],
|
2015-01-09 10:24:45 +00:00
|
|
|
[479, []],
|
2015-02-24 20:58:27 +00:00
|
|
|
[480, []],
|
2015-03-01 10:16:57 +00:00
|
|
|
[481, [convert_dashes]],
|
2015-03-23 20:28:04 +00:00
|
|
|
[482, [convert_phrases]],
|
2015-04-06 04:00:11 +00:00
|
|
|
[483, [convert_specialchar]],
|
2015-04-09 09:01:44 +00:00
|
|
|
[484, []],
|
2015-04-20 10:15:20 +00:00
|
|
|
[485, []],
|
2015-04-20 16:14:42 +00:00
|
|
|
[486, []],
|
2015-04-21 18:33:35 +00:00
|
|
|
[487, []],
|
2015-05-11 19:30:32 +00:00
|
|
|
[488, [convert_newgloss]],
|
Fix bug #4812 (Layout in local directory lost on Save As, Copying)
The "save-as" part of the bug is fixed by extending the \textclass tag
such that, if a local layout file is used, its path relative to the
document directory is now stored together with the name. If a relative
path cannot be used, an absolute one is used but, in this case, the
document is not usable on a different platform.
The "copy" part is fixed by introducing a new \origin tag, which is
written when the file is saved. This tag stores the absolute path of
the document directory. If the document is manually copied to a
different location, the local layout file is retrivied by using
\origin (which is only updated on save).
This new tag may prove useful also for locating other files when the
document is manually moved to a different directory.
As in the original implementation the files needed for the layout
(for example, a latex class) had to be in the same directory as the
layout file, this directory has also to be added to TEXINPUTS.
2015-05-13 19:40:51 +00:00
|
|
|
[489, [convert_BoxFeatures]],
|
2015-05-14 20:23:44 +00:00
|
|
|
[490, [convert_origin]],
|
2015-05-16 01:22:37 +00:00
|
|
|
[491, []],
|
2015-05-17 11:43:37 +00:00
|
|
|
[492, [convert_colorbox]],
|
2015-05-24 01:34:36 +00:00
|
|
|
[493, []],
|
2015-05-24 11:50:21 +00:00
|
|
|
[494, []],
|
2015-07-16 18:44:47 +00:00
|
|
|
[495, [convert_subref]],
|
2015-07-16 20:04:08 +00:00
|
|
|
[496, [convert_nounzip]],
|
2015-10-19 05:10:09 +00:00
|
|
|
[497, [convert_external_bbox]],
|
2015-10-28 01:27:32 +00:00
|
|
|
[498, []],
|
2015-11-04 00:18:13 +00:00
|
|
|
[499, [convert_moderncv]],
|
2015-11-09 06:33:57 +00:00
|
|
|
[500, []],
|
2015-11-18 00:14:30 +00:00
|
|
|
[501, [convert_fontsettings]],
|
2015-11-24 22:56:26 +00:00
|
|
|
[502, []],
|
|
|
|
[503, []]
|
2014-03-23 12:33:05 +00:00
|
|
|
]
|
|
|
|
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
revert = [
|
2015-11-24 22:56:26 +00:00
|
|
|
[502, [revert_verbatim_star]],
|
2015-11-18 00:14:30 +00:00
|
|
|
[501, [revert_solution]],
|
2015-11-09 06:33:57 +00:00
|
|
|
[500, [revert_fontsettings]],
|
2015-11-04 00:18:13 +00:00
|
|
|
[499, [revert_achemso]],
|
2015-10-28 01:27:32 +00:00
|
|
|
[498, [revert_moderncv_1, revert_moderncv_2]],
|
2015-10-19 05:10:09 +00:00
|
|
|
[497, [revert_tcolorbox_1, revert_tcolorbox_2,
|
|
|
|
revert_tcolorbox_3, revert_tcolorbox_4, revert_tcolorbox_5,
|
|
|
|
revert_tcolorbox_6, revert_tcolorbox_7, revert_tcolorbox_8]],
|
2015-07-16 20:04:08 +00:00
|
|
|
[496, [revert_external_bbox]],
|
2015-07-16 18:44:47 +00:00
|
|
|
[495, []], # nothing to do since the noUnzip parameter was optional
|
2015-05-24 11:50:21 +00:00
|
|
|
[494, [revert_subref]],
|
2015-05-24 01:34:36 +00:00
|
|
|
[493, [revert_jss]],
|
2015-05-17 11:43:37 +00:00
|
|
|
[492, [revert_mathmulticol]],
|
2015-05-16 01:22:37 +00:00
|
|
|
[491, [revert_colorbox]],
|
2015-05-14 20:23:44 +00:00
|
|
|
[490, [revert_textcolor]],
|
Fix bug #4812 (Layout in local directory lost on Save As, Copying)
The "save-as" part of the bug is fixed by extending the \textclass tag
such that, if a local layout file is used, its path relative to the
document directory is now stored together with the name. If a relative
path cannot be used, an absolute one is used but, in this case, the
document is not usable on a different platform.
The "copy" part is fixed by introducing a new \origin tag, which is
written when the file is saved. This tag stores the absolute path of
the document directory. If the document is manually copied to a
different location, the local layout file is retrivied by using
\origin (which is only updated on save).
This new tag may prove useful also for locating other files when the
document is manually moved to a different directory.
As in the original implementation the files needed for the layout
(for example, a latex class) had to be in the same directory as the
layout file, this directory has also to be added to TEXINPUTS.
2015-05-13 19:40:51 +00:00
|
|
|
[489, [revert_origin]],
|
2015-05-11 19:30:32 +00:00
|
|
|
[488, [revert_BoxFeatures]],
|
2015-05-09 23:35:55 +00:00
|
|
|
[487, [revert_newgloss, revert_glossgroup]],
|
2015-04-21 13:48:32 +00:00
|
|
|
[486, [revert_forest]],
|
2015-04-20 10:15:20 +00:00
|
|
|
[485, [revert_ex_itemargs]],
|
2015-04-09 09:01:44 +00:00
|
|
|
[484, [revert_sigplan_doi]],
|
2015-04-06 04:08:26 +00:00
|
|
|
[483, [revert_georgian]],
|
2015-03-23 20:28:04 +00:00
|
|
|
[482, [revert_specialchar]],
|
2015-03-01 10:16:57 +00:00
|
|
|
[481, [revert_phrases]],
|
2015-02-24 20:58:27 +00:00
|
|
|
[480, [revert_dashes]],
|
2015-01-09 10:24:45 +00:00
|
|
|
[479, [revert_question_env]],
|
2014-08-31 10:30:14 +00:00
|
|
|
[478, [revert_beamer_lemma]],
|
2014-08-24 22:44:09 +00:00
|
|
|
[477, [revert_xarrow]],
|
2014-07-05 11:38:55 +00:00
|
|
|
[476, [revert_swissgerman]],
|
2014-05-27 20:10:02 +00:00
|
|
|
[475, [revert_smash]],
|
Fix bugs #8546 and #9055, and introduce new separator inset.
The algorithm used for breaking a paragraph in LaTeX export is changed
for avoiding spurious blank lines causing too much vertical space.
This change is tied to the introduction of a new inset (with two
different specializations) helping in either outputing LaTeX paragraph
breaks or separating environments in LyX. Both of the above goals were
previously achieved by the ---Separator--- layout and can now be
accomplished by the new inset in a more natural way. As an example,
after leaving an environment by hitting the Return key for two times,
a third return automatically inserts a parbreak inset, which is
equivalent to the old separator layout, i.e., it also introduces a
blank line in the output. If this blank line is not wanted, the
parbreak separator can be changed to a plain separator by a right
click of the mouse. Of course, an environment can still be separated
by the following one by using the Alt+P+Return shortcut (or the
corresponding menu key), but now the plain separator inset is used
instead of the old separator layout, such that no blank line occurs in
the LaTeX output.
Old documents are converted such that the LaTeX output remains unchanged.
As a result of this conversion, the old separator layout is replaced by
the new parbreak inset, which may also appear in places where the old
algorithm was introducing blank lines while the new one is not.
Note that not all blank lines were actually affecting the LaTeX output,
because a blank line is simply ignored by the TeX engine when it occurs
in the so called "vertical mode" (e.g., after an alignment environment).
The old ---Separator--- layout is now gone and old layout files using it
are also automatically converted.
Round trip conversions between old and new format should leave a document
unchanged. This means that the new behavior about paragraph breaking is
not "carried back" to the old format. Indeed, this would need introducing
special LaTeX commands in ERT that would accumulate in roundtrip
conversions, horribly cluttering the document. So, when converting a
modified document to old formats, the LaTeX output may slightly differ in
vertical spacing if the document is processed by an old version of LyX.
In other words, forward compatibility is guaranteed, but not backwards.
2014-05-10 21:25:11 +00:00
|
|
|
[474, [revert_separator]]
|
2014-03-23 12:33:05 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
pass
|