Am 23.03.2009 um 08:15 schrieb Alan BRASLAU:
Can someone explain this? The solutions posted in lua seem more complicated than that using \dimexpr
I will add further examples to http://wiki.contextgarden.net/Expressions (or someone else can do this directly, of course) once I understand the advantages and limitations.
Here is a example document. Wolfgang \starttext \setupwhitespace[line] Our todays question is how to divide two dimension and compare their result with the result of another division, to do this we assign values two four dimensions. \startbuffer \dimen0=15pt \dimen2=20pt \dimen4=15pt \dimen6=30pt \stopbuffer \typebuffer \getbuffer Because we can use \ETEX\ functions with \CONTEXT\ let's try to use them, the following example should work: \startbuffer \ifdim\dimexpr\dimen0/\dimen2\relax<\dimexpr\dimen4/\dimen6\relax Second number is bigger. \else First number is bigger. \fi \stopbuffer \typebuffer \getbuffer This seems to be working but did it also work when the first result of the second division is bigger. \startbuffer \dimen6=15pt \ifdim\dimexpr\dimen0/\dimen2\relax<\dimexpr\dimen4/\dimen6\relax Second number is bigger. \else First number is bigger. \fi \stopbuffer \typebuffer \getbuffer This seems to be weird because we still get as result that the first number is bigger but why did this happen? Let's take a closer look at the real values of the dimensions and their results after the divison. Dimen0 has a value of \the\dimen0{} which is \number\dimen0{} in scaled points. Only the second value in scaled points is important for our calculation, we wan't to also know what the value of the second dimensions is: \number \dimen2. The last we want to know is the result of the division from the two number, this is \number\dimexpr\dimen0/\dimen2\relax. Before I want to say if this number is or good let's see what the value of the second number is before we changed the value for dimension 6 and after we changed it: \startlines Before: \dimen6=30pt \number\dimexpr\dimen4/\dimen6\relax After: \dimen6=15pt \number\dimexpr\dimen4/\dimen6\relax \stoplines The result is always 1 and not very helpful for us, you can see, if you to divide two number which are nearly equal the result in \TEX\ is not ver helpful, to compensate this we can multiply the first number in the division to get a better result. We try this first with the pure number before we include this in the \type{\ifdim} text we wanted. \startlines Result 1: \number\dimexpr\dimen0*100/\dimen2\relax Result 2: \number\dimexpr\dimen4*100/\dimen6\relax \stoplines This gives us now to higher number we can compare with reliable results. We will now try to test both this with our number above again. \startbuffer \dimen6=30pt \ifdim\dimexpr\dimen0*100/\dimen2\relax<\dimexpr \dimen4*100/\dimen6\relax Second number is bigger. \else First number is bigger. \fi \stopbuffer \typebuffer \getbuffer \startbuffer \dimen6=15pt \ifdim\dimexpr\dimen0*100/\dimen2\relax<\dimexpr \dimen4*100/\dimen6\relax Second number is bigger. \else First number is bigger. \fi \stopbuffer \typebuffer \getbuffer You can see both tests give us a correct result after we multiplied the first number in each division by 100 but should we rely on such limitations in \TEX\ when we can also use \LUATEX\ to get a correct result. The \type{tex.dimen} function allows us to access the dimen register from \TEX\ in Lua. \startbuffer \dimen6=30pt \startluacode if tex.dimen[0] / tex.dimen[2] < tex.dimen[4] / tex.dimen[6] then tex.sprint("Second number is bigger.") else tex.sprint("First number is bigger.") end \stopluacode \stopbuffer \typebuffer \getbuffer \startbuffer \dimen6=15pt \startluacode if tex.dimen[0] / tex.dimen[2] < tex.dimen[4] / tex.dimen[6] then tex.sprint("Second number is bigger.") else tex.sprint("First number is bigger.") end \stopluacode \stopbuffer \typebuffer \getbuffer The output is now correct in both values without any tricks. \stoptext