--- a/eric6/QScintilla/Exporters/ExporterTEX.py Tue Oct 13 19:02:26 2020 +0200 +++ b/eric6/QScintilla/Exporters/ExporterTEX.py Wed Oct 14 17:50:39 2020 +0200 @@ -157,122 +157,124 @@ try: with E5OverrideCursor(): - f = open(filename, "w", encoding="utf-8") - - f.write("\\documentclass[a4paper]{article}\n") - f.write("\\usepackage[a4paper,margin=1.5cm]{geometry}\n") - f.write("\\usepackage[T1]{fontenc}\n") - f.write("\\usepackage{color}\n") - f.write("\\usepackage{alltt}\n") - f.write("\\usepackage{times}\n") - if self.editor.isUtf8(): - f.write("\\usepackage[utf8]{inputenc}\n") - else: - f.write("\\usepackage[latin1]{inputenc}\n") - - if lex: - istyle = 0 - while istyle <= QsciScintilla.STYLE_MAX: - if ( - (istyle <= QsciScintilla.STYLE_DEFAULT or - istyle > QsciScintilla.STYLE_LASTPREDEFINED) and - styleIsUsed[istyle] - ): + with open(filename, "w", encoding="utf-8") as f: + + f.write("\\documentclass[a4paper]{article}\n") + f.write("\\usepackage[a4paper,margin=1.5cm]{geometry}\n") + f.write("\\usepackage[T1]{fontenc}\n") + f.write("\\usepackage{color}\n") + f.write("\\usepackage{alltt}\n") + f.write("\\usepackage{times}\n") + if self.editor.isUtf8(): + f.write("\\usepackage[utf8]{inputenc}\n") + else: + f.write("\\usepackage[latin1]{inputenc}\n") + + if lex: + istyle = 0 + while istyle <= QsciScintilla.STYLE_MAX: if ( - lex.description(istyle) or - istyle == QsciScintilla.STYLE_DEFAULT + (istyle <= QsciScintilla.STYLE_DEFAULT or + istyle > QsciScintilla.STYLE_LASTPREDEFINED + ) and styleIsUsed[istyle] ): - font = lex.font(istyle) - colour = lex.color(istyle) - paper = lex.paper(istyle) - - self.__defineTexStyle(font, colour, paper, f, - istyle) - istyle += 1 - else: - colour = self.editor.color() - paper = self.editor.paper() - font = Preferences.getEditorOtherFonts("DefaultFont") + if ( + lex.description(istyle) or + istyle == QsciScintilla.STYLE_DEFAULT + ): + font = lex.font(istyle) + colour = lex.color(istyle) + paper = lex.paper(istyle) + + self.__defineTexStyle( + font, colour, paper, f, istyle) + istyle += 1 + else: + colour = self.editor.color() + paper = self.editor.paper() + font = Preferences.getEditorOtherFonts("DefaultFont") + + self.__defineTexStyle(font, colour, paper, f, 0) + self.__defineTexStyle(font, colour, paper, f, + QsciScintilla.STYLE_DEFAULT) + + f.write("\\begin{document}\n\n") + if titleFullPath: + title = self.editor.getFileName() + else: + title = os.path.basename(self.editor.getFileName()) + f.write( + "Source File: {0}\n\n\\noindent\n\\tiny{{\n" + .format(title)) + + styleCurrent = self.editor.styleAt(0) + f.write("\\eric{0}{{" + .format(self.__texStyle(styleCurrent))) - self.__defineTexStyle(font, colour, paper, f, 0) - self.__defineTexStyle(font, colour, paper, f, - QsciScintilla.STYLE_DEFAULT) - - f.write("\\begin{document}\n\n") - if titleFullPath: - title = self.editor.getFileName() - else: - title = os.path.basename(self.editor.getFileName()) - f.write( - "Source File: {0}\n\n\\noindent\n\\tiny{{\n".format(title)) - - styleCurrent = self.editor.styleAt(0) - f.write("\\eric{0}{{".format(self.__texStyle(styleCurrent))) - - lineIdx = 0 - pos = 0 - utf8 = self.editor.isUtf8() - utf8Ch = b"" - utf8Len = 0 - - while pos < lengthDoc: - ch = self.editor.byteAt(pos) - style = self.editor.styleAt(pos) - if style != styleCurrent: - # new style - f.write( - "}}\n\\eric{0}{{".format(self.__texStyle(style))) - styleCurrent = style + lineIdx = 0 + pos = 0 + utf8 = self.editor.isUtf8() + utf8Ch = b"" + utf8Len = 0 - if ch == b'\t': - ts = tabSize - (lineIdx % tabSize) - lineIdx += ts - 1 - f.write("\\hspace*{{{0:d}em}}".format(ts)) - elif ch == b'\\': - f.write("{\\textbackslash}") - elif ch in [b'>', b'<', b'@']: - f.write("${0}$".format(ch[0])) - elif ch in [b'{', b'}', b'^', b'_', b'&', b'$', b'#', - b'%', b'~']: - f.write("\\{0}".format(ch[0])) - elif ch in [b'\r', b'\n']: - lineIdx = -1 # because incremented below - if ( - ch == b'\r' and - self.editor.byteAt(pos + 1) == b'\n' - ): - pos += 1 # skip the LF - styleCurrent = self.editor.styleAt(pos + 1) - f.write("}} \\\\\n\\eric{0}{{".format( - self.__texStyle(styleCurrent))) - elif ch == b' ': - if self.editor.byteAt(pos + 1) == b' ': - f.write("{\\hspace*{1em}}") + while pos < lengthDoc: + ch = self.editor.byteAt(pos) + style = self.editor.styleAt(pos) + if style != styleCurrent: + # new style + f.write( + "}}\n\\eric{0}{{".format( + self.__texStyle(style))) + styleCurrent = style + + if ch == b'\t': + ts = tabSize - (lineIdx % tabSize) + lineIdx += ts - 1 + f.write("\\hspace*{{{0:d}em}}".format(ts)) + elif ch == b'\\': + f.write("{\\textbackslash}") + elif ch in [b'>', b'<', b'@']: + f.write("${0}$".format(ch[0])) + elif ch in [b'{', b'}', b'^', b'_', b'&', b'$', b'#', + b'%', b'~']: + f.write("\\{0}".format(ch[0])) + elif ch in [b'\r', b'\n']: + lineIdx = -1 # because incremented below + if ( + ch == b'\r' and + self.editor.byteAt(pos + 1) == b'\n' + ): + pos += 1 # skip the LF + styleCurrent = self.editor.styleAt(pos + 1) + f.write("}} \\\\\n\\eric{0}{{".format( + self.__texStyle(styleCurrent))) + elif ch == b' ': + if self.editor.byteAt(pos + 1) == b' ': + f.write("{\\hspace*{1em}}") + else: + f.write(' ') else: - f.write(' ') - else: - if ord(ch) > 127 and utf8: - utf8Ch += ch - if utf8Len == 0: - if (utf8Ch[0] & 0xF0) == 0xF0: - utf8Len = 4 - elif (utf8Ch[0] & 0xE0) == 0xE0: - utf8Len = 3 - elif (utf8Ch[0] & 0xC0) == 0xC0: - utf8Len = 2 - elif len(utf8Ch) == utf8Len: - ch = utf8Ch.decode('utf8') - f.write(ch) - utf8Ch = b"" - utf8Len = 0 - else: - f.write(ch.decode()) - lineIdx += 1 - pos += 1 - - # close last empty style macros and document too - f.write("}\n} %end tiny\n\n\\end{document}\n") - f.close() + if ord(ch) > 127 and utf8: + utf8Ch += ch + if utf8Len == 0: + if (utf8Ch[0] & 0xF0) == 0xF0: + utf8Len = 4 + elif (utf8Ch[0] & 0xE0) == 0xE0: + utf8Len = 3 + elif (utf8Ch[0] & 0xC0) == 0xC0: + utf8Len = 2 + elif len(utf8Ch) == utf8Len: + ch = utf8Ch.decode('utf8') + f.write(ch) + utf8Ch = b"" + utf8Len = 0 + else: + f.write(ch.decode()) + lineIdx += 1 + pos += 1 + + # close last empty style macros and document too + f.write("}\n} %end tiny\n\n\\end{document}\n") except IOError as err: E5MessageBox.critical( self.editor,