Skip to content

Commit

Permalink
Merge pull request #8 from dohyunkim/master
Browse files Browse the repository at this point in the history
using textext() or TEX(), labels can be typeset with variables
  • Loading branch information
dohyunkim committed Dec 10, 2013
2 parents e5f985c + 7dc700c commit bc9f420
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 80 deletions.
7 changes: 5 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ world: all ctan
.PHONY: all doc unpack ctan tds check world

%.pdf: %.dtx
latexmk -pdf -e '$$pdflatex = q(lualatex %O %S)' -silent $< >/dev/null
latexmk -lualatex -recorder- -silent $< >/dev/null

$(UNPACKED): $(DTX)
tex -interaction=batchmode $< >/dev/null
Expand All @@ -50,7 +50,10 @@ check: $(UNPACKED)
$(CTAN_ZIP): $(SOURCES) $(DOC) $(TDS_ZIP)
@echo "Making $@ for CTAN upload."
@$(RM) -- $@
@zip -9 $@ $^ >/dev/null
@mkdir -p $(NAME)
@cp -f $(SOURCES) $(DOC) $(NAME)
@zip -9 -r $@ $(TDS_ZIP) $(NAME) >/dev/null
@rm -rf $(NAME)

define run-install
@mkdir -p $(RUNDIR) && cp $(RUNFILES) $(RUNDIR)
Expand Down
6 changes: 6 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
History of the luamplib package

2013/12/11 2.03
* implemented textext() macro which is identical to TEX() from TEX.mp.
TEX() is a synonym of textext().
* fix a bug regarding tex-text box inside for...endfor loop,
reported at http://www.ktug.org/xe/index.php?document_srl=178050

2013/09/24 2.01
* fix bug reported by Stephan Hennig: wrong baseline of tex-text box

Expand Down
186 changes: 108 additions & 78 deletions luamplib.dtx
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ See source file '\inFileName' for licencing and contact information.
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{luamplib.drv}%
[2013/09/24 v2.01 Interface for using the mplib library]%
[2013/12/11 v2.03 Interface for using the mplib library]%
\documentclass{ltxdoc}
\usepackage{metalogo,multicol,mdwlist,fancyvrb,xspace}
\usepackage[x11names]{xcolor}
Expand Down Expand Up @@ -154,7 +154,7 @@ See source file '\inFileName' for licencing and contact information.
% \author{Hans Hagen, Taco Hoekwater, Elie Roux, Philipp Gesang and Kim Dohyun\\
% Maintainer: LuaLaTeX Maintainers ---
% Support: \email{[email protected]}}
% \date{2013/09/24 v2.01}
% \date{2013/12/11 v2.03}
%
% \maketitle
%
Expand Down Expand Up @@ -186,6 +186,9 @@ See source file '\inFileName' for licencing and contact information.
% \item all \TeX\ macros start by \texttt{mplib}
% \item use of luatexbase for errors, warnings and declaration
% \item possibility to use |btex ... etex| to typeset \TeX .
% |textext()| is a more versatile macro equivalent to |TEX()| from TEX.mp.
% |TEX()| is also allowed unless TEX.mp is loaded, which should be always
% avoided.
% \end{itemize}
%
% Using this package is easy: in Plain, type your metapost code between the
Expand Down Expand Up @@ -222,8 +225,8 @@ luamplib.lastlog = ""

local err, warn, info, log = luatexbase.provides_module({
name = "luamplib",
version = 2.01,
date = "2013/09/24",
version = 2.03,
date = "2013/12/11",
description = "Lua package to typeset Metapost with LuaTeX's MPLib.",
})

Expand Down Expand Up @@ -559,55 +562,40 @@ end
% Below code has been contributed by Dohyun Kim.
% It implements \verb|btex| / \verb|etex| functions.
%
% v2.2: \verb|textext()| is now available, which is equivalent to \verb|TEX()| macro from TEX.mp.
% \verb|TEX()| is synonym of \verb|textext()| unless TEX.mp is loaded.
%
% \begin{macrocode}

local mplibcodepreamble = [[
vardef textext@#(expr n, w, h, d) =
image(
local mplibcodepreamblefirst = [[
def textext (expr t) =
image( special "%%mkTEXbox:"&t; )
enddef;
let TEX = textext;
]]

local mplibcodepreamblesecond = [[
vardef textext (expr t) =
TEXBOX := TEXBOX + 1;
image (
addto currentpicture doublepath unitsquare
xscaled w
yscaled (h+d)
shifted (0,-d)
withprescript "%%textext:"&decimal n&":"&decimal w&":"&decimal(h+d);
)
xscaled TEXBOXwd[TEXBOX]
yscaled (TEXBOXht[TEXBOX] + TEXBOXdp[TEXBOX])
shifted (0, -TEXBOXdp[TEXBOX])
withprescript "%%TEXtxtbox:" &
decimal TEXBOX & ":" &
decimal TEXBOXwd[TEXBOX] & ":" &
decimal(TEXBOXht[TEXBOX]+TEXBOXdp[TEXBOX]);
)
enddef;
def TEX (expr t) = textext (t) enddef;
]]

local factor = 65536*(7227/7200)

local function settexboxes (data)
local i = tex.count[14] -- newbox register
for _,c,_ in stringgmatch(data,"(%A)btex(%A.-%A)etex(%A)") do
i = i + 1
c = stringgsub(c,"^%s*(.-)%s*$","%1")
texsprint(format("\\setbox%i\\hbox{%s}",i,c))
end
end

luamplib.settexboxes = settexboxes

local function gettexboxes (data)
local i = tex.count[14] -- the same newbox register
data = stringgsub(data,"(%A)btex%A.-%Aetex(%A)",
function(pre,post)
i = i + 1
local box = tex.box[i]
local boxmetr = format("textext(%i,%f,%f,%f)",
i,
box and (box.width/factor) or 0,
box and (box.height/factor) or 0,
box and (box.depth/factor) or 0)
return pre .. boxmetr .. post
end)
return mplibcodepreamble .. data
end

luamplib.gettexboxes = gettexboxes

local function puttexboxes (object)
local n,tw,th = stringmatch(
object.prescript,
"%%%%textext:(%d+):([%d%.%+%-]+):([%d%.%+%-]+)")
local function putTEXboxes (object)
local n,tw,th = stringmatch(object.prescript,
"%%%%TEXtxtbox:(%d+):([%d%.%+%-]+):([%d%.%+%-]+)")
if n and tw and th then
local op = object.path
local first, second, fourth = op[1], op[2], op[4]
Expand All @@ -622,6 +610,64 @@ local function puttexboxes (object)
end
end

local function domakeTEXboxes (data)
local num = tex.count[14] -- newbox register
if data and data.fig then
local figures = data.fig
for f=1, #figures do
local figure = figures[f]
local objects = getobjects(data,figure,f)
if objects then
for o=1,#objects do
local object = objects[o]
local prescript = object.prescript
if prescript and stringfind(prescript,"%%%%mkTEXbox:") then
num = num + 1
stringgsub(prescript, "%%%%mkTEXbox:(.+)",
function(str)
texsprint(format("\\setbox%i\\hbox{%s}",num,str))
end)
end
end
end
end
end
end

local function makeTEXboxes (data)
data = stringgsub(data,"(%A)btex(%A.-%A)etex(%A)",
function(pre,texcode,post)
texcode = stringgsub(texcode,"^%s*(.-)%s*$","%1")
return pre .. "textext(\"" .. texcode .. "\")" .. post
end)
local mpx = luamplib.load(currentformat)
if mpx and data then
local result = mpx:execute(mplibcodepreamblefirst .. data)
domakeTEXboxes(result)
end
return data
end

luamplib.makeTEXboxes = makeTEXboxes

local function processwithTEXboxes (data)
local num = tex.count[14] -- the same newbox register
local prepreamble = "numeric TEXBOX, TEXBOXwd[], TEXBOXht[], TEXBOXdp[];\n"..
"TEXBOX := "..num..";\n"
while true do
num = num + 1
local box = tex.box[num]
if not box then break end
prepreamble = prepreamble ..
"TEXBOXwd["..num.."] := "..box.width/factor ..";\n"..
"TEXBOXht["..num.."] := "..box.height/factor..";\n"..
"TEXBOXdp["..num.."] := "..box.depth /factor..";\n"
end
process(prepreamble .. mplibcodepreamblesecond .. data)
end

luamplib.processwithTEXboxes = processwithTEXboxes

% \end{macrocode}
% End of \verb|btex| -- \verb|etex| patch.
%
Expand Down Expand Up @@ -656,8 +702,8 @@ local function flush(result,flusher)
%
% \begin{macrocode}
local prescript = object.prescript --- [be]tex patch
if prescript and stringfind(prescript,"%%%%textext:") then
puttexboxes(object)
if prescript and stringfind(prescript,"%%%%TEXtxtbox:") then
putTEXboxes(object)
elseif objecttype == "start_bounds" or objecttype == "stop_bounds" then
-- skip
elseif objecttype == "start_clip" then
Expand Down Expand Up @@ -810,7 +856,7 @@ luamplib.colorconverter = colorconverter
%<*package>
% \end{macrocode}
%
% First we need to load fancyvrb, to define the environment mplibcode.
% First we need to load some packages.
%
% \begin{macrocode}
\bgroup\expandafter\expandafter\expandafter\egroup
Expand All @@ -819,7 +865,7 @@ luamplib.colorconverter = colorconverter
\else
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{luamplib}
[2013/09/24 v2.01 mplib package for LuaTeX]
[2013/12/11 v2.03 mplib package for LuaTeX]
\RequirePackage{luatexbase-modutils}
\RequirePackage{pdftexcmds}
\fi
Expand Down Expand Up @@ -863,10 +909,15 @@ luamplib.colorconverter = colorconverter
}
% \end{macrocode}
%
% Make \verb|btex...etex| box zero-metric.
%
% \begin{macrocode}
\def\mplibputtextbox#1{\vbox to 0pt{\vss\hbox to 0pt{\raise\dp#1\copy#1\hss}}}
% \end{macrocode}
%
% The Plain-specific stuff.
%
% \begin{macrocode}
\def\mplibputtextbox#1{\vbox to 0pt{\vss\hbox to 0pt{\raise\dp#1\box#1\hss}}}
\bgroup\expandafter\expandafter\expandafter\egroup
\expandafter\ifx\csname ProvidesPackage\endcsname\relax
\def\mplibcode{%
Expand All @@ -877,38 +928,16 @@ luamplib.colorconverter = colorconverter
\long\def\mplibdocode#1\endmplibcode{%
\egroup
\directlua{
luamplib.settexboxes([===[\unexpanded{#1}]===])
luamplib.tempdata = luamplib.makeTEXboxes([===[\unexpanded{#1}]===])
}%
\directlua{
local data = luamplib.gettexboxes([===[\unexpanded{#1}]===])
luamplib.process(data)
luamplib.processwithTEXboxes(luamplib.tempdata)
}%
}
\else
% \end{macrocode}
%
% The \LaTeX-specific parts. First a Hack for the catcodes in \LaTeX .
%
% \begin{macrocode}
\begingroup
\catcode`\,=13
\catcode`\-=13
\catcode`\<=13
\catcode`\>=13
\catcode`\^^I=13
\catcode`\`=13 % must be last...
\gdef\FV@hack{%
\def,{\string,}%
\def-{\string-}%
\def<{\string<}%
\def>{\string>}%
\def`{\string`}%
\def^^I{\string^^I}%
}
\endgroup
% \end{macrocode}
%
% The \LaTeX\ environment.
% The \LaTeX-specific parts: a new environment.
%
% \begin{macrocode}
\newenvironment{mplibcode}{\toks@{}\ltxdomplibcode}{}
Expand All @@ -925,10 +954,11 @@ luamplib.colorconverter = colorconverter
%
\def\ltxdomplibcodefinally#1{%
\ifnum\pdf@strcmp{#1}{mplibcode}=\z@
\directlua{luamplib.settexboxes([===[\the\toks@]===])}%
\directlua{
local data = luamplib.gettexboxes([===[\the\toks@]===])
luamplib.process(data)
luamplib.tempdata = luamplib.makeTEXboxes([===[\the\toks@]===])
}%
\directlua{
luamplib.processwithTEXboxes(luamplib.tempdata)
}%
\end{mplibcode}%
\else
Expand Down

0 comments on commit bc9f420

Please sign in to comment.