summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/scripts/l3build/l3build-typesetting.lua')
-rw-r--r--Master/texmf-dist/scripts/l3build/l3build-typesetting.lua249
1 files changed, 249 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua b/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua
new file mode 100644
index 00000000000..229745dafc6
--- /dev/null
+++ b/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua
@@ -0,0 +1,249 @@
+--[[
+
+File l3build-typesetting.lua Copyright (C) 2018 The LaTeX3 Project
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is in the file
+
+ http://www.latex-project.org/lppl.txt
+
+This file is part of the "l3build bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+-----------------------------------------------------------------------
+
+The development version of the bundle can be found at
+
+ https://github.com/latex3/l3build
+
+for those people who are interested.
+
+--]]
+
+--
+-- Auxiliary functions for typesetting: need to be generally available
+--
+
+local gsub = string.gsub
+local match = string.match
+
+function dvitopdf(name, dir, engine, hide)
+ if match(engine, "^u?ptex$") then
+ run(
+ dir,
+ (forcecheckepoch and setepoch() or "") ..
+ "dvipdfmx " .. name .. dviext
+ .. (hide and (" > " .. os_null) or "")
+ )
+ else
+ run(
+ dir,
+ (forcecheckepoch and setepoch() or "") ..
+ "dvips " .. name .. dviext
+ .. (hide and (" > " .. os_null) or "")
+ .. os_concat ..
+ "ps2pdf " .. name .. psext
+ .. (hide and (" > " .. os_null) or "")
+ )
+ end
+end
+
+-- An auxiliary used to set up the environmental variables
+function runtool(subdir, dir, envvar, command)
+ dir = dir or "."
+ return(
+ run(
+ typesetdir .. "/" .. subdir,
+ (forcedocepoch and setepoch() or "") ..
+ os_setenv .. " " .. envvar .. "=." .. os_pathsep
+ .. abspath(localdir) .. os_pathsep
+ .. abspath(dir .. "/" .. subdir)
+ .. (typesetsearch and os_pathsep or "")
+ .. os_concat ..
+ command
+ )
+ )
+end
+
+function biber(name, dir)
+ if fileexists(typesetdir .. "/" .. name .. ".bcf") then
+ local path, name = splitpath(name)
+ return(
+ runtool(path, dir, "BIBINPUTS", biberexe .. " " .. biberopts .. " " .. name)
+ )
+ end
+ return 0
+end
+
+function bibtex(name, dir)
+ if fileexists(typesetdir .. "/" .. name .. ".aux") then
+ -- LaTeX always generates an .aux file, so there is a need to
+ -- look inside it for a \citation line
+ local grep
+ if os_type == "windows" then
+ grep = "\\\\"
+ else
+ grep = "\\\\\\\\"
+ end
+ local path, name = splitpath(name)
+ if run(
+ typesetdir,
+ os_grepexe .. " \"^" .. grep .. "citation{\" " .. name .. ".aux > "
+ .. os_null
+ ) + run(
+ typesetdir,
+ os_grepexe .. " \"^" .. grep .. "bibdata{\" " .. name .. ".aux > "
+ .. os_null
+ ) == 0 then
+ return(
+ -- Cheat slightly as we need to set two variables
+ runtool(
+ path, dir,
+ "BIBINPUTS",
+ os_setenv .. " BSTINPUTS=." .. os_pathsep
+ .. abspath(localdir)
+ .. (typesetsearch and os_pathsep or "") ..
+ os_concat ..
+ bibtexexe .. " " .. bibtexopts .. " " .. name
+ )
+ )
+ end
+ end
+ return 0
+end
+
+function makeindex(name, dir, inext, outext, logext, style)
+ if fileexists(typesetdir .. "/" .. name .. inext) then
+ local path, name = splitpath(name)
+ if style == "" then style = nil end
+ return(
+ runtool(
+ path, dir,
+ "INDEXSTYLE",
+ makeindexexe .. " " .. makeindexopts
+ .. " -o " .. name .. outext
+ .. (style and (" -s " .. style) or "")
+ .. " -t " .. name .. " " .. name .. inext
+ )
+ )
+ end
+ return 0
+end
+
+function tex(file, dir)
+ local path, name = splitpath(file)
+ return(
+ runtool(
+ path, dir,
+ "TEXINPUTS",
+ typesetexe .. " " .. typesetopts .. " \"" .. typesetcmds
+ .. "\\input " .. name .. "\""
+ )
+ )
+end
+
+function typesetpdf(file, dir)
+ local name = gsub(file, "%.[^.]+$", "")
+ print("Typesetting " .. name)
+ local errorlevel = typeset(file, dir)
+ if errorlevel == 0 then
+ name = name .. ".pdf"
+ os.remove(jobname(name))
+ cp(name, typesetdir, docfiledir)
+ else
+ print(" ! Compilation failed")
+ end
+ return errorlevel
+end
+
+typeset = typeset or function(file, dir)
+ dir = dir or "."
+ local errorlevel = tex(file, dir)
+ if errorlevel ~= 0 then
+ return errorlevel
+ else
+ local name = jobname(file)
+ errorlevel = biber(name, dir) + bibtex(name, dir)
+ if errorlevel == 0 then
+ local function cycle(name, dir)
+ return(
+ makeindex(name, dir, ".glo", ".gls", ".glg", glossarystyle) +
+ makeindex(name, dir, ".idx", ".ind", ".ilg", indexstyle) +
+ tex(file, dir)
+ )
+ end
+ for i = 1, typesetruns do
+ errorlevel = cycle(name, dir)
+ if errorlevel ~= 0 then break end
+ end
+ end
+ return errorlevel
+ end
+end
+
+
+-- A hook to allow additional typesetting of demos
+typeset_demo_tasks = typeset_demo_tasks or function()
+ return 0
+end
+
+-- Typeset all required documents
+-- Uses a set of dedicated auxiliaries that need to be available to others
+function doc(files)
+ -- Set up
+ cleandir(typesetdir)
+ for _,filetype in pairs(
+ {bibfiles, docfiles, typesetfiles, typesetdemofiles}
+ ) do
+ for _,file in pairs(filetype) do
+ cp(file, docfiledir, typesetdir)
+ end
+ end
+ for _,file in pairs(sourcefiles) do
+ cp(file, sourcefiledir, typesetdir)
+ end
+ for _,file in pairs(typesetsuppfiles) do
+ cp(file, supportdir, typesetdir)
+ end
+ depinstall(typesetdeps)
+ unpack({sourcefiles, typesetsourcefiles}, {sourcefiledir, docfiledir})
+ -- Main loop for doc creation
+ local done = {}
+ local errorlevel = typeset_demo_tasks()
+ if errorlevel ~= 0 then
+ return errorlevel
+ end
+ for _, typesetfiles in ipairs({typesetdemofiles, typesetfiles}) do
+ for _,i in ipairs(typesetfiles) do
+ for _, dir in ipairs({unpackdir, typesetdir}) do
+ for j,_ in pairs(tree(dir, i)) do
+ if not done[j] then
+ j = gsub(j, "^%./", "")
+ -- Allow for command line selection of files
+ local typeset = true
+ if files and next(files) then
+ typeset = false
+ for _,k in ipairs(files) do
+ if k == gsub(j, "%.[^.]+$", "") then
+ typeset = true
+ break
+ end
+ end
+ end
+ if typeset then
+ local errorlevel = typesetpdf(j, dir)
+ if errorlevel ~= 0 then
+ return errorlevel
+ else
+ done[j] = true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return 0
+end