ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
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


  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).