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.
- 218,180
- 3,083
1 Answers
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.
- 1,121,712
-
1+1 Could you also add an calculation example like the one in my comment above? – Martin Scharrer May 15 '12 at 17:54
-
-
No, I didn't actually tried it. It's funny. Apparently the macro definition is already changed (
\relax'ed?) before the right-hand side is evaluated, which is very unusual. Anyway,\mathchardef\temp=\numexpr \myconstant + 1 \relax \mathchardef\myconstant=\tempworks fine. – Martin Scharrer May 15 '12 at 18:12 -
\chardefand\mathchardefwhich 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\mathchardef\myconstant=<integer>. With e-TeX you can use e.g.\mathchardef\myotherconstant=\numexpr \myconstant + 1 \relaxto add one to this "constant", etc., but\myconstant=1doesn'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\mathchardef\myotherconstant=\numexpr\the\myconstant+1\relax. Also,\the\myconstanttypesets the value of\myconstant, as if it were a counter. – digital-Ink May 15 '12 at 18:28