You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
913 lines
28 KiB
913 lines
28 KiB
#!/usr/bin/env texlua
|
|
|
|
-- Copyright 2016-2020 Brian Dunn
|
|
|
|
printversion = "v0.88"
|
|
requiredconfversion = "2" -- also at *lwarpmk.conf
|
|
|
|
function printhelp ()
|
|
print ("lwarpmk: Use lwarpmk -h or lwarpmk --help for help.") ;
|
|
end
|
|
|
|
function printusage ()
|
|
--
|
|
-- Print the usage of the lwarpmk command:
|
|
--
|
|
print ( [[
|
|
|
|
lwarpmk print [-p project]: Compile the print version if necessary.
|
|
lwarpmk print1 [-p project]: Forced single compile of the print version.
|
|
lwarpmk printindex [-p project]: Process print indexes.
|
|
lwarpmk printglossary [-p project]: Process the glossary for the print version.
|
|
lwarpmk html [-p project]: Compile the HTML version if necessary.
|
|
lwarpmk html1 [-p project]: Forced single compile of the HTML version.
|
|
lwarpmk htmlindex [-p project]: Process HTML indexes.
|
|
lwarpmk htmlglossary [-p project]: Process the glossary for the html version.
|
|
lwarpmk again [-p project]: Touch the source code to trigger recompiles.
|
|
lwarpmk limages [-p project]: Process the "lateximages" created by lwarp.sty.
|
|
lwarpmk pdftohtml [-p project]:
|
|
For use with latexmk or a Makefile:
|
|
Converts project_html.pdf to project_html.html and individual HTML files.
|
|
Finishes the HTML conversion even if there was a compile error.
|
|
lwarpmk pdftosvg <list of file names>: Converts each PDF file to SVG.
|
|
lwarpmk epstopdf <list of file names>: Converts each EPS file to PDF.
|
|
lwarpmk clean [-p project]: Remove *.aux, *.toc, *.lof/t,
|
|
*.idx, *.ind, *.log, *_html_inc.*, .gl*,
|
|
*_html.pdf, *_html.html, *_html.sidetoc
|
|
lwarpmk cleanall [-p project]: Remove auxiliary files, project.pdf, *.html
|
|
lwarpmk cleanlimages: Removes all images from the "lateximages" directory.
|
|
lwarpmk -v: Print the version number.
|
|
lwarpmk -h: Print this help message.
|
|
lwarpmk --help: Print this help message.
|
|
|
|
]] )
|
|
-- printconf ()
|
|
end
|
|
|
|
function splitfilename ( pathandfilename )
|
|
--
|
|
-- Separates out the path and extension from a filename.
|
|
-- Returns path, filename with extension, and extension.
|
|
-- Ex: thispath, thisfilename, thisextension = splitfilename ("path/to/filename.ext")
|
|
--
|
|
-- https://www.fhug.org.uk/wiki/wiki/doku.php?id=plugins:code_snippets:
|
|
-- split_filename_in_to_path_filename_and_extension
|
|
--
|
|
if lfs.attributes(pathandfilename,"mode") == "directory" then
|
|
local strPath = pathandfilename:gsub("[\\/]$","") -- $ (syntax highlighting)
|
|
return strPath.."\\","",""
|
|
end
|
|
pathandfilename = pathandfilename.."."
|
|
return pathandfilename:match("^(.-)([^\\/]-)%.([^\\/%.]-)%.?$")
|
|
end
|
|
|
|
function splitfile (destfile,sourcefile)
|
|
--
|
|
-- Split one large sourcefile into a number of files,
|
|
-- starting with destfile.
|
|
-- The file is split at each occurance of <!--|Start file|newfilename|*
|
|
--
|
|
print ("lwarpmk: Splitting " .. sourcefile .. " into " .. destfile) ;
|
|
local sfile = io.open(sourcefile)
|
|
io.output(destfile)
|
|
for line in sfile:lines() do
|
|
i,j,copen,cstart,newfilename = string.find (line,"(.*)|(.*)|(.*)|") ;
|
|
if ( (i~= nil) and (copen == "<!--") and (cstart == "Start file")) then
|
|
-- split the file
|
|
io.output(newfilename) ;
|
|
else
|
|
-- not a splitpoint
|
|
io.write (line .. "\n") ;
|
|
end
|
|
end -- do
|
|
io.close(sfile)
|
|
end -- function
|
|
|
|
function cvalueerror ( line, linenum , cvalue )
|
|
--
|
|
-- Incorrect value, so print an error and exit.
|
|
--
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: " .. linenum .. " : " .. line ) ;
|
|
print (
|
|
"lwarpmk: incorrect variable value \"" .. cvalue ..
|
|
"\" in lwarpmk.conf.\n"
|
|
) ;
|
|
print ("lwarpmk: ===")
|
|
-- printconf () ;
|
|
os.exit(1) ;
|
|
end
|
|
|
|
function printhowtorecompile ()
|
|
-- Tells the user how to recompile to regenerate the configuration files.
|
|
print ("lwarpmk: The configuration files lwarpmk.conf and "..sourcename..".lwarpmkconf" )
|
|
print ("lwarpmk: must be updated. To do so, recompile" )
|
|
print ("lwarpmk: " , sourcename..".tex" )
|
|
if ( printlatexcmd == "" ) then
|
|
print ("lwarpmk: using xe/lua/pdflatex," )
|
|
else
|
|
print ("lwarpmk: using the command:")
|
|
print ("lwarpmk: " , printlatexcmd )
|
|
end
|
|
print ("lwarpmk: then use lwarpmk again.")
|
|
end -- printhowtorecompile
|
|
|
|
function ignoreconf ()
|
|
-- Global argument index
|
|
argindex = 2
|
|
end
|
|
|
|
function loadconf ()
|
|
--
|
|
-- Load settings from the project's "lwarpmk.conf" file:
|
|
--
|
|
-- Default configuration filename:
|
|
local conffile = "lwarpmk.conf"
|
|
local confroot = "lwarpmk"
|
|
-- Global argument index
|
|
argindex = 2
|
|
-- Optional configuration filename:
|
|
if ( arg[argindex] == "-p" ) then
|
|
argindex = argindex + 1
|
|
confroot = arg[argindex]
|
|
conffile = confroot..".lwarpmkconf"
|
|
argindex = argindex + 1
|
|
end
|
|
-- Additional defaults:
|
|
confversion = "0"
|
|
opsystem = "Unix"
|
|
imagesdirectory = "lateximages"
|
|
imagesname = "image-"
|
|
latexmk = "false"
|
|
printlatexcmd = ""
|
|
HTMLlatexcmd = ""
|
|
printindexcmd = ""
|
|
HTMLindexcmd = ""
|
|
latexmkindexcmd = ""
|
|
-- to be removed:
|
|
-- indexprog = "makeindex"
|
|
-- makeindexstyle = "lwarp.ist"
|
|
-- xindylanguage = "english"
|
|
-- xindycodepage = "utf8"
|
|
-- xindystyle = "lwarp.xdy"
|
|
-- pdftotextenc = "UTF-8"
|
|
glossarycmd = "makeglossaries"
|
|
-- Verify the file exists:
|
|
if (lfs.attributes(conffile,"mode")==nil) then
|
|
-- file not exists
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: File \"" .. conffile .."\" does not exist.")
|
|
print ("lwarpmk: Move to the project's source directory,")
|
|
print ("lwarpmk: recompile using pdflatex, xelatex, or lualatex,")
|
|
print ("lwarpmk: then try using lwarpmk again.")
|
|
if ( arg[argindex] ~= nil ) then
|
|
print (
|
|
"lwarpmk: (\"" .. confroot ..
|
|
"\" does not appear to be a project name.)"
|
|
)
|
|
end
|
|
print ("lwarpmk: ===")
|
|
printhelp () ;
|
|
os.exit(1) -- exit the entire lwarpmk script
|
|
else -- file exists
|
|
-- Read the file:
|
|
print ("lwarpmk: Reading " .. conffile ..".")
|
|
local cfile = io.open(conffile)
|
|
-- Scan each line, parsing each line as: name = [[string]]
|
|
local linenum = 0
|
|
for line in cfile:lines() do -- scan lines
|
|
linenum = linenum + 1
|
|
i,j,cvarname,cvalue = string.find (line,"([%w-_]*)%s*=%s*%[%[([^%]]*)%]%]") ;
|
|
-- Error if incorrect enclosing characters:
|
|
if ( i == nil ) then
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: " .. linenum .. " : " .. line ) ;
|
|
print ("lwarpmk: Incorrect entry in " .. conffile ..".\n" ) ;
|
|
print ("lwarpmk: ===")
|
|
-- printconf () ;
|
|
os.exit(1) ;
|
|
end -- nil
|
|
if ( cvarname == "confversion" ) then
|
|
confversion = cvalue
|
|
elseif ( cvarname == "opsystem" ) then
|
|
-- Verify choice of opsystem:
|
|
if ( (cvalue == "Unix") or (cvalue == "Windows") ) then
|
|
opsystem = cvalue
|
|
else
|
|
cvalueerror ( line, linenum , cvalue )
|
|
end
|
|
elseif ( cvarname == "sourcename" ) then sourcename = cvalue
|
|
elseif ( cvarname == "homehtmlfilename" ) then homehtmlfilename = cvalue
|
|
elseif ( cvarname == "htmlfilename" ) then htmlfilename = cvalue
|
|
elseif ( cvarname == "imagesdirectory" ) then imagesdirectory = cvalue
|
|
elseif ( cvarname == "imagesname" ) then imagesname = cvalue
|
|
elseif ( cvarname == "latexmk" ) then latexmk = cvalue
|
|
elseif ( cvarname == "printlatexcmd" ) then printlatexcmd = cvalue
|
|
elseif ( cvarname == "HTMLlatexcmd" ) then HTMLlatexcmd = cvalue
|
|
elseif ( cvarname == "printindexcmd" ) then printindexcmd = cvalue
|
|
elseif ( cvarname == "HTMLindexcmd" ) then HTMLindexcmd = cvalue
|
|
elseif ( cvarname == "latexmkindexcmd" ) then latexmkindexcmd = cvalue
|
|
elseif ( cvarname == "glossarycmd" ) then glossarycmd = cvalue
|
|
elseif ( cvarname == "pdftotextenc" ) then pdftotextenc = cvalue
|
|
else
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: " .. linenum .. " : " .. line ) ;
|
|
print (
|
|
"lwarpmk: Incorrect variable name \"" .. cvarname .. "\" in " ..
|
|
conffile ..".\n"
|
|
) ;
|
|
print ("lwarpmk: ===")
|
|
-- printconf () ;
|
|
os.exit(1) ;
|
|
end -- cvarname
|
|
end -- do scan lines
|
|
io.close(cfile)
|
|
end -- file exists
|
|
-- Error if sourcename is "lwarp".
|
|
-- This could happen if a local copy of lwarp has recently been recompiled.
|
|
if sourcename=="lwarp" then
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: lwarp.sty has recently been recompiled in this directory,")
|
|
print ("lwarpmk: and \"lwarpmk.conf\" is no longer set for your own project.")
|
|
print ("lwarpmk: (Perhaps you are not in your project's directory?)")
|
|
print ("lwarpmk: In your project directory, recompile your project")
|
|
print ("lwarpmk: using pdf/lua/xelatex <projectname>.")
|
|
print ("lwarpmk: After a recompile, \"lwarpmk.conf\" will be set for your project,")
|
|
print ("lwarpmk: and you may again use lwarpmk.")
|
|
print ("lwarpmk: ===")
|
|
os.exit(1)
|
|
end -- sourcename of "lwarp"
|
|
-- Select some operating-system commands:
|
|
if opsystem=="Unix" then -- For Unix / Linux / Mac OS:
|
|
rmname = "rm"
|
|
mvname = "mv"
|
|
cpname = "cp"
|
|
touchnamepre = "touch"
|
|
touchnamepost = ""
|
|
newtouchname = "touch"
|
|
dirslash = "/"
|
|
opquote= "\'"
|
|
cmdgroupopenname = " ( "
|
|
cmdgroupclosename = " ) "
|
|
seqname = " && "
|
|
bgname = " &"
|
|
elseif opsystem=="Windows" then -- For Windows
|
|
rmname = "DEL"
|
|
mvname = "MOVE"
|
|
cpname = "COPY"
|
|
touchnamepre = "COPY /b"
|
|
touchnamepost = "+,,"
|
|
newtouchname = "echo empty >"
|
|
dirslash = "\\"
|
|
opquote= "\""
|
|
cmdgroupopenname = ""
|
|
cmdgroupclosename = ""
|
|
seqname = " & "
|
|
bgname = ""
|
|
else
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: Select Unix or Windows for opsystem." )
|
|
print ("lwarpmk: ===")
|
|
os.exit(1)
|
|
end --- for Windows
|
|
-- Warning if the operating system does not appear to be correct,
|
|
-- in case files were transferred to another system.
|
|
if ( (package.config:sub(1,1)) ~= dirslash ) then
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: It appears that lwarpmk.conf is for a different operating system." )
|
|
printhowtorecompile ()
|
|
print ("lwarpmk: ===")
|
|
os.exit(1)
|
|
end
|
|
-- Error if the configuration file's version is not current:
|
|
if ( confversion ~= requiredconfversion ) then
|
|
print ("lwarpmk: ===")
|
|
printhowtorecompile ()
|
|
print ("lwarpmk: ===")
|
|
os.exit(1)
|
|
end
|
|
end -- loadconf
|
|
|
|
function executecheckerror ( executecommands , errormessage )
|
|
--
|
|
-- Execute an operating system call,
|
|
-- and maybe exit with an error message.
|
|
--
|
|
local err
|
|
err = os.execute ( executecommands )
|
|
if ( err ~= 0 ) then
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: " .. errormessage )
|
|
print ("lwarpmk: ===")
|
|
os.exit(1)
|
|
end
|
|
end -- executecheckerror
|
|
|
|
function refreshdate ()
|
|
os.execute(touchnamepre .. " " .. sourcename .. ".tex " .. touchnamepost)
|
|
end
|
|
|
|
function reruntoget (filesource)
|
|
--
|
|
-- Scan the LaTeX log file for the phrase "Rerun to get",
|
|
-- indicating that the file should be compiled again.
|
|
-- Return true if found.
|
|
--
|
|
local fsource = io.open(filesource)
|
|
for line in fsource:lines() do
|
|
if ( string.find(line,"Rerun to get") ~= nil ) then
|
|
io.close(fsource)
|
|
return true
|
|
end -- if
|
|
end -- do
|
|
io.close(fsource)
|
|
return false
|
|
end
|
|
|
|
function onetime (latexcmd, fsuffix)
|
|
--
|
|
-- Compile one time, return true if should compile again.
|
|
-- fsuffix is "" for print, "_html" for HTML output.
|
|
--
|
|
print("lwarpmk: Compiling with: " .. latexcmd)
|
|
executecheckerror (
|
|
latexcmd ,
|
|
"Compile error."
|
|
)
|
|
return (reruntoget(sourcename .. fsuffix .. ".log") ) ;
|
|
end
|
|
|
|
function manytimes (latexcmd, fsuffix)
|
|
--
|
|
-- Compile up to five times.
|
|
-- fsuffix is "" for print, "_html" for HTML output
|
|
--
|
|
if onetime(latexcmd, fsuffix) == true then
|
|
if onetime(latexcmd, fsuffix) == true then
|
|
if onetime(latexcmd, fsuffix) == true then
|
|
if onetime(latexcmd, fsuffix) == true then
|
|
if onetime(latexcmd, fsuffix) == true then
|
|
end end end end end
|
|
end
|
|
|
|
function verifyfileexists (filename)
|
|
--
|
|
-- Exit if the given file does not exist.
|
|
--
|
|
if (lfs.attributes ( filename , "modification" ) == nil ) then
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: " .. filename .. " not found." ) ;
|
|
print ("lwarpmk: ===")
|
|
os.exit (1) ;
|
|
end
|
|
end
|
|
|
|
function pdftohtml ()
|
|
--
|
|
-- Convert <project>_html.pdf into HTML files:
|
|
--
|
|
-- Convert to text:
|
|
print ("lwarpmk: Converting " .. sourcename
|
|
.."_html.pdf to " .. sourcename .. "_html.html")
|
|
os.execute("pdftotext -enc " .. pdftotextenc .. " -nopgbrk -layout "
|
|
.. sourcename .. "_html.pdf " .. sourcename .. "_html.html")
|
|
-- Split the result into individual HTML files:
|
|
splitfile (homehtmlfilename .. ".html" , sourcename .. "_html.html")
|
|
end
|
|
|
|
function removeaux ()
|
|
--
|
|
-- Remove auxiliary files:
|
|
-- All .aux files are removed since there may be many bbl*.aux files.
|
|
-- Also removes sourcename_html.pdf, sourcename_html.html,
|
|
-- and sourcename_html.sidetoc, plus comment_*.cut.
|
|
--
|
|
os.execute ( rmname .. " *.aux " ..
|
|
sourcename ..".toc " .. sourcename .. "_html.toc " ..
|
|
sourcename ..".lof " .. sourcename .. "_html.lof " ..
|
|
sourcename ..".lot " .. sourcename .. "_html.lot " ..
|
|
" *.idx " ..
|
|
" *.ind " ..
|
|
sourcename ..".ps " .. sourcename .."_html.ps " ..
|
|
sourcename ..".log " .. sourcename .. "_html.log " ..
|
|
sourcename ..".gl* " .. sourcename .. "_html.gl* " ..
|
|
sourcename .. "_html.pdf " ..
|
|
sourcename .. "_html.html " ..
|
|
sourcename .. "_html.sidetoc " ..
|
|
" *_html_inc.* " ..
|
|
" comment_*.cut"
|
|
)
|
|
end
|
|
|
|
function checkhtmlpdfexists ()
|
|
--
|
|
-- Error if the HTML document does not exist.
|
|
-- The lateximages are drawn from the HTML PDF version of the document,
|
|
-- so "lwarpmk html" must be done before "lwarpmk limages".
|
|
--
|
|
local htmlpdffile = io.open(sourcename .. "_html.pdf", "r")
|
|
if ( htmlpdffile == nil ) then
|
|
print ("")
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: The HTML version of the document does not exist.")
|
|
print ("lwarpmk: Enter \"lwarpmk html\" to compile the HTML version.")
|
|
print ("lwarpmk: ===")
|
|
os.exit(1)
|
|
end
|
|
io.close (htmlpdffile)
|
|
end -- checkhtmlpdfexists
|
|
|
|
function warnlimages ()
|
|
--
|
|
-- Warning of a missing <sourcename>-images.txt file:
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: \"" .. sourcename .. "-images.txt\" does not exist.")
|
|
print ("lwarpmk: Your project does not use SVG math or other lateximages,")
|
|
print ("lwarpmk: or the file has been deleted somehow.")
|
|
print ("lwarpmk: Use \"lwarpmk html1\" to recompile your project")
|
|
print ("lwarpmk: and recreate \"" .. sourcename .. "-images.txt\".")
|
|
print ("lwarpmk: If your project does not use SVG math or other lateximages,")
|
|
print ("lwarpmk: then \"" .. sourcename .. "-images.txt\" will never exist, and")
|
|
print ("lwarpmk: \"lwarpmk limages\" will not be necessary.")
|
|
print ("lwarpmk: ===")
|
|
end -- warnlimages
|
|
|
|
function warnlimagesrecompile ()
|
|
-- Warning if must recompile before creating limages:
|
|
print ("")
|
|
print ("lwarpmk: ===")
|
|
print ("lwarpmk: Cross-references are not yet correct.")
|
|
print ("lwarpmk: The document must be recompiled before creating the lateximages.")
|
|
print ("lwarpmk: Enter \"lwarpmk html1\" again, then try \"lwarpmk limages\" again.")
|
|
print ("lwarpmk: ===")
|
|
end --warnlimagesrecompile
|
|
|
|
function checklimages ()
|
|
--
|
|
-- Check <sourcename>.txt to see if need to recompile first.
|
|
-- If any entry has a page number of zero, then there were incorrect images.
|
|
--
|
|
print ("lwarpmk: Checking for a valid " .. sourcename .. "-images.txt file.")
|
|
local limagesfile = io.open(sourcename .. "-images.txt", "r")
|
|
if ( limagesfile == nil ) then
|
|
warnlimages ()
|
|
os.exit(1)
|
|
end
|
|
-- Track warning to recompile if find a page 0
|
|
local pagezerowarning = false
|
|
-- Scan <sourcename>.txt
|
|
for line in limagesfile:lines() do
|
|
-- lwimgpage is the page number in the PDF which has the image
|
|
-- lwimghash is true if this filename is a hash
|
|
-- lwimgname is the lateximage filename root to assign for the image
|
|
i,j,lwimgpage,lwimghash,lwimgname = string.find (line,"|(.*)|(.*)|(.*)|")
|
|
-- For each entry:
|
|
if ( (i~=nil) ) then
|
|
-- If the page number is 0, image references are incorrect
|
|
-- and must recompile the soure document:
|
|
if ( lwimgpage == "0" ) then
|
|
pagezerowarning = true
|
|
end
|
|
end -- if i~=nil
|
|
end -- do
|
|
-- The last line should be |end|end|end|.
|
|
-- If not, the compile must have aborted, and the images are incomplete.
|
|
if ( lwimgpage ~= "end" ) then
|
|
warnlimagesrecompile()
|
|
os.exit(1) ;
|
|
end
|
|
if ( pagezerowarning ) then
|
|
warnlimagesrecompile()
|
|
os.exit(1) ;
|
|
end -- pagezerowarning
|
|
end -- checklimages
|
|
|
|
function createuniximage ( lwimgfullname )
|
|
--
|
|
-- Create one lateximage for Unix / Linux / Mac OS.
|
|
--
|
|
executecheckerror (
|
|
cmdgroupopenname ..
|
|
"pdfseparate -f " .. lwimgpage .. " -l " .. lwimgpage .. " " ..
|
|
sourcename .."_html.pdf " ..
|
|
imagesdirectory .. dirslash .."lateximagetemp-%d" .. ".pdf" ..
|
|
seqname ..
|
|
-- Crop the image:
|
|
"pdfcrop --hires " .. imagesdirectory .. dirslash .. "lateximagetemp-" ..
|
|
lwimgpage .. ".pdf " ..
|
|
imagesdirectory .. dirslash .. lwimgname .. ".pdf" ..
|
|
seqname ..
|
|
-- Convert the image to svg:
|
|
"pdftocairo -svg -noshrink " .. imagesdirectory .. dirslash .. lwimgname .. ".pdf " ..
|
|
imagesdirectory .. dirslash .. lwimgname ..".svg" ..
|
|
seqname ..
|
|
-- Remove the temporary files:
|
|
rmname .. " " .. imagesdirectory .. dirslash .. lwimgname .. ".pdf" .. seqname ..
|
|
rmname .. " " .. imagesdirectory .. dirslash .. "lateximagetemp-" .. lwimgpage .. ".pdf" ..
|
|
cmdgroupclosename .. " >/dev/null " .. bgname
|
|
,
|
|
"File error trying to convert " .. lwimgfullname
|
|
)
|
|
-- Every 32 images, wait for completion at below normal priority,
|
|
-- allowing other image tasks to catch up.
|
|
numimageprocesses = numimageprocesses + 1
|
|
if ( numimageprocesses > 32 ) then
|
|
numimageprocesses = 0
|
|
print ( "lwarpmk: waiting" )
|
|
executecheckerror ( "wait" , "File error trying to wait.")
|
|
end
|
|
end -- createuniximage
|
|
|
|
function createwindowsimage ( lwimgfullname )
|
|
--
|
|
-- Create one lateximage for Windows.
|
|
--
|
|
-- Every 32 images, wait for completion at below normal priority,
|
|
-- allowing other image tasks to catch up.
|
|
numimageprocesses = numimageprocesses + 1
|
|
if ( numimageprocesses > 32 ) then
|
|
numimageprocesses = 0
|
|
thiswaitcommand = "/WAIT /BELOWNORMAL"
|
|
print ( "lwarpmk: waiting" )
|
|
else
|
|
thiswaitcommand = ""
|
|
end
|
|
-- Execute the image generation command
|
|
executecheckerror (
|
|
"start /B " .. thiswaitcommand .. " \"\" lwarp_one_limage " ..
|
|
lwimgpage .. " " ..
|
|
lwimghash .. " " ..
|
|
lwimgname .. " " ..
|
|
sourcename .. " <nul >nul"
|
|
,
|
|
"File error trying to create image."
|
|
)
|
|
end -- createwindowsimage
|
|
|
|
function createonelateximage ( line )
|
|
--
|
|
-- Given the next line of <sourcename>.txt, convert a single image.
|
|
--
|
|
-- lwimgpage is the page number in the PDF which has the image
|
|
-- lwimghash is true if this filename is a hash
|
|
-- lwimgname is the lateximage filename root to assign for the image
|
|
i,j,lwimgpage,lwimghash,lwimgname = string.find (line,"|(.*)|(.*)|(.*)|")
|
|
-- For each entry:
|
|
if ( (i~=nil) ) then
|
|
-- Skip if the page number is 0:
|
|
if ( lwimgpage == "0" ) then
|
|
pagezerowarning = true
|
|
-- Skip if the page number is "end":
|
|
else if ( lwimgpage == "end" ) then
|
|
else
|
|
-- Skip is this image is hashed and already exists:
|
|
local lwimgfullname = imagesdirectory .. dirslash .. lwimgname .. ".svg"
|
|
if (
|
|
(lwimghash ~= "true") or
|
|
(lfs.attributes(lwimgfullname,"mode")==nil) -- file not exists
|
|
)
|
|
then -- not hashed or not exists:
|
|
-- Print the name of the file being generated:
|
|
print ( "lwarpmk: " .. lwimgname )
|
|
-- Touch/create the dest so that only once instance tries to build it:
|
|
executecheckerror (
|
|
newtouchname .. " " .. lwimgfullname ,
|
|
"File error trying to touch " .. lwimgfullname
|
|
)
|
|
-- Separate out the image into its own single-page pdf:
|
|
if opsystem=="Unix" then
|
|
createuniximage (lwimgfullname)
|
|
elseif opsystem=="Windows" then
|
|
createwindowsimage (lwimgfullname)
|
|
end
|
|
end -- not hashed or not exists
|
|
end -- not page "end"
|
|
end -- not page 0
|
|
end -- not nil
|
|
end -- createonelateximage
|
|
|
|
function createlateximages ()
|
|
--
|
|
-- Create lateximages based on <sourcename>-images.txt:
|
|
--
|
|
-- See if the document must be recompiled first:
|
|
checklimages ()
|
|
-- See if the HTML version exists:
|
|
checkhtmlpdfexists ()
|
|
-- Attempt to create the lateximages:
|
|
print ("lwarpmk: Creating lateximages.")
|
|
local limagesfile = io.open(sourcename .. "-images.txt", "r")
|
|
if ( limagesfile == nil ) then
|
|
warnlimages ()
|
|
os.exit(1)
|
|
end
|
|
-- Create the lateximages directory, ignore error if already exists
|
|
err = os.execute("mkdir " .. imagesdirectory)
|
|
-- For Windows, create lwarp_one_limage.cmd from lwarp_one_limage.txt:
|
|
if opsystem=="Windows" then
|
|
executecheckerror (
|
|
cpname .. " lwarp_one_limage.txt lwarp_one_limage.cmd" ,
|
|
"File error trying to copy lwarp_one_limage.txt to lwarp_one_limage.cmd"
|
|
)
|
|
end -- create lwarp_one_limage.cmd
|
|
-- Track the number of parallel processes
|
|
numimageprocesses = 0
|
|
-- Track warning to recompile if find a page 0
|
|
pagezerowarning = false
|
|
-- Scan <sourcename>.txt
|
|
for line in limagesfile:lines() do
|
|
createonelateximage ( line )
|
|
end -- do
|
|
io.close(limagesfile)
|
|
print ( "lwarpmk limages: ===")
|
|
print ( "lwarpmk limages: Wait a moment for the images to complete" )
|
|
print ( "lwarpmk limages: before reloading the page." )
|
|
print ( "lwarpmk limages: ===")
|
|
print ( "lwarpmk limages: Done." )
|
|
if ( pagezerowarning == true ) then
|
|
print ( "lwarpmk limages: WARNING: Images will be incorrect." )
|
|
print ( "lwarpmk limages: Enter \"lwarpmk cleanlimages\", then" )
|
|
print ( "lwarpmk limages: recompile the document one more time, then" )
|
|
print ( "lwarpmk limages: repeat \"lwarpmk images\" again." )
|
|
end -- pagezerowarning
|
|
end -- function
|
|
|
|
function convertepstopdf ()
|
|
--
|
|
-- Converts EPS files to PDF files.
|
|
-- The filenames are arg[argindex] and up.
|
|
-- arg[1] is the command "epstopdf".
|
|
--
|
|
ignoreconf ()
|
|
for i = argindex , #arg do
|
|
if (lfs.attributes(arg[i],"mode")==nil) then
|
|
print ("lwarpmk: File \"" .. arg[i] .. "\" does not exist.")
|
|
else
|
|
print ("lwarpmk: Converting \"" .. arg[i] .. "\"")
|
|
thispath, thisfilename, thisextension = splitfilename(arg[i])
|
|
if ( thispath == nil ) then
|
|
os.execute ( "epstopdf " .. arg[i] )
|
|
else
|
|
os.execute (
|
|
"epstopdf " ..
|
|
thispath .. thisfilename .. "." .. thisextension .. " " ..
|
|
thispath .. thisfilename .. ".pdf"
|
|
)
|
|
end
|
|
end -- if
|
|
end -- do
|
|
end --function
|
|
|
|
function convertpdftosvg ()
|
|
--
|
|
-- Converts PDF files to SVG files.
|
|
-- The filenames are arg[argindex] and up.
|
|
-- arg[1] is the command "pdftosvg".
|
|
--
|
|
ignoreconf ()
|
|
for i = argindex , #arg do
|
|
if (lfs.attributes(arg[i],"mode")==nil) then
|
|
print ("lwarpmk: File \"" .. arg[i] .. "\" does not exist.")
|
|
else
|
|
print ("lwarpmk: Converting \"" .. arg[i] .. "\"")
|
|
thispath, thisfilename, thisextension = splitfilename(arg[i])
|
|
if ( thispath == nil ) then
|
|
os.execute ( "pdftocairo -svg " .. arg[i] )
|
|
else
|
|
os.execute (
|
|
"pdftocairo -svg " ..
|
|
thispath .. thisfilename .. "." .. thisextension .. " " ..
|
|
thispath .. thisfilename .. ".svg"
|
|
)
|
|
end
|
|
end -- if
|
|
end -- do
|
|
end --function
|
|
|
|
-- Force an update and conclude processing:
|
|
function updateanddone ()
|
|
print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.")
|
|
refreshdate ()
|
|
print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.")
|
|
print ("lwarpmk: Done.")
|
|
end -- function
|
|
|
|
-- Start of the main code: --
|
|
|
|
-- lwarpmk --version :
|
|
|
|
if (arg[1] == "--version") then
|
|
print ( "lwarpmk: " .. printversion )
|
|
|
|
else -- not --version
|
|
|
|
-- print intro:
|
|
|
|
print ("lwarpmk: " .. printversion .. " Automated make for the LaTeX Lwarp package.")
|
|
|
|
-- lwarpmk print:
|
|
|
|
if arg[1] == "print" then
|
|
loadconf ()
|
|
if ( latexmk == "true" ) then
|
|
print ("lwarpmk: Compiling with: " .. printlatexcmd)
|
|
executecheckerror (
|
|
printlatexcmd ,
|
|
"Compile error."
|
|
)
|
|
print ("lwarpmk: Done.")
|
|
else -- not latexmk
|
|
verifyfileexists (sourcename .. ".tex") ;
|
|
-- See if up to date:
|
|
if (
|
|
( lfs.attributes ( sourcename .. ".pdf" , "modification" ) == nil ) or
|
|
(
|
|
lfs.attributes ( sourcename .. ".tex" , "modification" ) >
|
|
lfs.attributes ( sourcename .. ".pdf" , "modification" )
|
|
)
|
|
) then
|
|
-- Recompile if not yet up to date:
|
|
manytimes(printlatexcmd, "")
|
|
print ("lwarpmk: Done.") ;
|
|
else
|
|
print ("lwarpmk: " .. sourcename .. ".pdf is up to date.") ;
|
|
end
|
|
end -- not latexmk
|
|
|
|
-- lwarpmk print1:
|
|
|
|
elseif arg[1] == "print1" then
|
|
loadconf ()
|
|
verifyfileexists (sourcename .. ".tex") ;
|
|
onetime(printlatexcmd, "")
|
|
print ("lwarpmk: Done.") ;
|
|
|
|
-- lwarpmk printindex:
|
|
-- Compile the index then touch the source
|
|
-- to trigger a recompile of the document:
|
|
|
|
elseif arg[1] == "printindex" then
|
|
loadconf ()
|
|
os.execute ( printindexcmd )
|
|
print ("lwarpmk: -------")
|
|
updateanddone ()
|
|
|
|
-- lwarpmk printglossary:
|
|
-- Compile the glossary then touch the source
|
|
-- to trigger a recompile of the document:
|
|
|
|
elseif arg[1] == "printglossary" then
|
|
loadconf ()
|
|
print ("lwarpmk: Processing the glossary.")
|
|
|
|
os.execute(glossarycmd .. " " .. sourcename)
|
|
updateanddone ()
|
|
|
|
-- lwarpmk html:
|
|
|
|
elseif arg[1] == "html" then
|
|
loadconf ()
|
|
if ( latexmk == "true" ) then
|
|
print ("lwarpmk: Compiling with: " .. HTMLlatexcmd)
|
|
executecheckerror (
|
|
HTMLlatexcmd ,
|
|
"Compile error."
|
|
)
|
|
pdftohtml ()
|
|
print ("lwarpmk: Done.")
|
|
else -- not latexmk
|
|
verifyfileexists ( sourcename .. ".tex" ) ;
|
|
-- See if exists and is up to date:
|
|
if (
|
|
( lfs.attributes ( homehtmlfilename .. ".html" , "modification" ) == nil ) or
|
|
(
|
|
lfs.attributes ( sourcename .. ".tex" , "modification" ) >
|
|
lfs.attributes ( homehtmlfilename .. ".html" , "modification" )
|
|
)
|
|
) then
|
|
-- Recompile if not yet up to date:
|
|
manytimes(HTMLlatexcmd, "_html")
|
|
pdftohtml ()
|
|
print ("lwarpmk: Done.")
|
|
else
|
|
print ("lwarpmk: " .. homehtmlfilename .. ".html is up to date.")
|
|
end
|
|
end -- not latexmk
|
|
|
|
-- lwarpmk html1:
|
|
|
|
elseif arg[1] == "html1" then
|
|
loadconf ()
|
|
verifyfileexists ( sourcename .. ".tex" ) ;
|
|
onetime(HTMLlatexcmd, "_html")
|
|
pdftohtml ()
|
|
print ("lwarpmk: Done.")
|
|
|
|
-- lwarpmk pdftohtml:
|
|
elseif arg[1] == "pdftohtml" then
|
|
loadconf ()
|
|
pdftohtml ()
|
|
|
|
-- lwarpmk htmlindex:
|
|
-- Compile the index then touch the source
|
|
-- to trigger a recompile of the document:
|
|
|
|
elseif arg[1] == "htmlindex" then
|
|
loadconf ()
|
|
os.execute ( HTMLindexcmd )
|
|
print ("lwarpmk: -------")
|
|
updateanddone ()
|
|
|
|
-- lwarpmk htmlglossary:
|
|
-- Compile the glossary then touch the source
|
|
-- to trigger a recompile of the document.
|
|
-- The <sourcename>.xdy file is created by the glossaries package.
|
|
|
|
elseif arg[1] == "htmlglossary" then
|
|
loadconf ()
|
|
print ("lwarpmk: Processing the glossary.")
|
|
os.execute(glossarycmd .. " " .. sourcename .. "_html")
|
|
updateanddone ()
|
|
|
|
-- lwarpmk limages:
|
|
-- Scan the <sourcename>.txt file to create lateximages.
|
|
|
|
elseif arg[1] == "limages" then
|
|
loadconf ()
|
|
print ("lwarpmk: Processing images.")
|
|
createlateximages ()
|
|
print ("lwarpmk: Done.")
|
|
|
|
-- lwarpmk again:
|
|
-- Touch the source to trigger a recompile.
|
|
|
|
elseif arg[1] == "again" then
|
|
loadconf ()
|
|
updateanddone ()
|
|
|
|
-- lwarpmk clean:
|
|
-- Remove project.aux, .toc, .lof, .lot, .log, *.idx, *.ind, *_html_inc.*, .gl*
|
|
|
|
elseif arg[1] == "clean" then
|
|
loadconf ()
|
|
removeaux ()
|
|
print ("lwarpmk: Done.")
|
|
|
|
-- lwarpmk cleanall
|
|
-- Remove project.aux, .toc, .lof, .lot, .log, *.idx, *.ind, *_html_inc.*, .gl*
|
|
-- and also project.pdf, project.dvi, *.html
|
|
|
|
elseif arg[1] == "cleanall" then
|
|
loadconf ()
|
|
removeaux ()
|
|
os.execute ( rmname .. " " ..
|
|
sourcename .. ".pdf " .. sourcename .. "_html.pdf " ..
|
|
sourcename .. ".dvi " .. sourcename .. "_html.dvi " ..
|
|
"*.html"
|
|
)
|
|
print ("lwarpmk: Done.")
|
|
|
|
-- lwarpmk cleanlimages
|
|
-- Remove images from the imagesdirectory.
|
|
|
|
elseif arg[1] == "cleanlimages" then
|
|
loadconf ()
|
|
os.execute ( rmname .. " " .. imagesdirectory .. dirslash .. "*" )
|
|
print ("lwarpmk: Done.")
|
|
|
|
-- lwarpmk epstopdf <list of file names>
|
|
-- Convert EPS files to PDF using epstopdf
|
|
elseif arg[1] == "epstopdf" then
|
|
convertepstopdf ()
|
|
print ("lwarpmk: Done.")
|
|
|
|
-- lwarpmk pdftosvg <list of file names>
|
|
-- Convert PDF files to SVG using pdftocairo
|
|
elseif arg[1] == "pdftosvg" then
|
|
convertpdftosvg ()
|
|
print ("lwarpmk: Done.")
|
|
|
|
-- lwarpmk with no argument :
|
|
|
|
elseif (arg[1] == nil) then
|
|
printhelp ()
|
|
|
|
-- lwarpmk -v:
|
|
|
|
elseif (arg[1] == "-v" ) then
|
|
-- The version number has already been printed
|
|
-- by the lwarpmk intro.
|
|
|
|
-- lwarpmk -h or lwarpmk --help :
|
|
|
|
elseif (arg[1] == "-h" ) or (arg[1] == "--help") then
|
|
printusage ()
|
|
|
|
-- Unknown command:
|
|
|
|
else
|
|
printhelp ()
|
|
print ("\nlwarpmk: ****** Unknown command \""..arg[1].."\". ******\n")
|
|
end
|
|
|
|
end -- not --version
|
|
|