7

I need to store and use a large amount of integers (a little bit of "programming with TeX"), but I know that TeX has a limited (up to 256) number of counters that can be used simultaneously. How to work with these numbers using macros? I need basic numerical operations and comparison.

Alan Munn
  • 218,180
digital-Ink
  • 3,083
  • 2
    Related (duplicate?) question: Using counters or macros. – Alan Munn May 15 '12 at 17:33
  • 1
    I agree with @AlanMunn that this seems to be a duplicate. Note that you can (re-)define "constants" using \chardef and \mathchardef which act basically like counters without needing a register. You can't add to them like with counter, however. – Martin Scharrer May 15 '12 at 17:41
  • 1
    @AlanMunn: I read the topic you mentioned, but I still did not get an answer to my question, that is, how to use integers stored in macros as if they were numbers stored in counters. – digital-Ink May 15 '12 at 17:42
  • 1
    Could you explain in more detail what exactly you need? You can define integer "constants" with \mathchardef\myconstant=<integer>. With e-TeX you can use e.g. \mathchardef\myotherconstant=\numexpr \myconstant + 1 \relax to add one to this "constant", etc., but \myconstant=1 doesn't work. A benefit is that it is a terminated number and TeX will not expand further tokens to look for more potential digits like it does with macros. – Martin Scharrer May 15 '12 at 17:49
  • @MartinScharrer: Ok, I will try to use \mathchardef. Maybe I was not carefull enough when reading the ralated post, this may be consider as a duplicate. – digital-Ink May 15 '12 at 17:54
  • @MartinScharrer: I see that, without e-Tex, I can add using \mathchardef\myotherconstant=\numexpr\the\myconstant+1\relax. Also, \the\myconstant typesets the value of \myconstant, as if it were a counter. – digital-Ink May 15 '12 at 18:28

1 Answers1

10

There is no real limitation nowadays if you use pdftex (or pdflatex), because the engine has 32768 count registers. The only problem is to persuade the allocation macros to use the whole set. In LaTeX this is obtained by loading (as early as possible, that is, immediately after \documentclass) the etex package.

If you use constants less than "8000 = 32768, they can be conveniently stored with \mathchardef:

\mathchardef\myconst=12000

allows you to use \myconst in every place where TeX is expecting a <number> (as part of its syntax rules).

Note. A trick such as

\mathchardef\myconstant=\numexpr \myconstant + 1 \relax

doesn't work. This is because of a security precaution taken by TeX during assignments. When one says

\mathchardef\myconstant=...

the token \myconstant is temporarily set to \relax, so it can't be used in the following \numexpr. In that case one has to use a temporary storage bin:

\mathchardef\myconstant=42
...
\mathchardef\mytempconstant=\myconstant
\mathchardef\myconstant=\numexpr\mytempconstant+1\relax

However, such computations are rather inefficient.

egreg
  • 1,121,712