summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/oberdiek/pdftexcmds.dtx
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2007-12-15 00:23:34 +0000
committerKarl Berry <karl@freefriends.org>2007-12-15 00:23:34 +0000
commit116405a01899ba783a14653896d02888e298fbb1 (patch)
treea18817a449117e864d52b1cf21f5be0eac3ed7cb /Master/texmf-dist/source/latex/oberdiek/pdftexcmds.dtx
parent61cc3ba9dfd27cde051a486dad06940dfff0e699 (diff)
oberdiek: luacolor1.0 luatex1.0 ... (14dec07)
git-svn-id: svn://tug.org/texlive/trunk@5785 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/oberdiek/pdftexcmds.dtx')
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pdftexcmds.dtx744
1 files changed, 390 insertions, 354 deletions
diff --git a/Master/texmf-dist/source/latex/oberdiek/pdftexcmds.dtx b/Master/texmf-dist/source/latex/oberdiek/pdftexcmds.dtx
index fef4d00deaa..35052537843 100644
--- a/Master/texmf-dist/source/latex/oberdiek/pdftexcmds.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/pdftexcmds.dtx
@@ -16,7 +16,8 @@
%
% This work consists of the main source file pdftexcmds.dtx
% and the derived files
-% pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv.
+% pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv,
+% oberdiek.pdftexcmds.lua, pdftexcmds.lua.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/pdftexcmds.dtx
@@ -50,6 +51,8 @@
%
% Installation:
% TDS:tex/generic/oberdiek/pdftexcmds.sty
+% TDS:scripts/oberdiek/oberdiek.pdftexcmds.lua
+% TDS:scripts/oberdiek/pdftexcmds.lua
% TDS:doc/latex/oberdiek/pdftexcmds.pdf
% TDS:source/latex/oberdiek/pdftexcmds.dtx
%
@@ -66,7 +69,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: pdftexcmds 2007/11/12 v0.2 LuaTeX support for pdfTeX utility functions (HO)}
+\Msg{* Package: pdftexcmds 2007/12/12 v0.3 LuaTeX support for pdfTeX utility functions (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -93,7 +96,8 @@ 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.
+ pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv,
+ oberdiek.pdftexcmds.lua, pdftexcmds.lua.
\endpreamble
\let\MetaPrefix\DoubleperCent
@@ -104,6 +108,17 @@ and the derived files
\usedir{tex/generic/oberdiek}%
\file{pdftexcmds.sty}{\from{pdftexcmds.dtx}{package}}%
}
+\def\MetaPrefix{-- }
+\def\defaultpostamble{%
+ \MetaPrefix^^J%
+ \MetaPrefix\space End of File `\outFileName'.%
+}
+\def\currentpostamble{\defaultpostamble}%
+\generate{%
+ \usedir{scripts/oberdiek}%
+ \file{oberdiek.pdftexcmds.lua}{\from{pdftexcmds.dtx}{lua}}%
+ \file{pdftexcmds.lua}{\from{pdftexcmds.dtx}{lua}}%
+}
\obeyspaces
\Msg{************************************************************************}
@@ -113,9 +128,9 @@ and the derived files
\Msg{*}
\Msg{* pdftexcmds.sty}
\Msg{*}
-\Msg{* And install the following script file:}
+\Msg{* And install the following script files:}
\Msg{*}
-\Msg{* }
+\Msg{* oberdiek.pdftexcmds.lua, pdftexcmds.lua}
\Msg{*}
\Msg{* To produce the documentation run the file `pdftexcmds.drv'}
\Msg{* through LaTeX.}
@@ -132,7 +147,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{pdftexcmds.drv}%
- [2007/11/12 v0.2 LuaTeX support for pdfTeX utility functions (HO)]%
+ [2007/12/12 v0.3 LuaTeX support for pdfTeX utility functions (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2007/11/11]
\usepackage{paralist}
@@ -142,7 +157,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{561}
+% \CheckSum{552}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -163,7 +178,7 @@ and the derived files
% \GetFileInfo{pdftexcmds.drv}
%
% \title{The \xpackage{pdftexcmds} package}
-% \date{2007/11/12 v0.2}
+% \date{2007/12/12 v0.3}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -397,7 +412,7 @@ and the derived files
\fi
\expandafter\x\csname ver@pdftexcmds.sty\endcsname
\ProvidesPackage{pdftexcmds}%
- [2007/11/12 v0.2 LuaTeX support for pdfTeX utility functions (HO)]
+ [2007/12/12 v0.3 LuaTeX support for pdfTeX utility functions (HO)]
% \end{macrocode}
%
% \subsection{Catcodes}
@@ -426,6 +441,7 @@ and the derived files
}%
\catcode#1 #2\relax
}
+\TMP@EnsureCode{10}{12}% ^^J
\TMP@EnsureCode{33}{12}% !
\TMP@EnsureCode{34}{12}% "
\TMP@EnsureCode{39}{12}% '
@@ -441,6 +457,7 @@ and the derived files
\TMP@EnsureCode{60}{12}% <
\TMP@EnsureCode{61}{12}% =
\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{94}{7}% ^ (superscript)
\TMP@EnsureCode{95}{12}% _ (other)
\TMP@EnsureCode{126}{12}% ~ (other)
% \end{macrocode}
@@ -518,13 +535,21 @@ and the derived files
\fi
% \end{macrocode}
%
-% \subsection{Lua functions}
+% \subsection{Load module}
%
-% \begin{macro}{\pdftexcmds@luastate}
% \begin{macrocode}
-\chardef\pdftexcmds@luastate=0 %
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname RequirePackage\endcsname\relax
+ \input luatex-loader.sty\relax
+\else
+ \RequirePackage{luatex-loader}[2007/12/12]%
+\fi
+\directlua0{%
+ require("oberdiek.pdftexcmds")%
+}
% \end{macrocode}
-% \end{macro}
+%
+% \subsection{Lua functions}
%
% \begin{macro}{\pdftexcmds@toks}
% \begin{macrocode}
@@ -537,309 +562,11 @@ and the derived files
% \end{macrocode}
% \end{macro}
%
-% \begin{macrocode}
-\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
-% \end{macrocode}
-% See procedure |unescapehex| in file \xfile{utils.c} of \pdfTeX.
-% Caution: |tex.write| ignores leading spaces.
-% \begin{macrocode}
- 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
-% \end{macrocode}
-% See procedure |escapestring| in file \xfile{utils.c} of \pdfTeX.
-% \begin{macrocode}
- 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
-% \end{macrocode}
-% Lua 5.1 returns the match in case of return value |nil|.
-% \begin{macrocode}
- return nil
- end
- )))
- end
-% \end{macrocode}
-% See procedure |escapename| in file \xfile{utils.c} of \pdfTeX.
-% \begin{macrocode}
- 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
-% \end{macrocode}
-% In Lua 5.0 |nil| could be used for the empty string,
-% But |nil| returns the match in Lua 5.1, thus we use
-% the empty string explicitly.
-% \begin{macrocode}
- 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
-% \end{macrocode}
-% Lua 5.1 returns the match in case of return value |nil|.
-% \begin{macrocode}
- 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
-% \end{macrocode}
-% See procedure |makepdftime| in file \xfile{utils.c} of \pdfTeX.
-% \begin{macrocode}
- 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
-% \end{macrocode}
-%
% \begin{macro}{\pdf@strcmp}
% \begin{macrocode}
\long\def\pdf@strcmp#1#2{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.strcmp("\luaescapestring{#1}",%
+ \directlua0{%
+ oberdiek.pdftexcmds.strcmp("\luaescapestring{#1}",%
"\luaescapestring{#2}")%
}%
}%
@@ -848,8 +575,8 @@ and the derived files
% \begin{macro}{\pdf@escapehex}
% \begin{macrocode}
\long\def\pdf@escapehex#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.escapehex("\luaescapestring{#1}", "byte")%
+ \directlua0{%
+ oberdiek.pdftexcmds.escapehex("\luaescapestring{#1}", "byte")%
}%
}%
% \end{macrocode}
@@ -857,8 +584,8 @@ and the derived files
% \begin{macro}{\pdf@escapehexnative}
% \begin{macrocode}
\long\def\pdf@escapehexnative#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.escapehex("\luaescapestring{#1}")%
+ \directlua0{%
+ oberdiek.pdftexcmds.escapehex("\luaescapestring{#1}")%
}%
}%
% \end{macrocode}
@@ -867,9 +594,9 @@ and the derived files
% \begin{macrocode}
\def\pdf@unescapehex#1{%
\the\expandafter\pdftexcmds@toks
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.toks="pdftexcmds@toks"%
- pdftexcmds.unescapehex("\luaescapestring{#1}", "byte")%
+ \directlua0{%
+ oberdiek.pdftexcmds.toks="pdftexcmds@toks"%
+ oberdiek.pdftexcmds.unescapehex("\luaescapestring{#1}", "byte")%
}%
}%
% \end{macrocode}
@@ -878,9 +605,9 @@ and the derived files
% \begin{macrocode}
\def\pdf@unescapehexnative#1{%
\the\expandafter\pdftexcmds@toks
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.toks="pdftexcmds@toks"%
- pdftexcmds.unescapehex("\luaescapestring{#1}")%
+ \directlua0{%
+ oberdiek.pdftexcmds.toks="pdftexcmds@toks"%
+ oberdiek.pdftexcmds.unescapehex("\luaescapestring{#1}")%
}%
}%
% \end{macrocode}
@@ -888,8 +615,8 @@ and the derived files
% \begin{macro}{\pdf@escapestring}
% \begin{macrocode}
\long\def\pdf@escapestring#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.escapestring("\luaescapestring{#1}", "byte")%
+ \directlua0{%
+ oberdiek.pdftexcmds.escapestring("\luaescapestring{#1}", "byte")%
}%
}
% \end{macrocode}
@@ -897,8 +624,8 @@ and the derived files
% \begin{macro}{\pdf@escapename}
% \begin{macrocode}
\long\def\pdf@escapename#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.escapename("\luaescapestring{#1}", "byte")%
+ \directlua0{%
+ oberdiek.pdftexcmds.escapename("\luaescapestring{#1}", "byte")%
}%
}
% \end{macrocode}
@@ -906,8 +633,8 @@ and the derived files
% \begin{macro}{\pdf@escapenamenative}
% \begin{macrocode}
\long\def\pdf@escapenamenative#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.escapename("\luaescapestring{#1}")%
+ \directlua0{%
+ oberdiek.pdftexcmds.escapename("\luaescapestring{#1}")%
}%
}
% \end{macrocode}
@@ -915,8 +642,8 @@ and the derived files
% \begin{macro}{\pdf@filesize}
% \begin{macrocode}
\def\pdf@filesize#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.filesize("\luaescapestring{#1}")%
+ \directlua0{%
+ oberdiek.pdftexcmds.filesize("\luaescapestring{#1}")%
}%
}
% \end{macrocode}
@@ -924,8 +651,8 @@ and the derived files
% \begin{macro}{\pdf@filemoddate}
% \begin{macrocode}
\def\pdf@filemoddate#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.filemoddate("\luaescapestring{#1}")%
+ \directlua0{%
+ oberdiek.pdftexcmds.filemoddate("\luaescapestring{#1}")%
}%
}
% \end{macrocode}
@@ -933,8 +660,8 @@ and the derived files
% \begin{macro}{\pdf@filedump}
% \begin{macrocode}
\def\pdf@filedump#1#2#3{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.filedump("\luaescapestring{\number#1}",%
+ \directlua0{%
+ oberdiek.pdftexcmds.filedump("\luaescapestring{\number#1}",%
"\luaescapestring{\number#2}",%
"\luaescapestring{#3}")%
}%
@@ -944,8 +671,8 @@ and the derived files
% \begin{macro}{\pdf@mdfivesum}
% \begin{macrocode}
\long\def\pdf@mdfivesum#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.mdfivesum("\luaescapestring{#1}", "byte")%
+ \directlua0{%
+ oberdiek.pdftexcmds.mdfivesum("\luaescapestring{#1}", "byte")%
}%
}%
% \end{macrocode}
@@ -953,8 +680,8 @@ and the derived files
% \begin{macro}{\pdf@mdfivesumnative}
% \begin{macrocode}
\long\def\pdf@mdfivesumnative#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.mdfivesum("\luaescapestring{#1}")%
+ \directlua0{%
+ oberdiek.pdftexcmds.mdfivesum("\luaescapestring{#1}")%
}%
}%
% \end{macrocode}
@@ -962,8 +689,8 @@ and the derived files
% \begin{macro}{\pdf@filemdfivesum}
% \begin{macrocode}
\def\pdf@filemdfivesum#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.filemdfivesum("\luaescapestring{#1}")%
+ \directlua0{%
+ oberdiek.pdftexcmds.filemdfivesum("\luaescapestring{#1}")%
}%
}%
% \end{macrocode}
@@ -972,8 +699,8 @@ and the derived files
% \begin{macro}{\pdf@shellescape}
% \begin{macrocode}
\def\pdf@shellescape{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.shellescape()%
+ \directlua0{%
+ oberdiek.pdftexcmds.shellescape()%
}%
}
% \end{macrocode}
@@ -982,8 +709,8 @@ and the derived files
% \begin{macro}{\pdf@system}
% \begin{macrocode}
\def\pdf@system#1{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.system("\luaescapestring{#1}")%
+ \directlua0{%
+ oberdiek.pdftexcmds.system("\luaescapestring{#1}")%
}%
}
% \end{macrocode}
@@ -992,8 +719,8 @@ and the derived files
% \begin{macro}{\pdf@lastsystemstatus}
% \begin{macrocode}
\def\pdf@lastsystemstatus{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.lastsystemstatus()%
+ \directlua0{%
+ oberdiek.pdftexcmds.lastsystemstatus()%
}%
}
% \end{macrocode}
@@ -1001,8 +728,8 @@ and the derived files
% \begin{macro}{\pdf@lastsystemexit}
% \begin{macrocode}
\def\pdf@lastsystemexit{%
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.lastsystemexit()%
+ \directlua0{%
+ oberdiek.pdftexcmds.lastsystemexit()%
}%
}
% \end{macrocode}
@@ -1012,7 +739,7 @@ and the derived files
% Check availability of |io.popen| first.
% \begin{macrocode}
\ifnum0%
- \directlua\pdftexcmds@luastate{%
+ \directlua0{%
if io.popen then %
tex.write("1")%
end%
@@ -1020,9 +747,9 @@ and the derived files
=1 %
\def\pdf@pipe#1{%
\the\expandafter\pdftexcmds@toks
- \directlua\pdftexcmds@luastate{%
- pdftexcmds.toks="pdftexcmds@toks"%
- pdftexcmds.pipe("\luaescapestring{#1}")%
+ \directlua0{%
+ oberdiek.pdftexcmds.toks="pdftexcmds@toks"%
+ oberdiek.pdftexcmds.pipe("\luaescapestring{#1}")%
}%
}%
\fi
@@ -1034,6 +761,306 @@ and the derived files
%</package>
% \end{macrocode}
%
+% \subsection{Lua module}
+%
+% \begin{macrocode}
+%<*lua>
+% \end{macrocode}
+%
+% \begin{macrocode}
+module("oberdiek.pdftexcmds", package.seeall)
+local systemexitstatus
+function strcmp(A, B)
+ if A == B then
+ tex.write("0")
+ elseif A < B then
+ tex.write("-1")
+ else
+ tex.write("1")
+ end
+end
+local function 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 escapehex(str, mode)
+ if mode == "byte" then
+ str = utf8_to_byte(str)
+ end
+ tex.write((string.gsub(str, ".",
+ function (ch)
+ return string.format("%02X", string.byte(ch))
+ end
+ )))
+end
+% \end{macrocode}
+% See procedure |unescapehex| in file \xfile{utils.c} of \pdfTeX.
+% Caution: |tex.write| ignores leading spaces.
+% \begin{macrocode}
+function 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(toks, string.char(unpack(result)))
+end
+% \end{macrocode}
+% See procedure |escapestring| in file \xfile{utils.c} of \pdfTeX.
+% \begin{macrocode}
+function escapestring(str, mode)
+ if mode == "byte" then
+ str = 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
+% \end{macrocode}
+% Lua 5.1 returns the match in case of return value |nil|.
+% \begin{macrocode}
+ return nil
+ end
+ )))
+end
+% \end{macrocode}
+% See procedure |escapename| in file \xfile{utils.c} of \pdfTeX.
+% \begin{macrocode}
+function escapename(str, mode)
+ if mode == "byte" then
+ str = utf8_to_byte(str)
+ end
+ tex.write((string.gsub(str, ".",
+ function (ch)
+ local b = string.byte(ch)
+ if b == 0 then
+% \end{macrocode}
+% In Lua 5.0 |nil| could be used for the empty string,
+% But |nil| returns the match in Lua 5.1, thus we use
+% the empty string explicitly.
+% \begin{macrocode}
+ 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
+% \end{macrocode}
+% Lua 5.1 returns the match in case of return value |nil|.
+% \begin{macrocode}
+ return nil
+ end
+ end
+ )))
+end
+function 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
+% \end{macrocode}
+% See procedure |makepdftime| in file \xfile{utils.c} of \pdfTeX.
+% \begin{macrocode}
+function 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 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)
+ escapehex(dump)
+ end
+ end
+ end
+end
+function mdfivesum(str, mode)
+ if mode == "byte" then
+ str = utf8_to_byte(str)
+ end
+ escapehex(md5.sum(str))
+end
+function 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")
+ escapehex(md5.sum(contents))
+ end
+ end
+end
+function shellescape()
+ if os.execute then
+ tex.write("1")
+ else
+ tex.write("0")
+ end
+end
+function system(cmdline)
+ systemexitstatus = nil
+ texio.write_nl("log", "system(" .. cmdline .. ") ")
+ if os.execute then
+ texio.write("log", "executed.")
+ systemexitstatus = os.execute(cmdline)
+ else
+ texio.write("log", "disabled.")
+ end
+end
+function lastsystemstatus()
+ local result = tonumber(systemexitstatus)
+ if result then
+ local x = math.floor(result / 256)
+ tex.write(result - 256 * math.floor(result / 256))
+ end
+end
+function lastsystemexit()
+ local result = tonumber(systemexitstatus)
+ if result then
+ tex.write(math.floor(result / 256))
+ end
+end
+function pipe(cmdline)
+ local result
+ 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(toks, result)
+ else
+ tex.settoks(toks, "")
+ end
+end
+% \end{macrocode}
+% \begin{macrocode}
+%</lua>
+% \end{macrocode}
+%
% \section{Test}
%
% \subsection{Catcode checks for loading}
@@ -1094,6 +1121,9 @@ and the derived files
\advance\count@ 1 %
\repeat
}
+\expandafter\ifx\csname LoadCommand\endcsname\relax
+ \def\LoadCommand{\input pdftexcmds.sty\relax}%
+\fi
\def\Test{%
\RangeCatcodeInvalid{0}{47}%
\RangeCatcodeInvalid{58}{64}%
@@ -1109,7 +1139,7 @@ and the derived files
\catcode`\%=14 %
\catcode`\ =10 %
\catcode13=5 %
- \input pdftexcmds.sty\relax
+ \LoadCommand
\RestoreCatcodes
}
\Test
@@ -1180,6 +1210,8 @@ and the derived files
% \def\t{^^A
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
% pdftexcmds.sty & tex/generic/oberdiek/pdftexcmds.sty\\
+% oberdiek.pdftexcmds.lua & scripts/oberdiek/oberdiek.pdftexcmds.lua\\
+% pdftexcmds.lua & scripts/oberdiek/pdftexcmds.lua\\
% pdftexcmds.pdf & doc/latex/oberdiek/pdftexcmds.pdf\\
% pdftexcmds.dtx & source/latex/oberdiek/pdftexcmds.dtx\\
% \end{tabular}^^A
@@ -1310,6 +1342,10 @@ and the derived files
% \item
% Short description fixed.
% \end{Version}
+% \begin{Version}{2007/12/12 v0.3}
+% \item
+% Organization of Lua code as module.
+% \end{Version}
% \end{History}
%
% \PrintIndex