[texhax] Your texhax question

Michael Barr barr at math.mcgill.ca
Fri May 9 15:07:43 CEST 2008


I am not entirely certain what you are trying to do, but I would like to 
offer the following code from my diagram making macros:

\def\node#1(#2,#3)[#4]{%
\expandafter\gdef\csname x@#1\endcsname{#2}%
\expandafter\gdef\csname y@#1\endcsname{#3}%
\expandafter\gdef\csname ob@#1\endcsname{#4}%
\ignorespaces}%

What this code does is to take something like
\node a(30,40)[A]
and define three macros whose definitions are equivalent to
\gdef\x at a{30}
\gdef\y at a{40}
\gdef\ob at a{A}

There are several things to note.  First, \newcommand will not work.  Of 
course, if I used it as
\node {a}{30}{40}{A}
it would, but I don't much like all those braces (and most parts of the 
diagram macros cannot be coded using \newcommand either.  I use \gdef 
because this appears inside another macro; I don't think there is a 
\newcommand equivalent.  Finally, the node names don't have to be letters 
only.  I could (and regularly do) use things like
\node 3c(30,40)[A]
since the form
\expandafter \csname ??? \endcsname {definition}
allows any string of characters as a control sequence name.  Of course, 
when calling these macros, the same thing has to be done.  These macros 
are used in the following form:
\morphism(\csname x@#3\endcsname,\csname y@#3\endcsname)|#1|/{#2}/%
<\xfinish,\yfinish>[\csname ob@#3\endcsname`\csname ob@#4\endcsname;#5]%
}%
An earlier implementation of this used two counters for each node.  This 
one uses just two counters, since the numerical values are stored as 
macros, not counters and just  two temporary counters are used for a whole 
diagram.  This is important since tex puts a severe restriction on the 
number of counters (256, of which several dozen are used by latex alone) 
while the number of macros is effectively unlimited (my tex implementation 
reports that there are 10000 + 50000, which I don't understand, but 5000 
is what I typically use).

I hope this helps.

Michael Barr


More information about the texhax mailing list