From da48a65f7e454f173c138f38ac4cc5661f4c1cea Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 8 Mar 2018 22:56:58 +0000 Subject: plantuml (8mar18) git-svn-id: svn://tug.org/texlive/trunk@46892 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/lualatex/plantuml/plantuml.lua | 48 ++++++++++++ .../texmf-dist/tex/lualatex/plantuml/plantuml.sty | 90 ++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 Master/texmf-dist/tex/lualatex/plantuml/plantuml.lua create mode 100644 Master/texmf-dist/tex/lualatex/plantuml/plantuml.sty (limited to 'Master/texmf-dist/tex/lualatex/plantuml') diff --git a/Master/texmf-dist/tex/lualatex/plantuml/plantuml.lua b/Master/texmf-dist/tex/lualatex/plantuml/plantuml.lua new file mode 100644 index 00000000000..d94e93b5b44 --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/plantuml/plantuml.lua @@ -0,0 +1,48 @@ +-- SPDX-License-Identifier: LPPL-1.3c+ + +require "lfs" + +-- @param mode directly passed to PlantUML. Recommended: png, svg, pdf (requires Apache Batik to convert svg to pdf) +function convertPlantUmlToTikz(jobname, mode) + local plantUmlSourceFilename = jobname .. "-plantuml.txt" + local plantUmlTargetFilename = jobname .. "-plantuml." .. mode + + -- delete generated file to ensure they are really recreated + os.remove(plantUmlTargetFilename) + + if not (lfs.attributes(plantUmlSourceFilename)) then + texio.write_nl("Source " .. plantUmlSourceFilename .. " does not exist.") + return + end + + local plantUmlJar = os.getenv("PLANTUML_JAR") + if not plantUmlJar then + texio.write_nl("Environment variable PLANTUML_JAR not set.") + return + end + + texio.write("Executing PlantUML... ") + local cmd = "java -jar " .. plantUmlJar .. " -t" + if (mode == "latex") then + cmd = cmd .. "latex:nopreamble" + else + cmd = cmd .. mode + end + cmd = cmd .. " " .. plantUmlSourceFilename + texio.write_nl(cmd) + local handle,error = io.popen(cmd) + if not handle then + texio.write_nl("Error during execution of PlantUML.") + texio.write_nl(error) + return + end + io.close(handle) + + if not (lfs.attributes(plantUmlTargetFilename)) then + texio.write_nl("PlantUML did not generate anything.") + handle = io.open(plantUmlTargetFilename, "w") + handle:write("Error during latex code generation") + io.close(handle) + return + end +end diff --git a/Master/texmf-dist/tex/lualatex/plantuml/plantuml.sty b/Master/texmf-dist/tex/lualatex/plantuml/plantuml.sty new file mode 100644 index 00000000000..3f16671ea06 --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/plantuml/plantuml.sty @@ -0,0 +1,90 @@ +%% Copyright (C) 2018 Oliver Kopp, https://github.com/koppor +%% +%% SPDX-License-Identifier: LPPL-1.3c+ +\NeedsTeXFormat{LaTeX2e}\relax +\ProvidesPackage{plantuml} + [2018/03/08 v0.1.0 + Embed PlantUML diagrams in latex documents.] + +% Required by PlantUML LaTeX output +\RequirePackage{tikz} +\RequirePackage{aeguill} + +% Enable checking for active -shell-escape +% Source: https://tex.stackexchange.com/a/88620/9075 +\RequirePackage{pdftexcmds} + +% Prepare writing contents of a self-defined environment to a file +% Source: https://tex.stackexchange.com/a/130298/9075 +\RequirePackage{fancyvrb} + +\RequirePackage{l3keys2e} +\RequirePackage{xparse} + +\RequirePackage{ifthen} + +\RequirePackage{adjustbox} + +\ExplSyntaxOn +\keys_define:nn { plantuml } { + output .choices:nn = { + {latex, png, svg} + { \tl_gset:NV \l_plantuml_mode \l_keys_choice_tl } + }, + output .initial:n = latex +} +\ProcessKeysOptions { plantuml } +\ExplSyntaxOff + +%hint from https://tex.stackexchange.com/a/86355/9075 +\makeatletter +\def\maxwidth#1{\ifdim\Gin@nat@width>#1 #1\else\Gin@nat@width\fi} +\makeatother + +\ifluatex + \ExplSyntaxOn + \let\PlantUmlMode\l_plantuml_mode + \ExplSyntaxOff + \RequirePackage{luacode} + \makeatletter + \ifcase\pdf@shellescape + \message{No shell escape. PlantUML cannot be called. Start lualatex with -shell-escape.} + \newenvironment{plantuml}{% + No shell escape. PlantUML cannot be called. Start lualatex with -shell-escape. + }{} + \or + \directlua{ + local plantUmlJar = os.getenv("PLANTUML_JAR") + if not plantUmlJar then + texio.write_nl("Environment variable PLANTUML_JAR not set.") + end + } + \NewDocumentEnvironment{plantuml}{}{% + \VerbatimOut{\jobname-plantuml.txt}} + {% + \endVerbatimOut + \directlua{ + local jobname=\luastring{\jobname} + local plantUmlMode=\luastring{\PlantUmlMode} + require("plantuml.lua") + convertPlantUmlToTikz(jobname, plantUmlMode) + } + \ifthenelse{\equal{\PlantUmlMode}{latex}}{ + \begin{adjustbox}{max width=\linewidth} + \input{\jobname-plantuml.latex} + \end{adjustbox} + }{ + \includegraphics[width=\maxwidth{\textwidth}]{\jobname-plantuml.\PlantUmlMode} + } + } + \or + \message{Restricted shell escape. PlantUML cannot be called. Start lualatex with -shell-escape.} + \newenvironment{plantuml}{% + Restricted shell escape. PlantUML cannot be called. Start lualatex with -shell-escape. + }{} + \fi + \makeatother +\else + \typeout{*** plantuml only works with lualatex ***} +\fi + -- cgit v1.2.3