Changes

Jump to navigation Jump to search
3,883 bytes added ,  16:15, 25 April 2013
Reorganise Jannis's information to give prominence to \newdimen
ConTeXt offers A dimension, in TeX, is a variable storing a length. The length is enteredas a number immediately followed by two letters that indicate the unit, e.g.{{code|12pt}} or {{code|1cm}}. TeX recognizes 9 different methods to initialize variables and to calculate with dimension units. :
== \definemeasure == \setupexternalfigures[location={local* 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,globalthis was an advantage,default}]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. \definemeasure[ColumnC][30mm]* didot ('''dd''') and cicero ('''cc'''). The didot is a continental counterpart of the point; 12 didot = 1 cicero. \definemeasure[ColumnD][40mm]* big points ('''bp'''), defined by Adobe as 1/72 of an inch. \definemeasure[ColumnCD][\the\dimexpr* millimeters ('''mm'''), centimeters ('''cm'''), and, unavoidably, inches (\measure{ColumnC}+\measure{ColumnD}'''in''')\relax] C \measure{ColumnC} D \measure{ColumnD} CD \measure{ColumnCD} \externalfigure[cow][width=\measure{ColumnCD}].
The various conversions between the units are laid out in the [[#Conversion table|conversion table]] at the end of this article.
== \defineexpandable Defining and accessing dimensions == \setupexternalfigures[location={local,global,default}] \defineexpandable\ColumnA {30mm} \defineexpandable\ColumnB {40mm} \defineexpandable\ColumnAB {\the\dimexpr(\ColumnA + \ColumnB)\relax} A \ColumnA B \ColumnB AB: \ColumnAB \externalfigure[cow][width=\ColumnAB]
{{tex|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|storing dimensions as strings]].
* {{tex|newdimen}} is by far the more common idiom
* Values stored in a dimension register with {{cmd|newdimen}} can be accessed directly from Lua, which is not true for values stored in a macro with {{tex|def}} or {{cmd|definemeasure}}.
The behavior of \define has changed. At first the default was expanded, now it is unexpanded. If "unexpanded" is wished some extracommands are neccesaryfollowing example shows how to set and access dimensions:
<context mode="mkiv" source="yes">\defineexpandablenewdimen\...columnA % initialise variable same as the lowlevel-TeX-Macro \def\...columnA=10mm % set variable
Column A is \definethe\columnA{} wide... % lengths are automatically same as the low-level-textmacro \unexpanded\def\.. % displayed in pt.
== Column A is \def ==number\columnA sp wide. % internally, lengths are stored % as an integer number of sp
== \newdimen == \setupexternalfigures[location={local,global,default}] \defineexpandable\ColumnA {30mm} \defineexpandable\ColumnB {40mm} \newdimen\ColumnAB \ColumnAB=\dimexpr(\ColumnA + \ColumnB) A \ColumnA B \ColumnB ColumnAB: \the\ColumnAB \externalfigure[cow]blackrule[width=\the\ColumnABcolumnA]\externalfigure ist also working without "\the".</context>
== Converting dimensions ==
== Important Usually, you will want to understand ==express a dimension in something other than points or{{todo|This scaled points have . For this, Lua is the way to be explained.}}go:
===Which method? ===* If you want to print, the functions {{code|number.tocentimeters}}, {{todocode|When to use which of the above methods?topoints}}, {{code|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 {{todocode|\the: what is it? When to use?number.dimenfactors}}. For example, {{code|65536 * number.dimenfactors["pt"]}} returns {{code|1}}.
<context source=yes mode=mkiv>\newdimen\columnA % initialise variable\columnA= Expanding ==={{todo|expanding of variables: What does this mean? When to use?}}10mm % set variable
=== \relax startluacode local A ===With \relax the termination of a calculation is garantiedtex. If there is one too much ... no problem, then it is ignoreddimen.columnA -- access a dimen value
-- internal unit: scaled points (integer) context("add a \relax after code definitions to prevent the scanner from reading too muchColumn A is %d scaled points", A) context.par()
\ -- default conversion: 15 digits, unit at the\dimexprend, no space context("Column A is %s", number.tocentimeters(A)) context.. will look ahead till there's something nonexpandable, and contrary to what one expectspar()
\dimexpr -- 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
</context>
will not stop at the ) so, although == Calculating with measures it normally goes okay, personally I always use \relax as terminator; the \relax will be eaten up so there is no interference but it guarantees to stop scanning.dimensions ==
;Example: \definemeasure[ColumnC][30mm] \definemeasure[ColumnD][40mm] \definemeasure[ColumnCDi][\the\From TeX, you can compute with dimensions by writing your calculation between {{tex|dimexpr(\measure}}{{ColumnCcode|...}}+\measure{ColumnD{tex|relax})\relax]}. Such an expression may only occur where a length is expected. Spaces are allowed, but never required.
<context mode=mkiv source=yes>
\newdimen\columnA
\columnA=1cm
;Further examples: \footnote{\input tufte 0.5 cm equals \relax} \par \definepapersize[bigsheet][width=the\dimexpr\paperwidth+6mm\relax,height=\dimexpr\paperheight+6mm\relax] \setupTABLE[c][3][width={\dimexpr(\textwidth-2cm)* 2 / 3\relax}] \definemeasure[topspace] [\dimexpr(210mm-31mm*5)columnA /2\relax].
\blackrule[width=\dimexpr 2 \columnA\relax]</context> 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, {{code|tex.dimen.somevalue}}. Not that half a scaled point is much to worry about. <context mode= Other ways to calculate (without dimension units) mkiv source=yes>\newdimen\columnA\columnA=1cm \startluacode local A =tex.dimen.columnA double_A =2 * A context.blackrule({width = double_A .. "sp"})\ctxlua stopluacode</context> ==Storing dimensions as strings == Because TeX expands macros, we can store a dimension string like {{code|10pt}}in a macro, and insert that in any place TeX expects a dimension. You can use a plain {{tex|def}}; or you can define dimensions with {{cmd|definemeasure|[...]}} and retrieve them with {{cmd|measure|{...}|}}. <context mode=mkiv source=yes>\definemeasure[One][10mm]\defineexpandabledef\ValueA Two{2020mm} \definemeasure[Three][\defineexpandabledimexpr \ValueB measure{30One}+ \Two\relax] \blackrule[width=\measure{One}] \defineexpandablecrlf\blackrule[width=\Two] \crlf\blackrule[width=\ValueC measure{Three}]\ctxluacrlf</context> == Conversion table == Bold numbers indicate conversions that are set by definition. {| class="wikitable"|-! unit !! TeX name! in sp !! in pt !! in pc !! in dd !! in cc! in bp !! in in !! in cm !! in mm|-| scaled point || {{code|sp}}| 1 || '''1/65536''' || || ||| || || || |-| point || {{code|pt}}| '''65536''' || 1 || '''1/12''' || 0.9346 || 0.0779| 0.9963 || '''1/72.27''' || 0.3516 || 0.0351|-| pica || {{code|pc}}| 786432 || '''12''' || 1 || 11.2149 || 0.9346| 11.9552 || 0.1660 || 4.2175 || 0.4218|-| didot || {context(\ValueA + \ValueB){code|dd}}| 70124.081 || 1.0700 || 0.0892 || 1 || '''1/12'''| 1.0660 || 0.0148 || 0.3761 || 0.0376|-| cicero || {{code|cc}}| 841488.98 || 12.8401 || 1.0700 || '''12''' || 1| 12.7921 || 0.1777 || 4.5128 || 0.45128|-| big point || {{code|bp}}| 65781.76 || 1.0038 || 0.0836 || 0.9381 || 0.0782| 1 || '''1/72''' || 0.3528 || 0.0353|-| inch || {{code|in}}| 4736286.7 || '''72.27''' || 6.0225 || 67.5415 || 5.6284| '''72''' || 1 || 25.4 || 2.54|-| millimeter || {{code|mm}}| 186467.98 || 2.8453 || 0.2371 || 2.6591 || 0.2216| 2.8346 || 0.0394 || 1 || 0.1|-| centimeter || {{code|cm}}\ValueC| 1864679.8 || 28.4528 || 2.3711 || 26.5911 || 2.2159| 28.3464 || 0.39370 || 10 || 1|-|}
== See also ==
* [[Command/define]]{{cmd|definemeasure}}* {{cmd|measure}}
[[Category:ConTeXt-Issues]]
[[Category:Programming]]
[[Category:ToDo]]

Navigation menu