%% %% This is file `pdftexcmds.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% pdftexcmds.dtx (with options: `package') %% %% This is a generated file. %% %% Copyright (C) 2007 by Heiko Oberdiek %% %% 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 (at your option) 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". %% %% This Current Maintainer of this work is Heiko Oberdiek. %% %% This work consists of the main source file pdftexcmds.dtx %% and the derived files %% pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv. %% \begingroup \catcode44 12 % , \catcode45 12 % - \catcode46 12 % . \catcode58 12 % : \catcode64 11 % @ \expandafter\let\expandafter\x\csname ver@pdftexcmds.sty\endcsname \ifcase 0% \ifx\x\relax % plain \else \ifx\x\empty % LaTeX \else 1% \fi \fi \else \catcode35 6 % # \catcode123 1 % { \catcode125 2 % } \expandafter\ifx\csname PackageInfo\endcsname\relax \def\x#1#2{% \immediate\write-1{Package #1 Info: #2.}% }% \else \def\x#1#2{\PackageInfo{#1}{#2, stopped}}% \fi \x{pdftexcmds}{The package is already loaded}% \endgroup \expandafter\endinput \fi \endgroup \begingroup \catcode35 6 % # \catcode40 12 % ( \catcode41 12 % ) \catcode44 12 % , \catcode45 12 % - \catcode46 12 % . \catcode47 12 % / \catcode58 12 % : \catcode64 11 % @ \catcode123 1 % { \catcode125 2 % } \expandafter\ifx\csname ProvidesPackage\endcsname\relax \def\x#1#2#3[#4]{\endgroup \immediate\write-1{Package: #3 #4}% \xdef#1{#4}% }% \else \def\x#1#2[#3]{\endgroup #2[{#3}]% \ifx#1\relax \xdef#1{#3}% \fi }% \fi \expandafter\x\csname ver@pdftexcmds.sty\endcsname \ProvidesPackage{pdftexcmds}% [2007/11/12 v0.2 LuaTeX support for pdfTeX utility functions (HO)] \begingroup \catcode123 1 % { \catcode125 2 % } \def\x{\endgroup \expandafter\edef\csname pdftexcmds@AtEnd\endcsname{% \catcode35 \the\catcode35\relax \catcode64 \the\catcode64\relax \catcode123 \the\catcode123\relax \catcode125 \the\catcode125\relax }% }% \x \catcode35 6 % # \catcode64 11 % @ \catcode123 1 % { \catcode125 2 % } \def\TMP@EnsureCode#1#2{% \edef\pdftexcmds@AtEnd{% \pdftexcmds@AtEnd \catcode#1 \the\catcode#1\relax }% \catcode#1 #2\relax } \TMP@EnsureCode{33}{12}% ! \TMP@EnsureCode{34}{12}% " \TMP@EnsureCode{39}{12}% ' \TMP@EnsureCode{40}{12}% ( \TMP@EnsureCode{41}{12}% ) \TMP@EnsureCode{42}{12}% * \TMP@EnsureCode{43}{12}% + \TMP@EnsureCode{44}{12}% , \TMP@EnsureCode{45}{12}% - \TMP@EnsureCode{46}{12}% . \TMP@EnsureCode{47}{12}% / \TMP@EnsureCode{58}{12}% : \TMP@EnsureCode{60}{12}% < \TMP@EnsureCode{61}{12}% = \TMP@EnsureCode{62}{12}% > \TMP@EnsureCode{95}{12}% _ (other) \TMP@EnsureCode{126}{12}% ~ (other) \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname RequirePackage\endcsname\relax \input infwarerr.sty\relax \else \RequirePackage{infwarerr}[2007/09/09]% \fi \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname directlua\endcsname\relax \@PackageInfo{pdftexcmds}{LuaTeX not detected}% \def\pdftexcmds@nopdftex{% \@PackageInfoNoLine{pdftexcmds}{pdfTeX >= 1.30 not detected}% \let\pdftexcmds@nopdftex\relax }% \def\pdftexcmds@temp#1{% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdf#1\endcsname\relax \pdftexcmds@nopdftex \else \expandafter\def\csname pdf@#1\expandafter\endcsname \expandafter##\expandafter{% \csname pdf#1\endcsname }% \fi }% \pdftexcmds@temp{strcmp}% \pdftexcmds@temp{escapehex}% \let\pdf@escapehexnative\pdf@escapehex \pdftexcmds@temp{unescapehex}% \let\pdf@unescapehexnative\pdf@unescapehex \pdftexcmds@temp{escapestring}% \pdftexcmds@temp{escapename}% \pdftexcmds@temp{filesize}% \pdftexcmds@temp{filemoddate}% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdfshellescape\endcsname\relax \pdftexcmds@nopdftex \else \def\pdf@shellescape{% \pdfshellescape }% \fi \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdffiledump\endcsname\relax \pdftexcmds@nopdftex \else \def\pdf@filedump#1#2#3{% \pdffiledump offset#1 length#2{#3}% }% \fi \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdfmdfivesum\endcsname\relax \pdftexcmds@nopdftex \else \def\pdf@mdfivesum#{\pdfmdfivesum}% \let\pdf@mdfivesumnative\pdf@mdfivesum \def\pdf@filemdfivesum#{\pdfmdfivesum file}% \fi \def\pdf@system#{% \immediate\write18% }% \pdftexcmds@AtEnd \expandafter\endinput \fi \chardef\pdftexcmds@luastate=0 % \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname newtoks\endcsname\relax \toksdef\pdftexcmds@toks=0 % \else \csname newtoks\endcsname\pdftexcmds@toks \fi \begingroup \escapechar=92 % \edef\\{\string\\}% \catcode35=12 % # \catcode37=12\relax \directlua\pdftexcmds@luastate{ pdftexcmds = {} function pdftexcmds.strcmp(A, B) if A == B then tex.write("0") elseif A < B then tex.write("-1") else tex.write("1") end end function pdftexcmds.utf8_to_byte(str) local i = 0 local n = string.len(str) local t = {} while i < n do i = i + 1 local a = string.byte(str, i) if a < 128 then table.insert(t, string.char(a)) else if a >= 192 and i < n then i = i + 1 local b = string.byte(str, i) if b < 128 or b >= 192 then i = i - 1 elseif a == 194 then table.insert(t, string.char(b)) elseif a == 195 then table.insert(t, string.char(b + 64)) end end end end return table.concat(t) end function pdftexcmds.escapehex(str, mode) if mode == "byte" then str = pdftexcmds.utf8_to_byte(str) end tex.write((string.gsub(str, ".", function (ch) return string.format("%02X", string.byte(ch)) end ))) end function pdftexcmds.unescapehex(str, mode) local a = 0 local first = true local result = {} for i = 1, string.len(str), 1 do local ch = string.byte(str, i) if ch >= 48 and ch <= 57 then ch = ch - 48 elseif ch >= 65 and ch <= 70 then ch = ch - 55 elseif ch >= 97 and ch <= 102 then ch = ch - 87 else ch = nil end if ch then if first then a = ch * 16 first = false else table.insert(result, a + ch) first = true end end end if not first then table.insert(result, a) end if mode == "byte" then local utf8 = {} for i, a in ipairs(result) do if a < 128 then table.insert(utf8, a) else if a < 192 then table.insert(utf8, 194) a = a - 128 else table.insert(utf8, 195) a = a - 192 end table.insert(utf8, a + 128) end end result = utf8 end tex.settoks(pdftexcmds.toks, string.char(unpack(result))) end function pdftexcmds.escapestring(str, mode) if mode == "byte" then str = pdftexcmds.utf8_to_byte(str) end tex.write((string.gsub(str, ".", function (ch) local b = string.byte(ch) if b < 33 or b > 126 then return string.format("\\%.3o", b) end if b == 40 or b == 41 or b == 92 then return "\\" .. ch end return nil end ))) end function pdftexcmds.escapename(str, mode) if mode == "byte" then str = pdftexcmds.utf8_to_byte(str) end tex.write((string.gsub(str, ".", function (ch) local b = string.byte(ch) if b == 0 then return "" end if b <= 32 or b >= 127 or b == 35 or b == 37 or b == 40 or b == 41 or b == 47 or b == 60 or b == 62 or b == 91 or b == 93 or b == 123 or b == 125 then return string.format("#%.2X", b) else return nil end end ))) end function pdftexcmds.filesize(filename) local foundfile = kpse.find_file(filename, "tex", true) if foundfile then local size = lfs.attributes(foundfile, "size") if size then tex.write(size) end end end function pdftexcmds.filemoddate(filename) local foundfile = kpse.find_file(filename, "tex", true) if foundfile then local date = lfs.attributes(foundfile, "modification") if date then local d = os.date("*t", date) if d.sec >= 60 then d.sec = 59 end local u = os.date("!*t", date) local off = 60 * (d.hour - u.hour) + d.min - u.min if d.year ~= u.year then if d.year > u.year then off = off + 1440 else off = off - 1440 end elseif d.yday ~= u.yday then if d.yday > u.yday then off = off + 1440 else off = off - 1440 end end local timezone if off == 0 then timezone = "Z" else local hours = math.floor(off / 60) local mins = math.abs(off - hours * 60) timezone = string.format("%+03d'%02d'", hours, mins) end tex.write(string.format("D:%04d%02d%02d%02d%02d%02d%s", d.year, d.month, d.day, d.hour, d.min, d.sec, timezone)) end end end function pdftexcmds.filedump(offset, length, filename) length = tonumber(length) if length and length > 0 then local foundfile = kpse.find_file(filename, "tex", true) if foundfile then offset = tonumber(offset) if not offset then offset = 0 end local filehandle = io.open(foundfile, "r") if filehandle then if offset > 0 then filehandle:seek("set", offset) end local dump = filehandle:read(length) pdftexcmds.escapehex(dump) end end end end function pdftexcmds.mdfivesum(str, mode) if mode == "byte" then str = pdftexcmds.utf8_to_byte(str) end pdftexcmds.escapehex(md5.sum(str)) end function pdftexcmds.filemdfivesum(filename) local foundfile = kpse.find_file(filename, "tex", true) if foundfile then local filehandle = io.open(foundfile, "r") if filehandle then local contents = filehandle:read("*a") pdftexcmds.escapehex(md5.sum(contents)) end end end function pdftexcmds.shellescape() if os.execute then tex.write("1") else tex.write("0") end end function pdftexcmds.system(cmdline) pdftexcmds.systemexitstatus = nil texio.write_nl("log", "system(" .. cmdline .. ") ") if os.execute then texio.write("log", "executed.") pdftexcmds.systemexitstatus = os.execute(cmdline) else texio.write("log", "disabled.") end end function pdftexcmds.lastsystemstatus() local result = tonumber(pdftexcmds.systemexitstatus) if result then local x = math.floor(result / 256) tex.write(result - 256 * math.floor(result / 256)) end end function pdftexcmds.lastsystemexit() local result = tonumber(pdftexcmds.systemexitstatus) if result then tex.write(math.floor(result / 256)) end end function pdftexcmds.pipe(cmdline) local result pdftexcmds.systemexitstatus = nil texio.write_nl("log", "pipe(" .. cmdline ..") ") if io.popen then texio.write("log", "executed.") local handle = io.popen(cmdline, "r") if handle then result = handle:read("*a") handle:close() end else texio.write("log", "disabled.") end if result then tex.settoks(pdftexcmds.toks, result) else tex.settoks(pdftexcmds.toks, "") end end } \endgroup \long\def\pdf@strcmp#1#2{% \directlua\pdftexcmds@luastate{% pdftexcmds.strcmp("\luaescapestring{#1}",% "\luaescapestring{#2}")% }% }% \long\def\pdf@escapehex#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.escapehex("\luaescapestring{#1}", "byte")% }% }% \long\def\pdf@escapehexnative#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.escapehex("\luaescapestring{#1}")% }% }% \def\pdf@unescapehex#1{% \the\expandafter\pdftexcmds@toks \directlua\pdftexcmds@luastate{% pdftexcmds.toks="pdftexcmds@toks"% pdftexcmds.unescapehex("\luaescapestring{#1}", "byte")% }% }% \def\pdf@unescapehexnative#1{% \the\expandafter\pdftexcmds@toks \directlua\pdftexcmds@luastate{% pdftexcmds.toks="pdftexcmds@toks"% pdftexcmds.unescapehex("\luaescapestring{#1}")% }% }% \long\def\pdf@escapestring#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.escapestring("\luaescapestring{#1}", "byte")% }% } \long\def\pdf@escapename#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.escapename("\luaescapestring{#1}", "byte")% }% } \long\def\pdf@escapenamenative#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.escapename("\luaescapestring{#1}")% }% } \def\pdf@filesize#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.filesize("\luaescapestring{#1}")% }% } \def\pdf@filemoddate#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.filemoddate("\luaescapestring{#1}")% }% } \def\pdf@filedump#1#2#3{% \directlua\pdftexcmds@luastate{% pdftexcmds.filedump("\luaescapestring{\number#1}",% "\luaescapestring{\number#2}",% "\luaescapestring{#3}")% }% }% \long\def\pdf@mdfivesum#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.mdfivesum("\luaescapestring{#1}", "byte")% }% }% \long\def\pdf@mdfivesumnative#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.mdfivesum("\luaescapestring{#1}")% }% }% \def\pdf@filemdfivesum#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.filemdfivesum("\luaescapestring{#1}")% }% }% \def\pdf@shellescape{% \directlua\pdftexcmds@luastate{% pdftexcmds.shellescape()% }% } \def\pdf@system#1{% \directlua\pdftexcmds@luastate{% pdftexcmds.system("\luaescapestring{#1}")% }% } \def\pdf@lastsystemstatus{% \directlua\pdftexcmds@luastate{% pdftexcmds.lastsystemstatus()% }% } \def\pdf@lastsystemexit{% \directlua\pdftexcmds@luastate{% pdftexcmds.lastsystemexit()% }% } \ifnum0% \directlua\pdftexcmds@luastate{% if io.popen then % tex.write("1")% end% }% =1 % \def\pdf@pipe#1{% \the\expandafter\pdftexcmds@toks \directlua\pdftexcmds@luastate{% pdftexcmds.toks="pdftexcmds@toks"% pdftexcmds.pipe("\luaescapestring{#1}")% }% }% \fi \pdftexcmds@AtEnd \endinput %% %% End of file `pdftexcmds.sty'.