Am 01.05.2014 um 20:00 schrieb Aditya Mahajan <adit...@umich.edu>: > On Thu, 1 May 2014, Mikael P. Sundqvist wrote: >> \startluacode >> userdata = userdata or {} >> function userdata.lundklippfyllbild(str, bredd, hojd) >> if tex.dimen[0] / tex.dimen[2] < tex.dimen[4] / tex.dimen[6] then >> local skalning = >> -0.5*(tex.dimen[4]/tex.dimen[0]*tex.dimen[2]-tex.dimen[6]) >> context("\\vskip%ssp", skalning) >> context.externalfigure({str},{width=bredd}) >> context.sprint("foo") >> else >> local skalning = >> -0.5*(tex.dimen[6]/tex.dimen[2]*tex.dimen[0]-tex.dimen[4]) >> context("\\hskip%ssp", skalning) >> context.externalfigure({str},{height=hojd}) >> context.sprint("bar") >> end >> end >> \stopluacode >> >> \unexpanded\def\lundklippfyllbild#1#2#3{% >> \startexternalfigurecollection[#1]% >> \useexternalfigure[#1][#1]% >> \stopexternalfigurecollection% >> \clip[ >> width=#2, >> height=#3, >> hoffset=0mm, >> voffset=0mm, >> ]{% >> \framed[width=#2,height=#3,align={middle,lohi},offset=overlay,frame=off]{% >> \dimen0=\externalfigurecollectionminwidth{#1}% >> \dimen2=\externalfigurecollectionmaxheight{#1}% >> \dimen4=#2% >> \dimen6=#3% >> {\ctxlua{userdata.lundklippfyllbild([==[#1]==],[==[#2]==],[==[#3]==])}}}}} >> >> >> >> and then run >> >> >> \lundklippfyllbild{k.jpg}{\textwidth}{\textheight} > > Here is an eTeX solution. > > \unprotect > > \newdimen\d_scaleandclip_actual_wd > \newdimen\d_scaleandclip_actual_ht > > \newdimen\d_scaleandclip_requested_wd > \newdimen\d_scaleandclip_requested_ht > > \newbox\scaleandclip_box > > \installnamespace{scaleandclip} > \installcommandhandler \????scaleandclip {scaleandclip} \????scaleandclip > > \setupscaleandclip > [width=\textwidth, > height=\textheight] > > \unexpanded\def\scaleandclip{\dodoubleempty\doscaleandclip} > > \def\doscaleandclip[#1][#2]% > {\bgroup > \ifsecondargument > \edef\currentscaleandclip{#1}% > \setupcurrentscaleandclip[#2]% > \else\iffirstargument > \doifassignmentelse{#1} > {\let\currentscaleandclip\empty > \setupcurrentscaleandclip[#1]} > {\edef\currentscaleandclip{#1}} > \else > \let\currentscaleandclip\empty > \fi\fi > \dowithnextboxcs\scaleandclip_finish\hbox} > > \def\scaleandclip_finish > {% > \d_scaleandclip_requested_wd \dimexpr\scaleandclipparameter\c!width\relax > \d_scaleandclip_requested_ht > \dimexpr\scaleandclipparameter\c!height\relax > % > \d_scaleandclip_actual_wd\wd\nextbox > \d_scaleandclip_actual_ht\dimexpr\ht\nextbox + \dp\nextbox\relax > % > \ifdim\dimexpr\d_scaleandclip_actual_wd*100/\d_scaleandclip_requested_wd > < > \dimexpr\d_scaleandclip_actual_ht*100/\d_scaleandclip_requested_ht > \relax > \setbox\scaleandclip_box\hbox > {\scale[\c!width=\d_scaleandclip_requested_wd]{\box\nextbox}}% > \scratchdimen=\the\dimexpr(\ht\scaleandclip_box - > \d_scaleandclip_requested_ht)/2\relax > \clip > [ > \c!voffset=\scratchdimen, > \c!height=\d_scaleandclip_requested_ht, > ]{\box\scaleandclip_box}% > \else > \setbox\scaleandclip_box\hbox > {\scale[\c!height=\d_scaleandclip_requested_ht]{\box\nextbox}}% > \scratchdimen=\the\dimexpr(\wd\scaleandclip_box - > \d_scaleandclip_requested_wd)/2\relax > \clip > [ > \c!hoffset=\scratchdimen, > \c!width=\d_scaleandclip_requested_wd, > ]{\box\scaleandclip_box}% > \fi > \egroup} > > \protect > > The usage is: > > \scaleandclip[width=..., height=...]{ ... any box ...} > > simimlar to the usage of \scale macro.
We should convince Hans to add this functionality to the \scale macro with “factor=clip”. Wolfgang ___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki! maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://tex.aanhet.net archive : http://foundry.supelec.fr/projects/contextrev/ wiki : http://contextgarden.net ___________________________________________________________________________________