Changes

Jump to navigation Jump to search
5,392 bytes added ,  15:05, 6 February 2021
m
expamples from the list
ConTeXt offers different methods to initialize variables and to calculate with dimension units{{note|This article is about the data type. For the names of a page's many dimensions, see [[Layout]].}}
=== \definemeasure === \setupexternalfigures[location={localA dimension,globalin TeX,default}]is a variable storing a length. The length is entered \definemeasure[ColumnC][30mm]as a number immediately followed by two letters that indicate the unit, e.g. \definemeasure[ColumnD][40mm] \definemeasure[ColumnCD][\the\dimexpr(\measure{ColumnC}+\measure{ColumnDcode|12pt})\relax] C \measure{ColumnC} D \measureor {ColumnD} CD \measure{ColumnCDcode|1cm} \externalfigure[cow][width=\measure{ColumnCD}]. 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 inches ('''in''').
=== \defineexpandable === \setupexternalfiguresThe various conversions between the units are laid out in the [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#Conversion table|conversion table][width=\ColumnAB]at the end of this article.
== Defining and accessing dimensions ==
{{tex|newdimen}} is the native TeX method to initialise a dimension variable. The behavior of \define has changedrequirement 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]]. At first * {{tex|newdimen}} is by far the default was expandedmore common idiom* Values stored in a dimension register with {{cmd|newdimen}} can be accessed directly from Lua, now it which is unexpandednot true for values stored in a macro with {{tex|def}} or {{cmd|definemeasure}}. If "unexpanded" is wished some extracommands are neccesary:
\defineexpandable\... same as the lowlevel-TeX-Macro \def\...The following example shows how to set and access dimensions:
<context mode="mkiv" source="yes">\definenewdimen\...columnA % initialise variable same as the low-level-textmacro \unexpanded\def\... columnA=10mm % set variable
=== Column A is \def ===the\columnA{} wide. % lengths are automatically % displayed in pt.
=== Column A is \newdimen === number\setupexternalfigures[location={localcolumnA sp wide. % internally,global,default}] lengths are stored \defineexpandable\ColumnA {30mm} \defineexpandable\ColumnB {40mm} \newdimen\ColumnAB \ColumnAB=\dimexpr(\ColumnA + \ColumnB) A \ColumnA B \ColumnB ColumnAB: \the\ColumnAB \externalfigure[cow][width=\the\ColumnAB]\externalfigure ist also working without "\the". % as an integer number of sp
=== \ctxlua blackrule[width=== \setupexternalfigures[location={local,global,default}columnA] \defineexpandable\ColumnA {30mm} \defineexpandable\ColumnB {40mm} \defineexpandable\ColumnABii {\ctxlua{</context([==[\ColumnA + \ColumnB]==])}} ColumnABii: \the\dimexpr \ColumnABii\relax \externalfigure[cow][width=\dimexpr(\ColumnABii)\relax]>
==Defining and accesing dimensions in Lua = Important to understand ===ToDos: This points have to be explained.
==== Which method? ==== When How to use which of the above methods?rewrite TeX code
==== <texcode>\the ====\dimexpr\availablehsize\relax %say, 426pt \the: what is it? When to use?</texcode>
==== Expanding ==== expanding of variablesMostly LMTX: What does this mean? When to use?
<context mode="mkxl" source=== \relax ====With \relax the termination of a calculation is garantied. If there is one too much ... no problem, then it is ignored."yes">
"add a 1: \number\dimexpr\availablehsize\relax after code definitions to prevent the scanner from reading too much"
2: \the\dimexpr... will look ahead till there's something nonexpandable, and contrary to what one expectsstartluacode
\dimexprtoken.set_macro(tex.ctxcatcodes,"temp","\\scratchdimen\\availablehsize") token.expand_macro("temp") context(tex.getdimen("scratchdimen"))\stopluacode
3: \startluacode
will not stop at the ) sotoken.set_macro(tex.ctxcatcodes, although with measures it normally goes okay"temp", personally I always use "\\relax as terminator; the scratchdimen\relax will be eaten up so there is no interference but it guarantees to stop scanning\availablehsize") tex.runlocal("temp") context(tex.getdimen("scratchdimen"))\stopluacode
;Example4: \definemeasure[ColumnC][30mm]startluacode tex.print("\definemeasure[ColumnD][40mm] \definemeasure[ColumnCDi][scratchdimen\the\dimexpravailablehsize") tex.pushlocal() tex.poplocal() context(tex.getdimen(\measure{ColumnC}+\measure{ColumnD}"scratchdimen"))\relax]stopluacode
5: \startluacode
tex.print("\\dimensiondef\\temp\\availablehsize")
tex.pushlocal()
tex.poplocal()
context(tex.getdimensionvalue("temp"))
\stopluacode
;Further examples\def\calculateavailablehsize{\dimensiondef\temp\availablehsize} 6:\startluacode token.expand_macro("calculateavailablehsize") context(tex.getdimensionvalue("temp"))\stopluacode \newtoks\tcalculateavailablehsize \footnotetcalculateavailablehsize{\input tufte dimensiondef\temp\relaxavailablehsize}  7: \parstartluacode -- mkiv tex.runtoks("tcalculateavailablehsize") context(tex.getdimensionvalue("temp"))\stopluacode</context> == Converting dimensions == Usually, you will want to express a dimension in something other than points orscaled points. For this, Lua is the way to go:  * If you want to print, the functions {{code|number.tocentimeters}}, {{code|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 {{code|number.dimenfactors}}. For example, {{code|65536 * number.dimenfactors["pt"]}} returns {{code|1}}. <context source=yes>\newdimen\columnA % initialise variable\columnA=10mm % set variable \definepapersizestartluacode 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[bigsheet"mm"]* number.dimenfactors[width"cm"] context("Column A is %.1f cm", incm)\stopluacode</context> == Calculating with dimensions == From TeX, you can compute with dimensions by writing your calculation between {{tex|dimexpr}}{{code|...}}{{tex|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 0.5 cm equals \the\dimexpr\paperwidth+6mmcolumnA / 2 \relax,height. \blackrule[width=\dimexpr2 \paperheight+6mmcolumnA\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=mkiv source=yes>\newdimen\columnA\columnA=1cm \startluacode local A = tex.dimen.columnA double_A = 2 * A context.blackrule({width = double_A .. "sp"})\stopluacode</context> ;More examples: <context mode=mkiv source=yes> \newdimen\AAA \AAA=100pt \newdimen\BBB \BBB=\AAA  AAA is \the\AAA  BBB is \the\BBB</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>\setupTABLEdefinemeasure[One][c10mm]\def\Two{20mm} \definemeasure[3Three][width={\dimexpr(\textwidth-2cm)* 2 / 3measure{One} + \Two\relax] \blackrule[width=\measure{One}] \crlf \definemeasureblackrule[topspacewidth=\Two] \crlf\blackrule[width=\measure{Three}]\dimexpr(210mmcrlf</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 mm !! in cm|-| 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 || {{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|-31mm*| 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}}| 1864679.8 || 28.4528 || 2.3711 || 26.5911 || 2\relax].2159| 28.3464 || 0.39370 || 10 || 1|-|}
== See also ==
* [[Command/define]]{{cmd|definemeasure}}* {{cmd|measure}}
[[Category:ConTeXt-IssuesProgramming and Databases]][[Category:ProgrammingTools]]
138

edits

Navigation menu