texlive/source-missed-scripts.dif

1246 lines
35 KiB
Plaintext

---
texk/texlive/linked_scripts/diadia/diadia.lua | 298 ++++++
texk/texlive/linked_scripts/glossaries/makeglossaries-lite.lua | 471 ++++++++++
texk/texlive/linked_scripts/make4ht/make4ht | 62 +
texk/texlive/linked_scripts/pdfbook2/pdfbook2 | 237 +++++
texk/texlive/linked_scripts/tex4ebook/tex4ebook | 154 +++
5 files changed, 1222 insertions(+)
--- texk/texlive/linked_scripts/diadia/diadia.lua
+++ texk/texlive/linked_scripts/diadia/diadia.lua 2016-01-29 11:39:38.599088869 +0000
@@ -0,0 +1,298 @@
+#!/usr/bin/env texlua
+--
+-- diadia [options]
+--
+-- loads and processes a diadia data file
+--
+-- License: LPPL
+--
+local version = "v1.0 (2015/05/15)"
+
+local infile = ""
+local outfile = ""
+local mode = "*"
+local startdate = ""
+local enddate = ""
+local columns = ""
+local data = {}
+function pversion()
+ print("diadia.lua " .. version)
+ print("(C) Josef Kleber 2015 License: LPPL")
+ os.exit(0)
+end
+function phelp()
+ print([[
+diadia.lua [options]
+
+ allows you to
+
+ - cut a chunk out of the data file
+ e.g.: -i in.dat -o out.dat -s YYYY-MM-DD -e YYYY-MM-DD
+
+ - compose a new data file based on given columns of an
+ existing data file
+ e.g.: -i in.dat -o out.dat -c 1,2
+
+ - create a new data file with date and value (1st and
+ 2nd column of existing file) and added value average
+ columns of the last 7, 14, 30, 60 and 90 days
+ e.g.: -i in.dat -o out.dat [-s YYYY-MM-DD -e YYYY-MM-DD]
+
+ Options:
+
+ -m specify the mode (cut|compose|average)
+
+ -i specify the input file
+
+ -o specify the output file
+
+ -c specify the columns for compose mode
+
+ -s specify the start date (YYYY-MM-DD) in
+ cut and average mode
+
+ -e specify the end date
+
+ -v prints version information
+
+ -h prints help information
+
+]])
+ pversion()
+end
+function check_date(date)
+ if string.find(date, "(%d%d%d%d)-(%d%d)-(%d%d)") == nil
+ then
+ io.stderr:write ("Error 21: wrong date format (YYYY-MM-DD)\n")
+ os.exit(11)
+ end
+end
+function parse_date(date)
+ return string.match(date, "(%d%d%d%d)%-(%d%d)%-(%d%d)")
+end
+function parse_dateinline(line)
+ return string.match(line, "(%d%d%d%d%-%d%d%-%d%d)")
+end
+function daystring(unixtime)
+ return os.date("%Y-%m-%d", unixtime)
+end
+function unixtime(year,month,day)
+ return os.time{year=year, month=month, day=day}
+end
+function round(number)
+ return math.floor(number+0.5)
+end
+function ptd(value)
+ local val = tostring(value)
+ local slen = string.len(val)
+ if slen == 3
+ then
+ return val
+ else
+ return val .. " "
+ end
+end
+function calc_avg(data,date,days)
+ local sum = 0
+ local wdays = 0
+ local wday
+ local endday = unixtime(parse_date(date))
+ local startday = endday - 60*60*24*(days-1)
+ while startday <= endday
+ do
+ wday = daystring(startday)
+ if data[wday] ~= nil
+ then
+ sum = sum + data[wday]
+ wdays = wdays + 1
+ end
+ startday = startday + 60*60*24
+ end
+ if wdays == 0
+ then
+ return "nan"
+ else
+ return tostring(round(sum/wdays))
+ end
+end
+function read_data(file)
+ local data = {}
+ local date
+ local startdate
+ local enddate
+ local dat
+ local firstline = true
+ for line in io.lines(file)
+ do
+ if string.match(line, "date")
+ then
+ else
+ date, dat = string.match(line, "(%d%d%d%d%-%d%d%-%d%d)%s+(%S+)")
+ if firstline == true
+ then
+ startdate = date
+ firstline = false
+ end
+ if dat ~= "nan" and dat ~= "{}" and dat ~= ""
+ then
+ data[date] = dat
+ end
+ end
+ end
+ enddate = date
+ return data,startdate,enddate
+end
+function write_avg_file(data,file,startdate,enddate)
+ local sdate
+ local edate
+ local wday
+ sdate = unixtime(parse_date(startdate))
+ edate = unixtime(parse_date(enddate))
+ outfile = assert(io.open(file, "w"))
+ outfile:write("date value avg07 avg14 avg30 avg60 avg90")
+ while sdate <= edate+7200
+ do
+ wday = daystring(sdate)
+ if data[wday] ~= nil
+ then
+ outfile:write("\n" .. wday .. " "
+ .. ptd(data[wday]) .. " "
+ .. ptd(calc_avg(data,wday,7)) .. " "
+ .. ptd(calc_avg(data,wday,14)) .. " "
+ .. ptd(calc_avg(data,wday,30)) .. " "
+ .. ptd(calc_avg(data,wday,60)) .. " "
+ .. ptd(calc_avg(data,wday,90)))
+ end
+ sdate = sdate + 60*60*24
+ end
+ outfile:close()
+end
+do
+ local newarg = {}
+ local i, limit = 1, #arg
+ while (i <= limit) do
+ if arg[i] == "-i" then
+ infile = arg[i+1]
+ i = i + 1
+ elseif arg[i] == "-o" then
+ outfile = arg[i+1]
+ i = i + 1
+ elseif arg[i] == "-s" then
+ startdate = arg[i+1]
+ i = i + 1
+ elseif arg[i] == "-e" then
+ enddate = arg[i+1]
+ i = i + 1
+ elseif arg[i] == "-c" then
+ columns = arg[i+1]
+ i = i + 1
+ elseif arg[i] == "-m" then
+ mode = arg[i+1]
+ i = i + 1
+ elseif arg[i] == "-v" then
+ pversion()
+ elseif arg[i] == "-h" then
+ phelp()
+ else
+ newarg[#newarg+1] = arg[i]
+ end
+ i = i + 1
+ end
+ arg = newarg
+end
+if mode == "average"
+then
+ local startd
+ local endd
+
+ print("set mode to " .. mode)
+ print("reading data file " .. infile)
+ data,startd,endd = read_data(infile)
+ if startdate ~= ""
+ then
+ startd = startdate
+ end
+ if enddate ~= ""
+ then
+ endd = enddate
+ end
+ print("writing data file " .. outfile)
+ write_avg_file(data,outfile,startd,endd)
+ os.exit(0)
+end
+if mode == "compose"
+then
+ local row = 0
+ local column = 0
+ local ofile
+ local cols
+
+ print("set mode to " .. mode)
+ print("reading data file " .. infile)
+ for line in io.lines(infile)
+ do
+ row = row + 1
+ data[row] = {}
+ column = 0
+ for value in string.gmatch(line, "%S+")
+ do
+ column = column + 1
+ data[row][column] = value
+ end
+ end
+ cols = assert(load("return table.concat({"..columns:gsub("%d+","(...)[%0]").."},' ')"))
+ ofile = assert(io.open(outfile, "w"))
+ print("writing data file " .. outfile)
+ for irow = 1,row
+ do
+ if irow == row
+ then
+ ofile:write(cols(data[irow]))
+ else
+ ofile:write(cols(data[irow]).."\n")
+ end
+ end
+ ofile:close()
+ os.exit(0)
+end
+if mode == "cut"
+then
+ local ofile
+ local date
+ local sdate
+ local edate
+ local cdate
+
+ check_date(startdate)
+ check_date(enddate)
+ sdate = unixtime(parse_date(startdate))
+ edate = unixtime(parse_date(enddate))
+ print("set mode to " .. mode)
+ print("reading data file " .. infile)
+ print("writing data file " .. outfile)
+ ofile = assert(io.open(outfile, "w"))
+ for line in io.lines(infile)
+ do
+ if string.match(line, "date")
+ then
+ ofile:write(line)
+ else
+ date = parse_dateinline(line)
+ cdate = unixtime(parse_date(date))
+ if cdate >= sdate and cdate <= edate
+ then
+ ofile:write("\n" .. line)
+ end
+ end
+ end
+ ofile:close()
+ os.exit(0)
+end
+if mode == "*"
+then
+ io.stderr:write ("Error 11: no mode specified!")
+ os.exit(11)
+else
+ io.stderr:write ("Error 12: invalid mode " .. mode)
+ os.exit(12)
+end
--- texk/texlive/linked_scripts/glossaries/makeglossaries-lite.lua
+++ texk/texlive/linked_scripts/glossaries/makeglossaries-lite.lua 2016-01-29 12:25:37.115559979 +0000
@@ -0,0 +1,471 @@
+#!/usr/bin/env texlua
+--[[
+ File : makeglossaries.lua
+ Author : Nicola Talbot
+
+ Lua alternative to the makeglossaries Perl script.
+
+ Since Lua has limitations, this script isn't an exact
+ replacement to the Perl script. In particular the makeglossaries -d
+ switch isn't implemented in this Lua version.
+ This also doesn't provide the more detailed diagnostics that the Perl
+ version does nor does it attempt any language mappings. Since xindy
+ requires Perl, don't use this script if you want to use xindy. Instead
+ use the Perl makeglossaries script.
+
+ This file is distributed as part of the glossaries LaTeX package.
+ Copyright 2015 Nicola L.C. Talbot
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either version 1.3
+ of this license or any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+ and version 1.3 or later is part of all distributions of LaTeX
+ version 2005/12/01 or later.
+
+ This work has the LPPL maintenance status `maintained'.
+
+ History:
+ * 1.1 changed first line from lua to texlua
+--]]
+
+thisversion = "1.1 2015-07-17"
+
+quiet = false
+dryrun = false
+
+infile = nil
+outfile = nil
+styfile = nil
+logfile = nil
+
+isxindy = false
+
+xindylang = nil
+xindyexec = "xindy"
+
+makeindex_c = false
+makeindex_g = false
+letterorder = false
+makeindex_r = false
+makeindex_p = nil
+makeindex_m = "makeindex"
+
+function version()
+ print(string.format("makeglossaries.lua version %s", thisversion))
+ print("Copyright (C) 2015 Nicola L C Talbot")
+ print("This material is subject to the LaTeX Project Public License.")
+end
+
+function help()
+ version()
+ print([[
+Syntax : makeglossaries.lua [options] <filename>
+
+For use with the glossaries package to pass relevant
+files to makeindex or xindy.
+
+<filename> Base name of glossary file(s). This should
+ be the name of your main LaTeX document without any
+ extension. If you do add an extension, only that
+ glossary file will be processed.
+
+General Options:
+
+-o <gls> Use <gls> as the output file.
+ (Don't use -o if you have more than one glossary.)
+-s <sty> Employ <sty> as the style file.
+-t <log> Employ <log> as the transcript file.
+ (Don't use -t if you have more than one glossary
+ or the transcripts will be overwritten.)
+-q Quiet mode.
+-l Letter ordering.
+-n Print the command that would normally be executed,
+ but don't execute it (dry run).
+--help Print this help message.
+--version Print the version.
+
+Xindy Options:
+
+-L <language> Use <language>.
+-x <file> Full path to xindy executable.
+ (Default assumes xindy is on the operating system's path.)
+
+Makeindex Options:
+(See makeindex documentation for further details on these options.)
+
+-c Compress intermediate blanks.
+-g Employ German word ordering.
+-p <num> Set the starting page number to be <num>.
+-r Disable implicit page range formation.
+-m <file> Full path to makeindex executable.
+ (Default assumes makeindex is on the operating system's path.)
+
+This is a light-weight Lua alternative to the makeglossaries Perl script.
+If you want to use xindy, it's better to use the Perl makeglossaries version
+instead.
+]])
+end
+
+function dorun(name, glg, gls, glo, language, codepage)
+
+ if isxindy then
+ doxindy(name, glg, gls, glo, language, codepage)
+ else
+ domakeindex(name, glg, gls, glo)
+ end
+
+end
+
+function doxindy(name, glg, gls, glo, language, codepage)
+
+ cmd = string.format('"%s" -I xindy -L %s -C %s -M "%s" -t "%s" -o "%s"',
+ xindyexec, language, codepage, styfile, glg, gls)
+
+ if letterorder then cmd = string.format('%s -M ord/letorder', cmd) end
+
+ if quiet then cmd = string.format('%s -q', cmd) end
+
+ cmd = string.format('%s "%s"', cmd, glo)
+
+ if dryrun then
+
+ print(cmd)
+
+ else
+
+ assert(os.execute(cmd),
+ string.format("Failed to execute '%s'", cmd))
+
+ end
+
+end
+
+function domakeindex(name, glg, gls, glo)
+
+ cmd = string.format('"%s"', makeindex_m)
+
+ if makeindex_c then cmd = cmd .. " -c" end
+
+ if makeindex_g then cmd = cmd .. " -g" end
+
+ if letterorder then cmd = cmd .. " -l" end
+
+ if quiet then cmd = cmd .. " -q" end
+
+ if glg ~= nil then cmd = string.format('%s -t "%s"', cmd, glg) end
+
+ if gls ~= nil then cmd = string.format('%s -o "%s"', cmd, gls) end
+
+ if makeindex_p ~= nil then
+ cmd = string.format("%s -p %s", cmd, makeindex_p)
+ end
+
+ if styfile ~= nil then
+ cmd = string.format('%s -s "%s"', cmd, styfile)
+ end
+
+ cmd = string.format('%s "%s"', cmd, glo)
+
+ if dryrun then
+ print(cmd)
+ else
+ assert(os.execute(cmd),
+ string.format("Failed to execute '%s'", cmd))
+ end
+
+end
+
+if #arg < 1
+then
+ error("Syntax error: filename expected. Use --help for help.")
+end
+
+i = 1
+
+while i <= #arg do
+
+-- General Options
+ if arg[i] == "-q" then
+ quiet = true
+ elseif arg[i] == "-n"
+ then
+ dryrun = true
+ elseif arg[i] == "-o"
+ then
+ i = i + 1
+ if i > #arg then error("-o requires a filename") end
+ outfile = arg[i]
+ elseif arg[i] == "-s"
+ then
+ i = i + 1
+ if i > #arg then error("-s requires a filename") end
+ styfile = arg[i]
+ elseif arg[i] == "-t"
+ then
+ i = i + 1
+ if i > #arg then error("-t requires a filename") end
+ logfile = arg[i]
+ elseif arg[i] == "--version"
+ then
+ version()
+ os.exit()
+ elseif arg[i] == "--help"
+ then
+ help()
+ os.exit()
+-- General options for the Perl version that aren't implemented by
+-- this light-weight version:
+ elseif (arg[i] == "-Q") or (arg[i] == "-k")
+ then
+ print(string.format("Ignoring option '%s' (only available with the Perl version).", arg[i]))
+ elseif arg[i] == "-d"
+ then
+ error(string.format(
+ "The '%s' option isn't available for this light-weight version.\nYou will need to use the Perl version instead.",
+ arg[i]))
+
+-- Xindy Options
+ elseif arg[i] == "-L"
+ then
+ i = i + 1
+ if i > #arg then error("-L requires a language name") end
+ xindylang = arg[i]
+ elseif arg[i] == "-x"
+ then
+ i = i + 1
+ if i > #arg then error("-x requires a filename") end
+ xindyexec = arg[i]
+
+-- Makeindex Options
+ elseif arg[i] == "-c"
+ then
+ makeindex_c = true
+ elseif arg[i] == "-g"
+ then
+ makeindex_g = true
+ elseif arg[i] == "-l"
+ then
+ letterorder = true
+ elseif arg[i] == "-r"
+ then
+ makeindex_r = true
+ elseif arg[i] == "-p"
+ then
+ i = i + 1
+ if i > #arg then error("-p requires a page number") end
+ makeindex_p = arg[i]
+ elseif arg[i] == "-m"
+ then
+ i = i + 1
+ if i > #arg then error("-m requires a filename") end
+ makeindex_m = arg[i]
+
+-- Unknown Option
+ elseif string.sub(arg[i], 1, 1) == "-"
+ then
+ error(
+ string.format("Syntax error: unknown option '%s'. Use '--help' for help.",
+ arg[i]));
+
+-- Input file
+ elseif infile == nil
+ then
+ infile = arg[i]
+ else
+ error("Syntax error: only one filename permitted");
+ end
+
+ i = i + 1
+end
+
+if not quiet then
+ print(string.format("makeglossaries.lua version %s", thisversion))
+end
+
+if infile == nil
+then
+ error("Syntax error: missing filename")
+end
+
+i, j = string.find(infile, "%.%a*$")
+
+ext = nil
+inbase = infile
+
+if i ~= nil
+then
+ ext = string.sub(infile, i, j);
+
+ lext = string.lower(ext)
+
+ inbase = string.sub(infile, 1, i-1);
+
+ -- Just in case user has accidentally specified the aux or tex file
+ if lext == ".aux" or lext == ".tex"
+ then
+ ext = nil
+ infile = inbase
+ end
+end
+
+auxfile = inbase..".aux"
+
+if not quiet then print(string.format("Parsing '%s'", auxfile)) end
+
+assert(io.input(auxfile),
+ string.format("Unable to open '%s'", auxfile))
+
+aux = io.read("*a")
+
+if styfile == nil
+then
+ styfile = string.match(aux, "\\@istfilename{\"?([^}]*%.?%a*)\"?}")
+
+ if styfile == nil
+ then
+ error([[
+No \@istfilename found.
+Did your LaTeX run fail?
+Did your LaTeX run produce any output?
+Did you remember to use \makeglossaries?
+ ]])
+ end
+end
+
+i = string.len(styfile)
+
+if string.sub(styfile, i-3, i) == ".xdy"
+then
+ isxindy = true
+end
+
+if not letterorder
+then
+ if string.match(aux, "\\@glsorder{letter}") ~= nil
+ then
+ letterorder = true
+ end
+end
+
+if dryrun then print("Dry run mode. No commands will be executed.") end
+
+onlyname = nil
+
+glossaries = {}
+
+for name, glg, gls, glo in
+ string.gmatch(aux, "\\@newglossary{([^}]+)}{([^}]+)}{([^}]+)}{([^}]+)}") do
+
+ if not quiet then
+ print(string.format("Found glossary type '%s' (%s,%s,%s)",
+ name, glg, gls, glo))
+ end
+
+ glossaries[name] = {}
+
+ glossaries[name].glg = glg
+ glossaries[name].gls = gls
+ glossaries[name].glo = glo
+
+ if "."..glo == ext then
+
+ onlyname = name
+
+ end
+
+ if isxindy then
+
+ if xindylang == nil then
+ glossaries[name].language = string.match(aux,
+ "\\@xdylanguage{"..name.."}{([^}]+)}");
+ else
+ glossaries[name].language = xindylang
+ end
+
+ glossaries[name].codepage = string.match(aux,
+ "\\@gls@codepage{"..name.."}{([^}]+)}");
+
+ end
+
+end
+
+
+if ext == nil
+then
+
+ done = false
+
+ for name, value in pairs(glossaries) do
+
+ glg = value.glg
+ gls = value.gls
+ glo = value.glo
+
+ if logfile == nil then
+ glg = inbase .. "." .. glg
+ else
+ glg = logfile
+ end
+
+ if outfile == nil then
+ gls = inbase .. "." .. gls
+ else
+ gls = outfile
+ end
+
+ glo = infile .. "." .. glo
+
+ dorun(name, glg, gls, glo, value.language, value.codepage)
+
+ done = true
+ end
+
+ if not done then
+ error([[
+No \@newglossary commands found in aux file.
+Did you remember to use \makeglossaries?
+Did you accidentally suppress the default glossary using "nomain"
+and not provide an alternative glossary?
+]])
+ end
+
+else
+
+ if onlyname == nil then
+
+ glo = infile
+ gls = outfile
+ glg = logfile
+
+ language = xindylang
+ codepage = 'utf8'
+
+ if language == nil then language = 'english' end
+
+ if gls == nil then gls = infile..".gls" end
+
+ else
+
+ value = glossaries[onlyname]
+
+ glg = value.glg
+ gls = value.gls
+ glo = infile
+
+ if logfile == nil then
+ glg = inbase .. "." .. glg
+ else
+ glg = logfile
+ end
+
+ if outfile == nil then
+ gls = inbase .. "." .. gls
+ else
+ gls = outfile
+ end
+
+ end
+
+ dorun(onlyname, glg, gls, glo, language, codepage)
+end
--- texk/texlive/linked_scripts/make4ht/make4ht
+++ texk/texlive/linked_scripts/make4ht/make4ht 2016-01-29 13:11:56.883615943 +0000
@@ -0,0 +1,62 @@
+#!/usr/bin/env texlua
+kpse.set_program_name("luatex")
+
+
+local make4ht = require("make4ht-lib")
+local lapp = require("lapp-mk4")
+local mkutils = require("mkutils")
+local mkparams = require("mkparams")
+-- args string is here just as sample, we dont pass it it to
+-- mkparams.get_args() so default args string is used
+local args = [[
+make4ht - build system for tex4ht
+Usage:
+make4ht [options] filename ["tex4ht.sty op." "tex4ht op." "t4ht op" "latex op"]
+-c,--config (default xhtml) Custom config file
+-d,--output-dir (default nil) Output directory
+-l,--lua Use lualatex for document compilation
+-s,--shell-escape Enables running external programs from LaTeX
+-u,--utf8 For output documents in utf8 encoding
+-x,--xetex Use xelatex for document compilation
+<filename> (string) Input file name
+]]
+
+local args = mkparams.get_args()
+
+local parameters = mkparams.process_args(args)
+
+local mode = parameters.mode
+local build_file = parameters.build_file
+
+local make = mkutils.load_config(parameters, build_file)["Make"]
+make.params = parameters
+if make:length() < 1 then
+ if mode == "draft" then
+ make:htlatex()
+ else
+ make:htlatex()
+ make:htlatex()
+ make:htlatex()
+ end
+end
+
+
+if not args["no-tex4ht"] then
+ make:tex4ht()
+end
+
+local ext = args.xetex and "xdv" or "dvi"
+if #make.image_patterns > 0 then
+ make.params.t4ht_par = make.params.t4ht_par .. " -p"
+end
+make:t4ht {ext = ext}
+make:match("tmp$", function() return false,"tmp file" end)
+make:match(".*",function(filename,par)
+ local outdir = '' --par["outdir"] and par["outdir"] .."/" or ''
+ if par['outdir'] ~= "" then outdir = par['outdir'] .. '/' end
+ print("outdir: "..outdir)
+ local outfilename = outdir .. filename
+ mkutils.copy(filename,outfilename)
+ return true
+end)
+make:run()
--- texk/texlive/linked_scripts/pdfbook2/pdfbook2
+++ texk/texlive/linked_scripts/pdfbook2/pdfbook2 2016-01-29 13:13:36.561613489 +0000
@@ -0,0 +1,237 @@
+#!/usr/bin/env python
+""" pdfbook2 - transform pdf files to booklets
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+ """
+
+
+import sys
+import subprocess
+import os
+from optparse import OptionParser, OptionGroup, HelpFormatter
+import shutil
+
+
+#===============================================================================
+# Create booklet for file $name
+#===============================================================================
+
+def booklify( name, opts ):
+ #------------------------------------------------------ Check if file exists
+ print "\nProcessing", name
+ if not os.path.isfile( name ):
+ print "SKIP: file not found."
+ return
+ print "Getting bounds...",
+ sys.stdout.flush()
+
+ #---------------------------------------------------------- useful constants
+ bboxName = "%%HiResBoundingBox:"
+ tmpFile = ".crop-tmp.pdf"
+
+ #------------------------------------------------- find min/max bounding box
+ if opts.crop:
+ p = subprocess.Popen( ["pdfcrop", "--verbose",
+ "--resolution", repr( opts.resolution ),
+ name, tmpFile],
+ stdout = subprocess.PIPE,
+ stderr = subprocess.PIPE )
+ p.wait()
+ out, err = p.communicate()
+ if len( err ) != 0:
+ print err
+ print "\n\nABORT: Problem getting bounds"
+ sys.exit( 1 )
+ lines = out.splitlines()
+ bboxes = [s[len( bboxName ) + 1:] for s in lines if s.startswith( bboxName )]
+ bounds = [[float( x ) for x in bbox.split()] for bbox in bboxes ]
+ minLOdd = min( [bound[0] for bound in bounds[::2] ] )
+ maxROdd = max( [bound[2] for bound in bounds[::2] ] )
+ minLEven = min( [bound[0] for bound in bounds[1::2] ] )
+ maxREven = max( [bound[2] for bound in bounds[1::2] ] )
+ minT = min( [bound[1] for bound in bounds ] )
+ maxB = max( [bound[3] for bound in bounds ] )
+
+ widthOdd = maxROdd - minLOdd
+ widthEven = maxREven - minLEven
+ maxWidth = max( widthOdd, widthEven )
+ minLOdd -= maxWidth - widthOdd
+ maxREven += maxWidth - widthEven
+
+ print "done"
+ sys.stdout.flush()
+
+ #--------------------------------------------- crop file to area of interest
+ print "cropping...",
+ sys.stdout.flush()
+ p = subprocess.Popen( ["pdfcrop",
+ "--bbox-odd", "{L} {T} {R} {B}".format( L = minLOdd - opts.innerMargin / 2,
+ T = minT - opts.topMargin,
+ R = maxROdd + opts.outerMargin,
+ B = maxB + opts.outerMargin ),
+ "--bbox-even", "{L} {T} {R} {B}".format( L = minLEven - opts.outerMargin,
+ T = minT - opts.topMargin,
+ R = maxREven + opts.innerMargin / 2,
+ B = maxB + opts.outerMargin ),
+ "--resolution", repr( opts.resolution ),
+ name,
+ tmpFile],
+ stdout = subprocess.PIPE,
+ stderr = subprocess.PIPE )
+ p.wait()
+ out, err = p.communicate()
+ if len( err ) != 0:
+ print err
+ print "\n\nABORT: Problem with cropping"
+ sys.exit( 1 )
+ print "done"
+ sys.stdout.flush()
+ else:
+ shutil.copy( name, tmpFile )
+
+ #-------------------------------------------------------- create the booklet
+ print "create booklet...",
+ sys.stdout.flush()
+ pdfJamCallList = [ "pdfjam",
+ "--booklet", "true",
+ "--landscape",
+ "--suffix", "book",
+ "--signature", repr( opts.signature ),
+ tmpFile ]
+
+ # add option --paper to call
+ if opts.paper is not None:
+ pdfJamCallList.append( "--paper" )
+ pdfJamCallList.append( opts.paper )
+
+ # add option --short-edge to call
+ if opts.shortedge:
+ # check if everyshi.sty exists as texlive recommends
+ p = subprocess.Popen( ["kpsewhich", "everyshi.sty"],
+ stdout = subprocess.PIPE,
+ stderr = subprocess.PIPE )
+ p.wait()
+ out, err = p.communicate()
+ if len( out ) == 0:
+ print "\n\nABORT: The everyshi.sty latex package is needed for short-edge."
+ sys.exit( 1 )
+ else:
+ pdfJamCallList.append( "--preamble" )
+ pdfJamCallList.append( r"\usepackage{everyshi}\makeatletter\EveryShipout{\ifodd\c@page\pdfpageattr{/Rotate 180}\fi}\makeatother" )
+
+ # run call to pdfJam to make booklet
+ p = subprocess.Popen( pdfJamCallList,
+ stdout = subprocess.PIPE,
+ stderr = subprocess.PIPE )
+ p.wait()
+
+ #-------------------------------------------- move file and remove temp file
+ os.rename( tmpFile[:-4] + "-book.pdf", name[:-4] + "-book.pdf" )
+ os.remove( tmpFile )
+ print "done"
+ sys.stdout.flush()
+
+
+#===============================================================================
+# Help formatter
+#===============================================================================
+
+class MyHelpFormatter ( HelpFormatter ):
+ """Format help with indented section bodies.
+ """
+
+ def __init__( self,
+ indent_increment = 4,
+ max_help_position = 16,
+ width = None,
+ short_first = 0 ):
+ HelpFormatter.__init__(
+ self, indent_increment, max_help_position, width, short_first )
+
+ def format_usage( self, usage ):
+ return ( "USAGE\n\n%*s%s\n" ) % ( self.indent_increment, "", usage )
+
+ def format_heading( self, heading ):
+ return "%*s%s\n\n" % ( self.current_indent, "", heading.upper() )
+
+
+#===============================================================================
+# main programm
+#===============================================================================
+
+if __name__ == "__main__":
+ #------------------------------------------------------------ useful strings
+ usageString = "Usage: %prog [options] file1 [file2 ...]"
+ versionString = """
+ %prog v1.2
+ (c) 2015 Johannes Neumann (http://www.neumannjo.de)
+ licensed under GPLv3 (http://www.gnu.org/licenses/gpl-3.0)
+ based on pdfbook by David Firth with help from Marco Pessotto\n"""
+ defaultString = " (default: %default)"
+
+ #------------------------------------------------- create commandline parser
+ parser = OptionParser( usage = usageString, version = versionString,
+ formatter = MyHelpFormatter( indent_increment = 4 ) )
+
+ generalGroup = OptionGroup( parser, "General" )
+ generalGroup.add_option( "-p", "--paper", dest = "paper", type = "str", action = "store",
+ metavar = "STR",
+ help = "Format of the output paper dimensions as latex keyword (e.g. a4paper, letterpaper, legalpaper, ...)" )
+ generalGroup.add_option( "-s", "--short-edge", dest = "shortedge", action = "store_true",
+ help = "Format the booklet for short-edge double-sided printing",
+ default = False )
+ generalGroup.add_option( "-n", "--no-crop", dest = "crop", action = "store_false",
+ help = "Prevent the cropping to the content area",
+ default = True )
+ parser.add_option_group( generalGroup )
+
+ marginGroup = OptionGroup( parser, "Margins" )
+ marginGroup.add_option( "-o", "--outer-margin", type = "int", default = 40,
+ dest = "outerMargin", action = "store", metavar = "INT",
+ help = "Defines the outer margin in the booklet" + defaultString )
+ marginGroup.add_option( "-i", "--inner-margin", type = "int", default = 150,
+ dest = "innerMargin", action = "store", metavar = "INT",
+ help = "Defines the inner margin between the pages in the booklet" + defaultString )
+ marginGroup.add_option( "-t", "--top-margin", type = "int", default = 30,
+ dest = "topMargin", action = "store", metavar = "INT",
+ help = "Defines the top margin in the booklet" + defaultString )
+ marginGroup.add_option( "-b", "--bottom-margin", type = "int", default = 30, metavar = "INT",
+ dest = "bottomMargin", action = "store",
+ help = "Defines the bottom margin in the booklet" + defaultString )
+ parser.add_option_group( marginGroup )
+
+ advancedGroup = OptionGroup( parser, "Advanced" )
+ advancedGroup.add_option( "--signature", dest = "signature", action = "store", type = "int",
+ help = "Define the signature for the booklet handed to pdfjam, needs to be multiple of 4" + defaultString,
+ default = 4, metavar = "INT" )
+ advancedGroup.add_option( "--signature*", dest = "signature", action = "store", type = "int",
+ help = "Same as --signature", metavar = "INT" )
+ advancedGroup.add_option( "--resolution", dest = "resolution", action = "store", type = "int",
+ help = "Resolution used by ghostscript in bp" + defaultString,
+ metavar = "INT", default = 72 )
+ parser.add_option_group( advancedGroup )
+
+ opts, args = parser.parse_args()
+
+ #------------------------------------ show help if started without arguments
+ if len( args ) == 0:
+ parser.print_version()
+ parser.print_help()
+ print ""
+ sys.exit( 2 )
+
+ #------------------------------------------- run for each provided file name
+ parser.print_version()
+ for arg in args:
+ booklify( arg, opts )
--- texk/texlive/linked_scripts/tex4ebook/tex4ebook
+++ texk/texlive/linked_scripts/tex4ebook/tex4ebook 2016-01-29 13:15:14.519645559 +0000
@@ -0,0 +1,154 @@
+#!/usr/bin/env texlua
+kpse.set_program_name("luatex")
+require("lapp-mk4")
+-- require("ebookutils")
+local ebookutils = require "mkutils"
+
+-- Setting
+local latex_cmd="latex"
+local copy_cmd="copy"
+local move_cmd="move"
+local env_param="%%"
+local htlatex_call=""
+-- These correspond to htlatex parameters
+local tex4ht_sty_par=""
+local tex4ht_par=""
+local t4ht_par=""
+local latex_par=""
+local output_formats={epub=true,mobi=true,epub3=true}
+local executor=nil
+local tidy = false
+local include_fonts = false
+local arg_message = [[
+tex4ebook - ebook generation support for LaTeX
+Usage:
+tex4ebook [switches] inputfile ["tex4ht.sty op." "tex4ht op." "t4ht op" "latex op"]
+-c,--config (default xhtml) Custom config file
+-e,--build-file (default nil) If build file is different than `filename`.mk4
+-f,--format (default epub) Output format. Supported values: epub, epub3, mobi
+-l,--lua Runs htlualatex instead of htlatex
+-m,--mode (default default) Switch which can be used in the makefile
+-r,--resolution (default 167)
+-s,--shell-escape Enable shell escape in htlatex run
+-t,--tidy Run html tidy on html output. May result in wrong spacing!
+]]
+
+-- This option is no longer available, all files must be unicode
+-- -u,--utf8
+local args=lapp(arg_message)
+
+if args[1] == nil then
+ print(arg_message)
+ return
+else
+ input_file=args[1]
+end
+
+if args.lua then
+ print("Mame lua")
+ latex_cmd="dvilualatex"
+end
+
+--if args.utf8 then
+tex4ht_sty_par=tex4ht_sty_par .. ", charset=utf-8"
+tex4ht_par=tex4ht_par .. " -cmozhtf -utf8"
+--end
+
+if args["shell-escape"] then
+ latex_par = latex_par .. " -shell-escape"
+end
+
+if args["include-fonts"] then
+ include_fonts = true
+end
+
+-- local mathml = ","
+-- if args["mathml"] then
+-- -- mathml = ",mathml,"
+-- tex4ht_sty_par = tex4ht_sty_par .. ",mathml"
+-- end
+local mode = args.mode or "default"
+
+if os.type=="unix" then
+ env_param="$"
+ copy_cmd="cp"
+ move_cmd="mv"
+ t4ht_dir_format="%s/"
+else
+ env_param="%%"
+ copy_cmd="copy"
+ move_cmd="move"
+ t4ht_dir_format="%s"
+end
+
+if args.tidy then
+ tidy = true
+else
+ tidy = false
+end
+-- Env file copying
+
+--[[if not ebookutils.file_exists("tex4ht.env") then
+local env_file = kpse.find_file("epub2.env")
+ebookutils.copy_filter(env_file,"tex4ht.env",function(s) return s % {
+move = move_cmd,
+copy = copy_cmd,
+resolution = args.resolution
+} end)
+end--]]
+
+--print ("nazdar ${world}" % {world="svete"})
+--print(args.config)
+
+local input = ebookutils.remove_extension(input_file)
+local config=ebookutils.remove_extension(args.config)
+local tex4ht_sty_par = config ..tex4ht_sty_par..","+args.format
+--local sty_args = args[2] and ", " .. args[2] or ""
+local sty_args = ""
+if args[2] then
+ sty_args = "," .. args[2]
+end
+local tex4ht_sty_par = tex4ht_sty_par + sty_args --args[2]
+local tex4ht_par = tex4ht_par +args[3]
+local t4ht_par = t4ht_par + args[4]
+local latex_par = latex_par + args[5]
+local params = {
+ htlatex=latex_cmd
+ ,input=input
+ ,format=args.format
+ ,latex_par=latex_par
+ ,tex4ht_sty_par=tex4ht_sty_par
+ ,tex4ht_par=tex4ht_par
+ ,t4ht_par=t4ht_par
+ ,mode = mode
+ ,t4ht_dir_format=t4ht_dir_format
+ ,tidy = tidy
+ ,include_fonts = include_fonts
+ ,resolution=args.resolution
+ ,mathml=mathml
+ ,packages="\\RequirePackage{tex4ebook}"
+}
+
+if output_formats[args.format] then
+ executor=require("exec_"..args.format)
+ params=executor.prepare(params)
+else
+ print("Unknown output format: "..args.format)
+ return
+end
+
+local build_file = input.. ".mk4"
+
+if args["build-file"] and args["build-file"] ~= "nil" then
+ build_file = args["build-file"]
+end
+
+local config_file = ebookutils.load_config(nil, build_file)
+
+params["config_file"] = config_file
+--config_file.Make:run()
+print("${htlatex} ${input} \"${tex4ht_sty_par}\" \"${tex4ht_par}\" \"${t4ht_par}\" \"${latex_par}\"" % params)
+executor.run(input,params)
+executor.writeContainer()
+executor.clean()
+--print(args[1])