Linux ip-172-26-7-228 5.4.0-1103-aws #111~18.04.1-Ubuntu SMP Tue May 23 20:04:10 UTC 2023 x86_64
Your IP : 18.223.158.29
#!/usr/bin/env texlua
-- Copyright 2016-2018 Brian Dunn
-- Print the usage of the lwarpmk command:
printversion = "v0.49"
function printhelp ()
print ("lwarpmk: Use lwarpmk -h or lwarpmk --help for help.") ;
end
function printusage ()
print ( [[
lwarpmk print [project]: Compile the print version if necessary.
lwarpmk print1 [project]: Forced single compile of the print version.
lwarpmk printindex [project]: Process the index for the print version.
lwarpmk printglossary [project]: Process the glossary for the print version.
lwarpmk html [project]: Compile the HTML version if necessary.
lwarpmk html1 [project]: Forced single compile of the HTML version.
lwarpmk htmlindex [project]: Process the index for the html version.
lwarpmk htmlglossary [project]: Process the glossary for the html version.
lwarpmk again [project]: Touch the source code to trigger recompiles.
lwarpmk limages [project]: Process the "lateximages" created by lwarp.sty.
lwarpmk pdftohtml [project]:
For use with latexmk or a Makefile:
Convert project_html.pdf to project_html.html and
individual HTML files.
lwarpmk clean [project]: Remove project.aux, .toc, .lof/t, .idx, .ind, .log, *_html_inc.*, .gl*
lwarpmk cleanall [project]: Remove auxiliary files and also project.pdf, *.html
lwarpmk -h: Print this help message.
lwarpmk --help: Print this help message.
]] )
printconf ()
end
-- Print the format of the configuration file lwarpmk.conf:
function printconf ()
print ( [[
An example lwarpmk.conf or <project>.lwarpmkconf project file:
--
opsystem = "Unix" (or "Windows")
latexname = "pdflatex" (or "lualatex", or "xelatex")
sourcename = "projectname" (the source-code filename w/o .tex)
homehtmlfilename = "index" (or perhaps the project name)
htmlfilename = "" (or "projectname" - filename prefix)
latexmk = "false" (or "true" to use latexmk to build PDFs)
languge = "english" (use a language supported by xindy)
xdyfile = "lwarp.xdy" (or a custom file based on lwarp.xdy)
--
Filenames must contain only letters, numbers, underscore, or dash.
Values must be in "quotes".
]] ) ;
end
-- Split one large sourcefile into a number of files,
-- starting with destfile.
-- The file is split at each occurance of <!--|Start file|newfilename|*
function splitfile (destfile,sourcefile)
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
-- Incorrect value, so print an error and exit.
function cvalueerror ( line, linenum , cvalue )
print ( linenum .. " : " .. line ) ;
print ("lwarpmk: incorrect variable value \"" .. cvalue .. "\" in lwarpmk.conf.\n" ) ;
printconf () ;
os.exit(1) ;
end
-- Load settings from the project's "lwarpmk.conf" file:
function loadconf ()
-- Default configuration filename:
local conffile = "lwarpmk.conf"
-- Optional configuration filename:
if arg[2] ~= nil then conffile = arg[2]..".lwarpmkconf" end
-- Default language:
language = "english"
-- Default xdyfile:
xdyfile = "lwarp.xdy"
-- Verify the file exists:
if (lfs.attributes(conffile,"mode")==nil) then -- file not exists
print("lwarpmk: " .. conffile .." does not exist.")
print("lwarpmk: " .. arg[2] .. " does not appear to be a project name.\n")
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:
local linenum = 0
for line in cfile:lines() do -- scan lines
linenum = linenum + 1
i,j,cvarname,cvalue = string.find (line,"([%w-_]*)%s*=%s*\"([%w%-_%.]*)\"") ;
-- Error if incorrect enclosing characters:
if ( i == nil ) then
print ( linenum .. " : " .. line ) ;
print ( "lwarpmk: Incorrect entry in " .. conffile ..".\n" ) ;
printconf () ;
os.exit(1) ;
end
if ( cvarname == "opsystem" ) then
-- Verify choice of opsystem:
if ( (cvalue == "Unix") or (cvalue == "Windows") ) then
opsystem = cvalue
else
cvalueerror ( line, linenum , cvalue )
end
elseif ( cvarname == "latexname" ) then
-- Verify choice of LaTeX compiler:
if (
(cvalue == "pdflatex") or
(cvalue == "xelatex") or
(cvalue == "lualatex")
) then
latexname = 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 == "latexmk" ) then latexmk = cvalue
elseif ( cvarname == "language" ) then language = cvalue
elseif ( cvarname == "xdyfile" ) then xdyfile = cvalue
else
print ( linenum .. " : " .. line ) ;
print ("lwarpmk: Incorrect variable name \"" .. cvarname .. "\" in " .. conffile ..".\n" ) ;
printconf () ;
os.exit(1) ;
end
end -- do scan lines
io.close(cfile)
end -- file exists
-- Select some operating-system commands:
if opsystem=="Unix" then -- For Unix / Linux / Mac OS:
rmname = "rm"
mvname = "mv"
touchnamepre = "touch"
touchnamepost = ""
dirslash = "/"
opquote= "\'"
elseif opsystem=="Windows" then -- For Windows
rmname = "DEL"
mvname = "MOVE"
touchnamepre = "COPY /b"
touchnamepost = "+,,"
dirslash = "\\"
opquote= "\""
else print ( "lwarpmk: Select Unix or Windows for opsystem" )
end --- for Windows
-- set xindycmd according to pdflatex vs xelatex/lualatex:
if ( latexname == "pdflatex" ) then
xindycmd = "texindy -C utf8"
glossarycmd = "xindy -C utf8"
else
xindycmd = "xindy -M texindy -C utf8"
glossarycmd = "xindy -C utf8"
end
end -- loadconf
function refreshdate ()
os.execute(touchnamepre .. " " .. sourcename .. ".tex " .. touchnamepost)
end
-- Scan the LaTeX log file for the phrase "Rerun to get",
-- indicating that the file should be compiled again.
-- Return true if found.
function reruntoget (filesource)
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
end
io.close(fsource)
return false
end
-- Compile one time, return true if should compile again.
-- fsuffix is "" for print, "_html" for HTML output.
function onetime (fsuffix)
print("lwarpmk: Compiling with " .. latexname .. " " .. sourcename..fsuffix)
err = os.execute(
-- "echo " ..
latexname .. " " .. sourcename..fsuffix )
if ( err ~= 0 ) then print ( "lwarpmk: Compile error.") ; os.exit(1) ; end
return (reruntoget(sourcename .. fsuffix .. ".log") ) ;
end
-- Compile up to five times.
-- fsuffix is "" for print, "_html" for HTML output
function manytimes (fsuffix)
if onetime(fsuffix) == true then
if onetime(fsuffix) == true then
if onetime(fsuffix) == true then
if onetime(fsuffix) == true then
if onetime(fsuffix) == true then
end end end end end
end
-- Exit if the given file does not exist.
function verifyfileexists (filename)
if (lfs.attributes ( filename , "modification" ) == nil ) then
print ( "lwarpmk: " .. filename .. " not found." ) ;
os.exit (1) ;
end
end
-- Convert <project>_html.pdf into HTML files:
function pdftohtml ()
-- Convert to text:
print ("lwarpmk: Converting " .. sourcename
.."_html.pdf to " .. sourcename .. "_html.html")
os.execute("pdftotext -enc UTF-8 -nopgbrk -layout "
.. sourcename .. "_html.pdf " .. sourcename .. "_html.html")
-- Split the result into individual HTML files:
splitfile (homehtmlfilename .. ".html" , sourcename .. "_html.html")
end
-- Remove auxiliary files:
function removeaux ()
os.execute ( rmname .. " " ..
sourcename ..".aux " .. sourcename .. "_html.aux " ..
sourcename ..".toc " .. sourcename .. "_html.toc " ..
sourcename ..".lof " .. sourcename .. "_html.lof " ..
sourcename ..".lot " .. sourcename .. "_html.lot " ..
sourcename ..".idx " .. sourcename .. "_html.idx " ..
sourcename ..".ind " .. sourcename .. "_html.ind " ..
sourcename ..".log " .. sourcename .. "_html.log " ..
sourcename ..".gl* " .. sourcename .. "_html.gl* " ..
"*_html_inc.*"
)
end
-- Create lateximages based on lateximages.txt:
function createlateximages ()
print ("lwarpmk: Creating lateximages.")
local limagesfile = io.open("lateximages.txt")
-- Create the lateximages directory, ignore error if already exists
err = os.execute("mkdir lateximages")
-- Scan lateximages.txt
for line in limagesfile:lines() do
-- lwimgpage is the page number in the PDF which has the image
-- lwimgnum is the sequential lateximage number to assign for the image
i,j,lwimgpage,lwimgnum = string.find (line,"|(.*)|(.*)|")
-- For each entry:
if ( (i~=nil) ) then
-- Separate out the image into its own single-page pdf:
err = os.execute(
"pdfseparate -f " .. lwimgpage .. " -l " ..
lwimgpage .. " " .. sourcename .."_html.pdf lateximagetemp-%d.pdf")
-- Crop the image:
err = os.execute(
"pdfcrop lateximagetemp-" .. lwimgpage ..".pdf lateximage-" .. lwimgnum ..".pdf")
if ( err ~= 0 ) then print ( "lwarpmk: File error.") ; os.exit(1) ; end
-- Convert the image to svg:
err = os.execute(
"pdftocairo -svg lateximage-" .. lwimgnum ..".pdf lateximage-" .. lwimgnum ..".svg")
if ( err ~= 0 ) then print ( "lwarpmk: File error.") ; os.exit(1) ; end
-- Move the result into lateximages/:
err = os.execute(
mvname .. " lateximage-" .. lwimgnum ..".svg lateximages" .. dirslash )
if ( err ~= 0 ) then print ( "lwarpmk: File error.") ; os.exit(1) ; end
-- Remove the temporary files:
err = os.execute(
rmname .. " lateximage-" .. lwimgnum ..".pdf lateximagetemp-" .. lwimgpage ..".pdf")
if ( err ~= 0 ) then print ( "lwarpmk: File error.") ; os.exit(1) ; end
end
end -- do
io.close(limagesfile)
end -- function
-- Use latexmk to compile source and index:
-- fsuffix is "" for print, or "_html" for HTML
function compilelatexmk ( fsuffix )
-- The recorder option is required to detect changes in <project>.tex
-- while we are loading <project>_html.tex.
err=os.execute ( "latexmk -pdf -dvi- -ps- -recorder "
.. "-e "
.. opquote
.. "$makeindex = q/" -- $
.. xindycmd
.. " -M " .. xdyfile
.. " -L " .. language .. " /"
.. opquote
.. " -pdflatex=\"" .. latexname .." %O %S\" "
.. sourcename..fsuffix ..".tex" ) ;
if ( err ~= 0 ) then print ( "lwarpmk: Compile error.") ; os.exit(1) ; end
end
-- 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
compilelatexmk ("")
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("")
print ("lwarpmk: Done.") ;
else
print ("lwarpmk: " .. sourcename .. ".pdf is up to date.") ;
end
end -- not latexmk
elseif arg[1] == "print1" then
loadconf ()
verifyfileexists (sourcename .. ".tex") ;
onetime("")
print ("lwarpmk: Done.") ;
-- lwarp printindex:
-- Compile the index then touch the source
-- to trigger a recompile of the document:
elseif arg[1] == "printindex" then
loadconf ()
print ("lwarpmk: Processing the index.")
os.execute(
xindycmd
.. " -M " .. xdyfile
.. " -L " .. language
.. " " .. sourcename .. ".idx")
print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.")
refreshdate ()
print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.")
print ("lwarpmk: Done.")
-- lwarp 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 .. " -L " .. language .. " -I xindy -M " .. sourcename ..
" -t " .. sourcename .. ".glg -o " .. sourcename .. ".gls "
.. sourcename .. ".glo")
print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.")
refreshdate ()
print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.")
print ("lwarpmk: Done.")
-- lwarpmk html:
elseif arg[1] == "html" then
loadconf ()
if ( latexmk == "true" ) then
compilelatexmk ("_html")
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("_html")
pdftohtml ()
print ("lwarpmk: Done.")
else
print ("lwarpmk: " .. homehtmlfilename .. ".html is up to date.")
end
end -- not latexmk
elseif arg[1] == "html1" then
loadconf ()
verifyfileexists ( sourcename .. ".tex" ) ;
onetime("_html")
pdftohtml ()
print ("lwarpmk: Done.")
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 ()
print ("lwarpmk: Processing the index.")
os.execute(
xindycmd
.. " -M " .. xdyfile
.. " -L " .. language
.. " " .. sourcename .. "_html.idx"
)
print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.")
refreshdate ()
print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.")
print ("lwarpmk: Done.")
-- lwarpmk htmlglossary:
-- Compile the glossary then touch the source
-- to trigger a recompile of the document:
elseif arg[1] == "htmlglossary" then
loadconf ()
print ("lwarpmk: Processing the glossary.")
os.execute(glossarycmd .. " -L " .. language .. " -I xindy -M " ..sourcename ..
"_html -t " .. sourcename .. "_html.glg -o " ..sourcename ..
"_html.gls " ..sourcename .. "_html.glo")
print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.")
refreshdate ()
print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.")
print ("lwarpmk: Done.")
-- lwarpmk limages:
-- Scan the lateximages.txt file to create lateximages,
-- then touch the source to trigger a recompile.
elseif arg[1] == "limages" then
loadconf ()
print ("lwarpmk: Processing images.")
createlateximages ()
print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.")
refreshdate ()
print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.")
print ("lwarpmk: Done.")
-- lwarpmk again:
-- Touch the source to trigger a recompile.
elseif arg[1] == "again" then
loadconf ()
print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.")
refreshdate ()
print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.")
print ("lwarpmk: Done.")
-- lwarpmk clean:
-- Remove project.aux, .toc, .lof, .lot, .idx, .ind, .log, *_html_inc.*, .gl*
elseif arg[1] == "clean" then
loadconf ()
removeaux ()
print ("lwarpmk: Done.")
-- lwarpmk cleanall
-- Remove project.aux, .toc, .lof, .lot, .idx, .ind, .log, *_html_inc.*, .gl*
-- and also project.pdf, *.html
elseif arg[1] == "cleanall" then
loadconf ()
removeaux ()
os.execute ( rmname .. " " ..
sourcename .. ".pdf " .. sourcename .. "_html.pdf " ..
"*.html"
)
print ("lwarpmk: Done.")
-- lwarpmk with no argument :
elseif (arg[1] == nil) then
printhelp ()
-- lwarpmk -h or lwarpmk --help :
elseif (arg[1] == "-h" ) or (arg[1] == "--help") then
printusage ()
else
print ("lwarpmk: Unknown command \""..arg[1].."\".\n")
printhelp ()
end
end -- not --version
|