%D \module %D [ file=m-simulate, %D version=2016.02.18, % follow up on m-visual of 2000.01.10 %D title=\CONTEXT\ Extra Modules, %D subtitle=Visualization and Faking Redone, %D author={Hans Hagen \& Ton Otten}, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. \unprotect \definepalet [fakerule] [fr1c=darkred, fr2c=darkgreen, fr3c=darkblue, fr4c=darkyellow, fr5c=darkgray, fr6c=darkred, fr7c=darkgreen, fr8c=darkblue, fr9c=darkyellow, fr0c=darkgray] \installcorenamespace {simulatewords} \installcommandhandler \??simulatewords {simulatewords} \??simulatewords \setupsimulatewords [\c!n =\plusten, \c!m =40, \c!min =\plusone, \c!max =\plusfive, \c!minwidth=0.50\emwidth, \c!maxwidth=1.25\emwidth, \c!color =\empty, \c!hyphen =\v!yes, \c!distance=-.2\onebasepoint] \protected\def\dosimulatedword {\clf_fakeword factor \exheight name {\p_line} min \scratchdimenone max \scratchdimentwo \relax} \def\simulatedhyphen {\kern.2\points-\kern.2\points} %tolerant\protected\def\simulatewords[#1]#*[#2]% \tolerant\protected\def\simulatewords[#1]#,[#2]% keep space {\begingroup \ifparameter#2\or \edef\currentsimulatewords{#1}% \setupcurrentsimulatewords[#2]% \orelse\ifhastok={#1}% \lettonothing\currentsimulatewords \setupcurrentsimulatewords[#1]% \else \lettonothing\currentsimulatewords \fi \dontleavehmode \begstrut \scratchcounterone\simulatewordsparameter\c!n \scratchcountertwo\simulatewordsparameter\c!m \scratchmin \simulatewordsparameter\c!min \scratchmax \simulatewordsparameter\c!max \scratchdimenone \simulatewordsparameter\c!minwidth \scratchdimentwo \simulatewordsparameter\c!maxwidth \scratchdimenthree\simulatewordsparameter\c!distance \edef\p_random{\simulatewordsparameter\c!random}% \edef\p_color {\simulatewordsparameter\c!color}% \edef\p_line {\simulatewordsparameter\c!line}% \edef\p_hyphen{\simulatewordsparameter\c!hyphen}% \edef\p_line {fake:\ifx\p_line\v!yes word\else rule\fi}% \ifx\p_color\v!text % no need \else \setuppalet[fakerule]% \ifempty\p_color \directcolored[fakerulecolor]% \orelse\ifx\p_color\v!auto % different \else \directcolored[\p_color]% \fi \fi \edef\p_hyphen {\ifx\p_hyphen\v!yes \discretionary{\bf\simulatedhyphen}{}{\kern\scratchdimenthree}% \orelse\ifx\p_hyphen\v!margin \discretionary{\hpack to \zeropoint{\bf\simulatedhyphen\hss}}{}{\kern\scratchdimenthree}% \orelse\ifx\p_hyphen\v!none \allowbreak\kern\scratchdimenthree \orelse\ifx\p_hyphen\v!no \allowbreak\kern\scratchdimenthree \orelse\ifx\p_hyphen\v!both \discretionary{\bf\simulatedhyphen}{\bf\simulatedhyphen}{\kern\scratchdimenthree}% \orelse\ifempty\p_hyphen \allowbreak\kern\scratchdimenthree \else \discretionary{\p_hyphen}{}{\kern\scratchdimenthree}% \fi}% \def\truncated##1##2\relax{##1}% % trialtypesetting: tricky \ifempty\p_random\else \pushrandomseed \setrandomseed\p_random \fi \localcontrolledloop \plusone \randomnumber\scratchcounterone\scratchcountertwo \plusone {% \let\dosimulatedhyphen\relax \localcontrolledloop \plusone \randomnumber\scratchmin\scratchmax \plusone {% \dosimulatedhyphen \begingroup \ifx\p_color\v!auto \directcolored[fr\expandafter\truncated\the\currentloopiterator\relax c]% \fi \dosimulatedword \endgroup \let\dosimulatedhyphen\p_hyphen }% \relax \space }% \ifempty\p_random\else \poprandomseed \fi \removeunwantedspaces \endstrut \endgroup} %D For old times sake: \protected\def\fakewords#1#2% {\simulatewords [\c!n=#1,% \c!m=#2,% \c!min=\plusone,% \c!max=\plusfive,% \c!hyphen=\v!none,% \c!color=\v!text,% \c!line=\v!yes]} %D Lines \tolerant\protected\def\fakeline[#1]% {\par \dontleavehmode \hpack\bgroup \scratchwidth \availablehsize \scratchheight.8\strutht \scratchdepth .8\strutdp \ifparameter#1\or \letsimulatewordsparameter\c!width \scratchwidth % no need for _reference here \letsimulatewordsparameter\c!height\scratchheight % idem \letsimulatewordsparameter\c!depth \scratchdepth % idem \setupcurrentsimulatewords[#1]% \scratchwidth \simulatewordsparameter\c!width \scratchheight\simulatewordsparameter\c!height \scratchdepth \simulatewordsparameter\c!depth \fi \edef\p_color{\simulatewordsparameter\c!color}% \begingroup \ifempty\p_color \directcolored[fakerulecolor]% \orelse\ifx\p_color\v!auto % text color \else \directcolored[\p_color]% \fi \vrule \s!width \scratchwidth \s!height\scratchheight \s!depth \scratchdepth \endgroup \hskip-\scratchwidth \directcolored[\s!white]% \scratchdimen.5\onepoint \vrule \s!width \scratchwidth \s!height\scratchdimen \s!depth \scratchdimen \egroup \par} \definesimulatewords[math][\c!n=1,\c!m=3] \tolerant\protected\def\fakemath[#1]#*[#2]% {\begingroup \ifmmode \let\simulate_end_math\relax \else \startimath \let\simulate_end_math\stopimath \fi \scratchdistance\glyphyscaled\Umathaxis\mathstyle \scratchheight2.5\scratchdistance \scratchdepth 0.5\scratchdistance \getrandomdimen\scratchwidth{\simulatewordsparameter\c!minwidth}{\simulatewordsparameter\c!maxwidth}% \ifparameter#2\or \cdef\currentsimulatewords{#1}% \letsimulatewordsparameter\c!width \scratchwidth % no need for _reference here \letsimulatewordsparameter\c!height\scratchheight % idem \letsimulatewordsparameter\c!depth \scratchdepth % idem \setupcurrentsimulatewords[#2]% \orelse\ifhastok={#1}% \cdef\currentsimulatewords{math}% \letsimulatewordsparameter\c!width \scratchwidth % no need for _reference here \letsimulatewordsparameter\c!height\scratchheight % idem \letsimulatewordsparameter\c!depth \scratchdepth % idem \setupcurrentsimulatewords[#1]% \else \cdef\currentsimulatewords{math}% \letsimulatewordsparameter\c!width \scratchwidth % no need for _reference here \letsimulatewordsparameter\c!height\scratchheight % idem \letsimulatewordsparameter\c!depth \scratchdepth % idem \fi \scratchwidth \simulatewordsparameter\c!width \scratchheight\simulatewordsparameter\c!height \scratchdepth \simulatewordsparameter\c!depth \edef\p_color{\simulatewordsparameter\c!color}% \edef\p_random{\simulatewordsparameter\c!random}% \ifempty\p_random\else \pushrandomseed \setrandomseed\p_random \fi \mathord{% \begingroup \kern.1\emwidth \ifempty\p_color \directcolored[fakerulecolor]% \orelse\ifx\p_color\v!auto % text color \else \directcolored[\p_color]% \fi \vrule \s!width \scratchwidth \s!height\scratchheight \s!depth \scratchdepth \endgroup \hskip-\scratchwidth \directcolored[\s!white]% \scratchdimen.5\onepoint \vrule \s!width \scratchwidth \s!height \scratchdimen \s!depth \scratchdimen \s!yoffset\scratchdistance % \hskip-\scratchwidth % \divideby\scratchdimen\plustwo % \vrule % \s!width \scratchwidth % \s!height \scratchdimen % \s!depth \scratchdimen \kern.1\emwidth }% \ifempty\p_random\else \poprandomseed \fi \simulate_end_math \endgroup} \tolerant\protected\def\fakeinlinemath[#1]#*[#2]% {\begingroup \ifmmode \let\simulate_end_math\relax \else \startimath \let\simulate_end_math\stopimath \fi \ifparameter#2\or \edef\currentsimulatewords{#1}% \setupcurrentsimulatewords[#2]% \orelse\ifhastok={#1}% \cdef\currentsimulatewords{math}% \setupcurrentsimulatewords[#1]% \orelse\ifchknum#1\or \cdef\currentsimulatewords{math}% \setsimulatewordsparameter\c!n{#1}% \setsimulatewordsparameter\c!m{#1}% \else \cdef\currentsimulatewords{math}% \fi \scratchcounterone\simulatewordsparameter\c!n \scratchcountertwo\simulatewordsparameter\c!m \scratchcounterthree \ifnum\scratchcounterone=\scratchcountertwo \scratchcounterone \else \randomnumber\scratchcounterone\scratchcountertwo\relax \fi \localcontrolledloop \plusone \scratchcounterthree \plusone {% \fakemath[\currentsimulatewords][\c!random=]\relax \ifnum\currentloopiterator<\scratchcounterthree +% \fi }% \simulate_end_math \endgroup} \tolerant\protected\def\fakedisplaymath[#1]#*[#2]% {\begingroup \ifmmode \let\simulate_end_math\relax \else \startimath \let\simulate_end_math\stopimath \fi \begingroup \forcedisplaymath \ifparameter#2\or \edef\currentsimulatewords{#1}% \setupcurrentsimulatewords[#2]% \orelse\ifhastok={#1}% \cdef\currentsimulatewords{math}% \setupcurrentsimulatewords[#1]% \else \cdef\currentsimulatewords{math}% \fi \scratchcounterone\simulatewordsparameter\c!n \scratchcountertwo\simulatewordsparameter\c!m \scratchcounterthree\randomnumber\scratchcounterone\scratchcountertwo\relax \localcontrolledloop \plusone \scratchcounterthree \plusone {% \fakemath[\currentsimulatewords][\c!random=]\relax \ifnum\currentloopiterator<\scratchcounterthree +% \fi }% \endgroup \simulate_end_math \endgroup} \protect \continueifinputfile{m-simulate.mkxl} \starttext \showframe \dorecurse{5}{\fakemath[color=red]\ and } \fakemath \dorecurse{5}{\fakeinlinemath[color=red]\ and } \fakeinlinemath \im { \fakemath[m=1]^{\fakemath} } \def\Snip{\fakeinlinemath} \im { \Snip[1]^{\Snip[1]} + \Snip[2] = \Snip[2] + \int \Snip[2]} \im { \Snip[1]^{\Snip} + \Snip = \Snip + \int \Snip} \im { \Snip[3]^{\Snip[5]} + \Snip = \Snip + \int \Snip} \page \simulatewords[n=50,m=100,min=1,max=5,color=auto,hyphen=margin,line=yes]\par \simulatewords[n=50,m=100,min=3,max=9,color=auto,hyphen=margin,line=yes]\par \simulatewords[n=50,m=100,min=3,max=9,color=auto,hyphen=margin,line=yes]\par \page \simulatewords[n=50,m=100,min=2,max=6,hyphen=yes]\par \simulatewords[n=50,m=100,min=2,max=6,hyphen=both]\par \simulatewords[n=50,m=100,min=2,max=6,hyphen=both]\par \startcolor[red] \simulatewords[n=50,m=100,min=2,max=6,color=text]\par \stopcolor \definesimulatewords[foo][n=50,m=100,min=2,max=6,color=text] \startcolor[green] \simulatewords[foo][color=darkyellow,random=1234] \stopcolor \page \fakeline \startnarrower \fakeline \stopnarrower \stoptext