%% %% This is file `placeat.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% placeat.dtx (with options: `package') %% %% EXPERIMENTAL CODE %% %% This package is copyright © 2014 Arno L. Trautmann. It may be distributed and/or %% modified under the conditions of the LaTeX Project Public License, either version 1.3c %% of this license or (at your option) any later version. This work has the LPPL mainten- %% ance status ‘maintained’. \ProvidesPackage{placeat}% [2014/04/18 v0.1a absolute content positioning] \RequirePackage{luatexbase} \RequirePackage{luacode} \RequirePackage{atbegshi} \RequirePackage{xparse} \directlua{dofile(kpse.find_file("placeat.lua",'lua'))} \NewDocumentCommand\placeat{ggd()d<>O{}mo}{ \IfValueT{#1}{ %% two coordinates in { }{ } pair. \IfValueT{#2}{ %% if second argument is not given, everything breaks. not nice. \def\cox{#1} \def\coy{#2} } } \IfValueT{#3}{ %% one argument as ( , ) coordinate pair. \def\cox{\firstof#3X} \def\coy{\secondof#3X} } \IfValueT{#4}{ \luadirect{ y = string.byte('#4',1)-64 x = string.byte('#4',2)-48 x2 = string.byte('#4',3) if x2 then x = x*10 + x2-48 end -- FIXME: what exactly happens here? … } \def\cox{\luadirect{tex.print(x)}} \def\coy{\luadirect{tex.print(y)}} } \placeatthreenumbers{\cox}{\coy}{\llap{#5}#6} \IfValueT{#7}{ \expandafter\gdef\csname #7x\endcsname{\firstof#3X} \expandafter\gdef\csname #7y\endcsname{\secondof#3X} } } \NewDocumentCommand\placerelto{oggd()d<>O{}mo}{ \IfValueT{#2}{ %% two coordinates in { }{ } pair. \IfValueT{#3}{ %% if second argument is not given, everything breaks. not nice. \def\cox{#2} \def\coy{#3} } } \IfValueT{#4}{ %% one argument as ( , ) coordinate pair. \def\cox{\firstof#4X} \def\coy{\secondof#4X} } \IfValueT{#5}{ \luaexec{ y = string.byte('#5',1)-64 x = string.byte('#5',2)-48 x2 = string.byte('#5',3) if x2 then x = x*10 + x2-48 end -- FIXME: what exactly happens here? … tex.print("\\def\\cox{"..(x).."}\\def\\coy{"..(y).."}") } } \placeatthreenumbers {\cox + \csname #1x\endcsname} {\coy + \csname #1y\endcsname} {\llap{#6}#7} \IfValueT{#8}{ \expandafter\xdef\csname #8x\endcsname{\cox + \csname #1x\endcsname} \expandafter\xdef\csname #8y\endcsname{\coy + \csname #1y\endcsname} } } \NewDocumentCommand\placeminipageat{d()O{10cm}m}{ \gdef\widthofplaceat{#2} \placeat(#1) {\begin{minipage}{\widthofplaceat}{#3}\end{minipage}} } \def\placeatthreenumbers#1#2#3{ \luaexec{ nr = nr+1 dacoordtmp = ((#1-1+offsetx)*tex.pagewidth/65536/gridnrx*1.005)..","..(-(#2-1+offsety)*tex.pageheight/65536/gridnry) dacoord[nr] = "\\put("..dacoordtmp..")" tex.print("\\expandafter\\gdef\\csname command"..(nr).."\\endcsname")}% begin of command definition {#3} %% this is what \command[nr] will contain } \def\firstof #1,#2X{#1} \def\secondof #1,#2X{#2} \let\ifdrawgrid\iftrue \luaexec{ drawgrid = false nr = 0 dacoord = {} gridnr = 10 gridnrx = 10 gridnry = 10 gridlinewidth = 0.01 offsetx = 0 offsety = 0 } \AtBeginDocument{ \AtBeginShipout{% \AtBeginShipoutUpperLeftForeground{% \ifdrawgrid\drawgrid\fi \luaexec{% for i = 1,nr do tex.print(dacoord[i].."{\\csname command"..(i).."\\endcsname}") end nr=0 } } } } \def\drawgrid{ \luatexlatelua{ pdf_print("q") linewidth(gridlinewidth) for i = 1,math.max(gridnrx,gridnry) do h = i*tex.pageheight/gridnry/65536 w = i*tex.pagewidth/gridnrx/65536 move(0,-h) line(tex.pagewidth,-h) stroke() move(w,0) line(w,-tex.pageheight) stroke() end pdf_print("Q") } { %% extra grouping to keep font size change local. Going to normalfont seems to make sense. An explicit font for the grid might also be nice. Implementation only upon request. %% would also be nice to maybe adapt the fontsize to the grid size \normalfont\fontsize{8}{10}\selectfont \luaexec{ for i=1,math.max(gridnrx+offsetx,gridnry+offsety) do hfac = tex.pageheight/gridnry/65536 %% another empirical factor wfac = tex.pagewidth/gridnrx/65536*1.005 %% another empirical factor h = (i-1)*hfac w = (i-1)*wfac tex.print("\\put("..(w)..",-7){\\rlap{"..(i-offsetx).."}}") if alphanumgrid then tex.print("\\put(0,"..(-h-0.05*hfac).."){\\char00"..(64+i-offsety).."}") %%-- for alphanumeric grid. else tex.print("\\put(0,"..(-h-0.05*hfac).."){"..(i-offsety).."}") end end } } } \NewDocumentCommand\placelineat{ou{(}u{,}u{)(}u{,}u{)}}{ \placeat{#3}{#4}{\ignorespaces\IfValueT{#1}{\color{#1}}% \luatexlatelua{placelineat(#3,-#4,#5,-#6)} } } \NewDocumentCommand\placearrowat{ou{(}u{,}u{)(}u{,}u{)}}{ \placeat{#3}{#4}{\ignorespaces\IfValueT{#1}{\color{#1}}% \luatexlatelua{placearrowat(#3,-#4,#5,-#6)} } } \NewDocumentCommand\placecircleat{ou{(}u{,}u{)}G{3}}{ \placeat{#3}{#4}{\ignorespaces\IfValueT{#1}{\color{#1}}% \luatexlatelua{placecircleat(#5)} } } \NewDocumentCommand\placesquareat{ou{(}u{,}u{)}G{3}}{ \placeat{#3}{#4}{\ignorespaces\IfValueT{#1}{\color{#1}}% \luatexlatelua{placesquareat(#5)} } } \NewDocumentCommand\placerectangleat{ou{(}u{,}u{)(}u{,}u{)}}{ \placeat{#3}{#4}{\ignorespaces\IfValueT{#1}{\color{#1}}% \luatexlatelua{placerectangleat(#3,-#4,#5,-#6)} } } \NewDocumentCommand\placefilledrectangleat{ou{(}u{,}u{)(}u{,}u{)}}{ \placeat{#3}{#4}{\ignorespaces\IfValueT{#1}{\color{#1}}% \luatexlatelua{placefilledrectangleat(#3,-#4,#5,-#6)} } } \ExplSyntaxOn \keys_define:nn{placeat}{ alphanumgrid.code:n = \directlua{alphanumgrid = true}, final.code:n = \luaexec{placeat_final = true} \let\ifdrawgrid\iffalse, drawgrid.code:n = \global\let\ifdrawgrid\iftrue, gridnumber.code:n = \directlua{gridnr = #1 gridnrx = gridnr~gridnry = gridnr}, gridnumberx.code:n = \directlua{gridnrx = #1}, gridnumbery.code:n = \directlua{gridnry = #1}, gridlinewidth.code:n = \directlua{gridlinewidth = #1}, nogrid.code:n = \global\let\ifdrawgrid\iffalse, numnumgrid.code:n = \directlua{alphanumgrid = false}, offsetx.code:n = \directlua{offsetx = #1}, offsety.code:n = \directlua{offsety = #1}, startzero.code:n = \directlua{offsetx = 1 offsety = 1} } \DeclareDocumentCommand\placeatsetup{m}{ \keys_set:nn{placeat}{#1} } \ExplSyntaxOff %% %% %% End of file `placeat.sty'.