--- 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] + +For use with the glossaries package to pass relevant +files to makeindex or xindy. + + 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 Use as the output file. + (Don't use -o if you have more than one glossary.) +-s Employ as the style file. +-t Employ 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 Use . +-x 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 Set the starting page number to be . +-r Disable implicit page range formation. +-m 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 + (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 . + """ + + +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])