Difference between revisions of "Dimensions"
Line 173:  Line 173:  
[[Category:Programming]]  [[Category:Programming]]  
−  [[Category:Dimensions]]  +  [[Category:Dimensions!]] 
Revision as of 20:03, 28 April 2013
A dimension, in TeX, is a variable storing a length. The length is entered
as a number immediately followed by two letters that indicate the unit, e.g.
12pt
or 1cm
. TeX recognizes 9 different units:
 scaled points (sp), equal to 1/65536 points. This is TeX's internal unit for dimensions. One sp is so small that TeX can store dimensions as integers; at the time, this was an advantage, because floating point arithmetic was not guaranteed to be consistent across platforms.
 points (pt) and picas (pc). One point is 1/72.27 inch; 12 points = 1 pica.
 didot (dd) and cicero (cc). The didot is a continental counterpart of the point; 12 didot = 1 cicero.
 big points (bp), defined by Adobe as 1/72 of an inch.
 millimeters (mm), centimeters (cm), and, unavoidably, inches (in).
The various conversions between the units are laid out in the conversion table at the end of this article.
Contents
Defining and accessing dimensions
\newdimen is the native TeX method to initialise a dimension variable. The requirement to explicitly initialize your dimension variables is a bit clunky, but this method should still be preferred over storing dimensions as strings.
 \newdimen is by far the more common idiom
 Values stored in a dimension register with \newdimen can be accessed directly from Lua, which is not true for values stored in a macro with \def or \definemeasure.
The following example shows how to set and access dimensions:
\newdimen\columnA % initialise variable \columnA=10mm % set variable Column A is \the\columnA{} wide. % lengths are automatically % displayed in pt. Column A is \number\columnA sp wide. % internally, lengths are stored % as an integer number of sp \blackrule[width=\columnA]
Converting dimensions
Usually, you will want to express a dimension in something other than points or scaled points. For this, Lua is the way to go:
 If you want to print, the functions
number.tocentimeters
,topoints
,topicas
, etc. are already provided. These functions return a number as a string with (by default) the unit abbreviation appended.
 If you want to calculate, the conversion factors from standard points are stored in
number.dimenfactors
. For example,65536 * number.dimenfactors["pt"]
returns1
.
\newdimen\columnA % initialise variable \columnA=10mm % set variable \startluacode local A = tex.dimen.columnA  access a dimen value  internal unit: scaled points (integer) context("Column A is %d scaled points", A) context.par()  default conversion: 15 digits, unit at the end, no space context("Column A is %s", number.tocentimeters(A)) context.par()  expressing a dimen in cm, rounded to 0.01, no automatic unit context("Column A is %s cm", number.tocentimeters(A, "%.2f")) context.par()  converting from mm to cm local inmm = 10 local incm = inmm / number.dimenfactors["mm"] * number.dimenfactors["cm"] context("Column A is %.1f cm", incm) \stopluacode
Calculating with dimensions
From TeX, you can compute with dimensions by writing your calculation between \dimexpr...
\relax. Such an expression may only occur where a length is expected. Spaces are allowed, but never required.
\newdimen\columnA \columnA=1cm 0.5 cm equals \the\dimexpr \columnA / 2 \relax. \blackrule[width=\dimexpr 2 \columnA\relax]
In Lua, dimensions are a number of scaled points, and you can do all the usual things. TeX uses integers for dimens, but Lua treats them as floats; the number will only be coerced to integer when you retrieve from, or assign to, tex.dimen.somevalue
. Not that half a scaled point is much to worry about.
\newdimen\columnA \columnA=1cm \startluacode local A = tex.dimen.columnA double_A = 2 * A context.blackrule({width = double_A .. "sp"}) \stopluacode
 More examples
\newdimen\AAA \AAA=100pt \newdimen\BBB \BBB=\AAA AAA is \the\AAA BBB is \the\BBB
Storing dimensions as strings
Because TeX expands macros, we can store a dimension string like 10pt
in a macro, and insert that in any place TeX expects a dimension. You can use a plain \def; or you can define dimensions with \definemeasure[...] and retrieve them with \measure{...}.
\definemeasure[One][10mm] \def\Two{20mm} \definemeasure[Three][\dimexpr \measure{One} + \Two\relax] \blackrule[width=\measure{One}] \crlf \blackrule[width=\Two] \crlf \blackrule[width=\measure{Three}]\crlf
Conversion table
Bold numbers indicate conversions that are set by definition.
unit  TeX name  in sp  in pt  in pc  in dd  in cc  in bp  in in  in cm  in mm 

scaled point  sp

1  1/65536  
point  pt

65536  1  1/12  0.9346  0.0779  0.9963  1/72.27  0.3516  0.0351 
pica  pc

786432  12  1  11.2149  0.9346  11.9552  0.1660  4.2175  0.4218 
didot  dd

70124.081  1.0700  0.0892  1  1/12  1.0660  0.0148  0.3761  0.0376 
cicero  cc

841488.98  12.8401  1.0700  12  1  12.7921  0.1777  4.5128  0.45128 
big point  bp

65781.76  1.0038  0.0836  0.9381  0.0782  1  1/72  0.3528  0.0353 
inch  in

4736286.7  72.27  6.0225  67.5415  5.6284  72  1  25.4  2.54 
millimeter  mm

186467.98  2.8453  0.2371  2.6591  0.2216  2.8346  0.0394  1  0.1 
centimeter  cm

1864679.8  28.4528  2.3711  26.5911  2.2159  28.3464  0.39370  10  1 