From 10c88aa58f9d93dd7e56c8a2cbd300c5b3524313 Mon Sep 17 00:00:00 2001 From: Martin Vermeer 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 1da5b97c8b..99d9fe42fb 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 3e60d20418..a11050fb91 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -712,9 +712,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" "" @@ -934,6 +934,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 713eab1e3a..eb10ca35c0 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 bacaf3e969..61a910bb86 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 0000000000..cd9a4840bd --- /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 0000000000..72d30740d8 --- /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.39.2