Attached a git patch for your consideration ;-) Martin ________________________________________ From: Pavel Sanda [sa...@lyx.org] Sent: Thursday, September 01, 2016 10:41 PM To: Jean-Marc Lasgouttes Cc: lyx-devel@lists.lyx.org; Vermeer Martin Subject: Re: Inkscape /LyX integration (working!)
Jean-Marc Lasgouttes wrote: > Of course, I can give you git access :) +1 Pavel
From ed2997e78e5015cb4eff2a988c729fd1f1cde216 Mon Sep 17 00:00:00 2001 From: Martin Vermeer <mverm...@aalto.fi> Date: Sat, 3 Sep 2016 17:17:45 +0300 Subject: [PATCH] Initial commit of Inkscape SVG LaTeX + PDF support Based on Daniel Groger's work of five years ago, with minor changes http://www.mail-archive.com/lyx-devel%40lists.lyx.org/msg169820.html This extends the support for Xfig LaTeX + PDF to a more modern and actively developed vector graphics editor. Embedded Objects manual updated, also to include a workaround for an Inkscape 0.91 bug. --- lib/Makefile.am | 2 + lib/configure.py | 6 ++- lib/doc/EmbeddedObjects.lyx | 117 +++++++++++++++++++++++++++++++++++++++++++- lib/doc/workaround.png | Bin 0 -> 17450 bytes lib/external_templates | 42 ++++++++++++++++ lib/scripts/svg2pdftex.py | 57 +++++++++++++++++++++ lib/scripts/svg2pstex.py | 49 +++++++++++++++++++ 7 files changed, 269 insertions(+), 4 deletions(-) create mode 100644 lib/doc/workaround.png create mode 100644 lib/scripts/svg2pdftex.py create mode 100644 lib/scripts/svg2pstex.py diff --git a/lib/Makefile.am b/lib/Makefile.am index 1da5b97..99d9fe4 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -2316,6 +2316,8 @@ dist_scripts_DATA += \ scripts/fen2ascii.py \ scripts/fig2pdftex.py \ scripts/fig2pstex.py \ + scripts/svg2pdftex.py \ + scripts/svg2pstex.py \ scripts/fig_copy.py \ scripts/html2latexwrapper.py \ scripts/include_bib.py \ diff --git a/lib/configure.py b/lib/configure.py index d3d1c31..e2f43d3 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -711,9 +711,9 @@ def checkFormatEntries(dtl_tools): \Format jlyx cjklyx "CJK LyX 1.4.x (euc-jp)" "" "" "" "document" "" \Format klyx cjklyx "CJK LyX 1.4.x (euc-kr)" "" "" "" "document" "" \Format lyxpreview lyxpreview "LyX Preview" "" "" "" "" "" -\Format pdftex pdftex_t PDFTEX "" "" "" "" "" +\Format pdftex "pdftex_t, pdf_tex" PDFTEX "" "" "" "" "" \Format program "" Program "" "" "" "" "" -\Format pstex pstex_t PSTEX "" "" "" "" "" +\Format pstex "pstex_t, ps_tex" PSTEX "" "" "" "" "" \Format wmf wmf "Windows Metafile" "" "" "" "vector" "image/x-wmf" \Format emf emf "Enhanced Metafile" "" "" "" "vector" "image/x-emf" \Format wordhtml "html, htm" "HTML (MS Word)" "" "" "" "document" "" @@ -933,6 +933,8 @@ def checkConverterEntries(): \converter fig ppm "fig2dev -L ppm $$i $$o" "" \converter fig svg "fig2dev -L svg $$i $$o" "" \converter fig png "fig2dev -L png $$i $$o" "" +\converter svg pdftex "python -tt $$s/scripts/svg2pdftex.py $$i $$o" "" +\converter svg pstex "python -tt $$s/scripts/svg2pstex.py $$i $$o" "" \converter fig pdftex "python -tt $$s/scripts/fig2pdftex.py $$i $$o" "" \converter fig pstex "python -tt $$s/scripts/fig2pstex.py $$i $$o" ""''') # diff --git a/lib/doc/EmbeddedObjects.lyx b/lib/doc/EmbeddedObjects.lyx index 713eab1..eb10ca3 100644 --- a/lib/doc/EmbeddedObjects.lyx +++ b/lib/doc/EmbeddedObjects.lyx @@ -1,5 +1,5 @@ -#LyX 2.2 created this file. For more info see http://www.lyx.org/ -\lyxformat 508 +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 512 \begin_document \begin_header \save_transient_properties true @@ -171,6 +171,7 @@ graphicboxes \font_osf false \font_sf_scale 100 100 \font_tt_scale 100 100 +\use_microtype false \graphics default \default_output_format pdf2 \output_sync 0 @@ -38609,6 +38610,118 @@ target "http://en.wikipedia.org/wiki/Xfig" . \end_layout +\begin_layout Description +Inkscape +\begin_inset space ~ +\end_inset + +figure This experimental template supports images created with the program + +\begin_inset CommandInset href +LatexCommand href +name "Inkscape" +target "https://fi.wikipedia.org/wiki/Inkscape" + +\end_inset + +. + It works very similarly to Xfig support, except that Inkscape is a more + modern image editor than Xfig, which uses Scalable Vector Graphics (SVG) + as its native format. +\end_layout + +\begin_deeper +\begin_layout Standard +LyX will process the image file in much the same way as it does an Xfig + image, extracting the text into a separate TeX file for the text strings, + and a PDF file for the rest. +\end_layout + +\begin_layout Description +Warning: Unfortunately the latest version of Inkscape, 0.91, contains a bug: + with multi-page PDFs, the TeX file will sometimes reference more pages + than the PDF file contains. + This is the version that ships with Ubuntu 16.04. + Its use with LyX can therefore not be recommended, until the bug is fixed +\begin_inset Foot +status open + +\begin_layout Plain Layout +A workaround for those who have already SVG figures in their document is, + to manually do the LaTeX+PDF output from Inkscape, edit the +\family typewriter +.pdf_tex +\family default + file to remove the erroneous references, and +\family typewriter + +\backslash +input +\family default + it directly into LyX, i.e., not use the external-template mechanism: +\end_layout + +\begin_layout Plain Layout +\begin_inset Graphics + filename workaround.png + scale 50 + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +Here, the child document input inset ( +\family sans +Insert\SpecialChar menuseparator +File\SpecialChar menuseparator +Child Document +\family default +) was used, which allows you do directly edit the +\family typewriter +.pdf_tex +\family default + file in a text editor. + The LaTeX output is based on this edited snippet as re-generation from + the SVG file has been commented out. +\end_layout + +\end_inset + +. +\end_layout + +\begin_deeper +\begin_layout Standard +The reason why we would use this complicated process at all, like in the + case of Xfig, is that it makes the text strings inside the figure of the + same font type and attributes as the surrounding text, which looks so much + more professional. + With Inkscape, even the +\emph on +size +\emph default + of the font is taken from the surrounding LaTeX document â in Xfig, you + have to set it by hand to be the same. + Of course you can always embed LaTeX modifiers like +\family typewriter + +\backslash +Large +\family default +, +\family typewriter + +\backslash +small +\family default +, etc. + into your figure text strings. +\end_layout + +\end_deeper +\end_deeper \begin_layout Standard \begin_inset Float table placement !h diff --git a/lib/doc/workaround.png b/lib/doc/workaround.png new file mode 100644 index 0000000000000000000000000000000000000000..9e568b01dea3c17b07837bda11dedba0b2b9f59f GIT binary patch literal 17450 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 L5iJtY`SJe%pnjd6 literal 0 HcmV?d00001 diff --git a/lib/external_templates b/lib/external_templates index f54a298..865ec3e 100644 --- a/lib/external_templates +++ b/lib/external_templates @@ -290,6 +290,48 @@ Template XFig TemplateEnd +Template Inkscape + GuiName "Inkscape figure" + HelpText + An Inkscape figure. + This template should work flawlessly with Inkscape 0.48. + For Inkscape 0.91, there is a bug in the LaTeX + PDF output + which makes a workaround necessary, see Embedded Objects manual. + HelpTextEnd + InputFormat svg + FileFilter "*.svg" + AutomaticProduction true + Transform Rotate + Preview InstantPreview + Format PDFLaTeX + TransformCommand Rotate RotationLatexCommand + # Resize is not desirable here, as fonts are sized to surrounding LaTeX font + Product "$$RotateFront\\input{$$AbsOrRelPathMaster$$Basename.pdf_tex}$$RotateBack" + UpdateFormat pdftex + UpdateResult "$$AbsPath$$Basename.pdf_tex" + Requirement "color" + Requirement "graphicx" + # Preamble WarnNotFound + # Preamble InputOrWarn + ReferencedFile pdflatex "$$AbsOrRelPathMaster$$Basename.pdf_tex" + ReferencedFile pdflatex "$$AbsPath$$Basename.pdf" + FormatEnd + Format LaTeX + TransformCommand Rotate RotationLatexCommand + Product "$$RotateFront\\input{$$AbsOrRelPathMaster$$Basename.eps_tex}$$RotateBack" + UpdateFormat pstex + UpdateResult "$$AbsPath$$Basename.eps_tex" + Requirement "color" + Requirement "graphicx" + # Preamble WarnNotFound + # Preamble InputOrWarn + ReferencedFile latex "$$AbsOrRelPathMaster$$Basename.eps_tex" + ReferencedFile latex "$$AbsPath$$Basename.eps" + ReferencedFile dvi "$$AbsPath$$Basename.eps" + FormatEnd +TemplateEnd + + Template ChessDiagram GuiName "Chess diagram" HelpText diff --git a/lib/scripts/svg2pdftex.py b/lib/scripts/svg2pdftex.py new file mode 100644 index 0000000..cd9a484 --- /dev/null +++ b/lib/scripts/svg2pdftex.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# file svg2pdftex.py +# +# This script converts an SVG image to something that pdflatex can process +# into high quality PDF. + +# Usage: +# python svg2pdftex.py ${base}.svg ${base}.pdft +# This command generates +# ${base}.pdf the converted pdf file +# ${base}.pdft a tex file that can be included in your latex document +# using '\input{${base}.pdft}' +# +# Note: +# Do not use this command as +# python svg2pdftex.py file.svg file.pdf +# the real pdf file will be overwritten by a tex file named file.pdf. +# + + + +import os, sys, re + + +def runCommand(cmd): + ''' Utility function: + run a command, quit if fails + ''' + if os.system(cmd) != 0: + print "Command '%s' fails." % cmd + sys.exit(1) + + +# We expect two args, the names of the input and output files. +if len(sys.argv) != 3: + sys.exit(1) + +input, output = sys.argv[1:] + +# Fail silently if the file doesn't exist +if not os.path.isfile(input): + sys.exit(0) + +# Strip the extension from ${output} +outbase = os.path.splitext(output)[0] + + + +# Inkscape 0.48 can output the image as a PDF file ${base}.pdf and place the text +# in a LaTeX file ${base}.pdf_tex, which is renamed to ${output}, for typesetting +# by pdflatex itself. +runCommand('inkscape --file=%s --export-pdf=%s.pdf --export-latex' % (input, outbase)) + +os.rename('%s.pdf_tex' % outbase, output) + diff --git a/lib/scripts/svg2pstex.py b/lib/scripts/svg2pstex.py new file mode 100644 index 0000000..72d3074 --- /dev/null +++ b/lib/scripts/svg2pstex.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# file svg2pstex.py +# +# This script converts an SVG image to something that latex can process +# into high quality PostScript. + +# Usage: +# python svg2pstex.py ${base}.fig ${base}.pstex +# This command generates +# ${base}.eps the converted eps file +# ${base}.pstex a tex file that can be included in your latex document +# using '\input{${output}}'. +# +# Note: +# Do not use this command as +# python svg2pstex.py file.fig file.eps +# the real eps file will be overwritten by a tex file named file.eps. +# + +import os, sys + +def runCommand(cmd): + ''' Utility function: + run a command, quit if fails + ''' + if os.system(cmd) != 0: + print "Command '%s' fails." % cmd + sys.exit(1) + +# We expect two args, the names of the input and output files. +if len(sys.argv) != 3: + sys.exit(1) + +input, output = sys.argv[1:] + +# Fail silently if the file doesn't exist +if not os.path.isfile(input): + sys.exit(0) + +# Strip the extension from ${output} +outbase = os.path.splitext(output)[0] + +# Inkscape 0.48 can output the image as a EPS file ${base}.pdf and place the text +# in a LaTeX file ${base}.eps_tex, which is renamed to ${output}, for typesetting +# by latex itself. +runCommand('inkscape --file=%s --export-eps=%s.eps --export-latex' % (input, outbase)) +os.rename('%s.eps_tex' % outbase, output) -- 2.7.4