From: Taco Hoekwater <bittext@quicknet.nl>
Subject: Re: ROT13 and alike
Date: Sat, 17 Feb 2001 19:30:23 +0100 [thread overview]
Message-ID: <3A8EC33F.3DB883D3@quicknet.nl> (raw)
In-Reply-To: <001101c09844$ebd9ee20$a3ccfea9@nuovo>
Giuseppe Bilotta wrote:
>
>
> Any suggestions?
Here is a solution that is just a little bit more robust than
your one: it obeys spaces and is properly nested. It also allows
primitives in the input string (\par, for example); and \unexpanded
macros that dont have an argument.
Note that this is a hacker's version: you can't use this to process
arbitrary text: macro's that expand into something and e.g. accents
won't work!
In general, it is very hard to do this kind of stuff safely in TeX.
A verbatim module would probably be the best solution. OTOH, my
approach allows:
\section{\ROT{A section}}
% begin of code
%
% this is the converter itself. If it has to do much more than
% this, it might be better to use an \ifcase instead, but that
% complicates the code rather a lot
\def\dorot#1{%
\ifx a#1n\else \ifx b#1o\else \ifx c#1p\else \ifx d#1q\else
\ifx e#1r\else \ifx f#1s\else \ifx g#1t\else \ifx h#1u\else
\ifx i#1v\else \ifx j#1w\else \ifx k#1x\else \ifx l#1y\else
\ifx m#1z\else \ifx n#1a\else \ifx o#1b\else \ifx p#1c\else
\ifx q#1d\else \ifx r#1e\else \ifx s#1f\else \ifx t#1g\else
\ifx u#1h\else \ifx v#1i\else \ifx w#1j\else \ifx x#1k\else
\ifx y#1l\else \ifx z#1m\else
#1%
\fi \fi \fi \fi
\fi \fi \fi \fi
\fi \fi \fi \fi
\fi \fi \fi \fi
\fi \fi \fi \fi
\fi \fi \fi \fi
\fi \fi
}
% The startcommand. \afterassigment executes the next assignment
% first, (in this case a \let assignment), then afterward
% it expands the command between itself and the assignment.
% at that time, the assigment has already been done, so inside
% \dostartROT, \nexttok is the next token from the input.
%
% The trick with the space at the end is the way to make sure
% that spaces are seen as well: only *one* optional space
% is allowed after an equals sign. If there appears another
% space (that is: a space in the input), it will be assigned
% instead.
\def\startROT{%
% here is the place to do other stuff, like
% \bf or whatever. The next line has to stay
% at the end of the definition.
\afterassignment \dostartROT \let\nexttok= }
\def\stopROT{}
% \afterfi is a trick to prevent stack buildup if the text string
% is very long (as it might be)
\def\afterfi#1\fi{\fi#1}
% if the next token is \stopROT, execute it.
% otherwise, start over:
\def\dostartROT{%
\ifx \nexttok \stopROT
\stopROT
\else
\dorot{\nexttok}\afterfi\startROT
\fi }
% parameter version:
\def\ROT#1{\startROT#1\stopROT}
% end of code
Greetings, Taco
next prev parent reply other threads:[~2001-02-17 18:30 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-02-16 18:15 Giuseppe Bilotta
2001-02-17 18:30 ` Taco Hoekwater [this message]
2001-02-18 12:50 ` Giuseppe Bilotta
2001-02-19 11:19 ` Hans Hagen
2001-02-19 10:20 ` Hans Hagen
2001-02-19 22:45 ` Giuseppe Bilotta
2001-02-20 11:29 ` Hans Hagen
2001-02-20 15:58 ` Giuseppe Bilotta
2001-03-12 20:37 ` Hans Hagen
2001-03-14 0:26 ` Re[2]: " Giuseppe Bilotta
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3A8EC33F.3DB883D3@quicknet.nl \
--to=bittext@quicknet.nl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).