% % switcheml.sty % % Charles Duan (2004/02/10) % % Obfuscates an e-mail address so that it is unreadable by automated document % crawlers but appears correct when displayed. % % Commands provided by this package are: % % \switchemail{EMAIL} % Obfuscates EMAIL by reversing on the @ and . symbols, so % some@one.place.com % will be written to the document as: % com place. one. some@ % but it will appear properly on the document page. % % \switch{DELIM}{TEXT} % Obfuscates TEXT by reversing values around DELIM, so % \switch{,}{abc,def,ghi,jkl} % will be written to the document as: % jkl ghi, def, abc % but it will appear on the document page as: % abc,def,ghi,jkl % % \kernhack{A}{B} % Produces a kern equivalent to the kern that would normally appear between A % and B. % \ProvidesPackage{switcheml}[2004/02/10 Obfuscate e-mail addresses] % Produce a kern equivalent to the kern between #1 and #2 \def\kernhack#1#2{% \begingroup \setbox\z@\hbox{#1#2}% \dimen@\wd\z@ \setbox\z@\hbox{#1{}#2}\advance\dimen@-\wd\z@ \ifdim\dimen@=\z@\else\kern\dimen@\fi \endgroup } % Given a character to find (e.g., period) and a string of text, obfuscate the % text so that the last part of the text is placed first, etc., so everything % comes up in reverse order when you try to copy/paste but it looks fine on % screen. For instance, % % some.domain.com % % is rewritten as: % % box{com} box{domain.} box{some.} % % with each of the boxes placed such that they print out properly. % \def\switch#1#2{% \begingroup \def\@switch##1#1##2\@nil#1##3\@stop{% \def\reserved@a{##3}% \ifx\reserved@a\@empty#2\else \setbox\z@\hbox{##1#1}% \setbox\tw@\hbox{\kernhack{#1}{##2}\switch{#1}{##2}}% \dimen@\wd\tw@\advance\dimen@\wd\z@% \wd\z@\dimen@% \rlap{\hb@xt@\dimen@{\hfil\unhbox\tw@}}% \box\z@ \fi }% \@switch#2\@nil#1\@nil#1\@stop \endgroup } % Given an e-mail address of the form abc@def.ghi.jkl, reverses it to be jkl % ghi. def. abc@ \def\switchemail#1{% \expandafter\@switchemail#1\@stop } % Helper function for \switchemail. Note the \copy, because \kernhack will % destroy the box otherwise. Need to do some funky stuff because of catcodes. \begingroup \makeatother \def\tmp#1#2#3{% \gdef#1##1@##2#2{% \begingroup \setbox#3\hbox{\switch{.}{##2}}% \switch{@}{##1@\copy#3}% \endgroup }% } \makeatletter \tmp\@switchemail\@stop\@tempboxa \endgroup \endinput