Changes

Jump to navigation Jump to search
4,875 bytes added ,  15:34, 27 September 2018
m
Add hatnote pointing users to Layout, too
{{note|This article is about the data type. For the names of a page's many dimensions, see [[Layout]].}}
=== Mit Maßeinheiten rechnen ===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 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 === \definemeasure ====1 cicero.Diese Möglichkeit zieht Wolfgang Schuster vor!* big points ('''bp'''), defined by Adobe as 1/72 of an inch. \setupexternalfigures[location={local* millimeters ('''mm'''), centimeters ('''cm'''), and,globalunavoidably,default}] \definemeasure[ColumnC][30mm] \definemeasure[ColumnD][40mm] \definemeasure[ColumnCD][\the\dimexprinches (\measure{ColumnC}+\measure{ColumnD}'''in''')\relax] C \measure{ColumnC} D \measure{ColumnD} CD \measure{ColumnCD} \externalfigure[cow][width=\measure{ColumnCD}].
==== \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 == \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][width=\the\ColumnAB]\externalfigure scheint auch ohne "\the" zu funktionieren.
==== \ctxlua ==== \setupexternalfigures[location={local{tex|newdimen}} is the native TeX method to initialise a dimension variable. The requirement to explicitly initialize your dimension variables is a bit clunky,global,default}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 \defineexpandable\ColumnA * Values stored in a dimension register with {{30mmcmd|newdimen}} \defineexpandable\ColumnB can be accessed directly from Lua, which is not true for values stored in a macro with {{40mmtex|def} \defineexpandable\ColumnABii } or {\ctxlua{context([==[\ColumnA + \ColumnB]==])cmd|definemeasure}} ColumnABii: \the\dimexpr \ColumnABii\relax \externalfigure[cow][width=\dimexpr(\ColumnABii)\relax].
==== Sonstiges (problematisch) ====The following example shows how to set and access dimensions:
<context mode="mkiv" source="yes">
\newdimen\columnA % initialise variable
\columnA=10mm % set variable
Column A is \definethe\variableA columnA{20mm}wide. % lengths are automatically \newdimen\variableB \variableB = 30mm % displayed in pt.
Column A is \variableA number\columnA sp wide. % kann direkt ausgegeben werden:internally, lengths are stored \variableA % as an integer number of sp
\variableB % kann nicht direkt ausgegeben werden ... ist aber auch nicht nötig.blackrule[width=\columnA]</context>
Bei \define ist die Berechnung einer neuen Variable mit \dimexpr nicht möglich, wohl aber in Befehlen, wie \externalfigure, z.B. \externalfigure[cow][width=\variableA *2]= Converting dimensions ==
In \newdimen können Berechnungen mit \dimexpr vorgenommen und Usually, you will want to express a dimension in eine neue Variable gespeichert werdensomething other than points orscaled points. For this, Lua is the way to go: \newdimen\variableC \variableC = \dimexpr(\variableB * 2)
\newdimen- und \define-Variable lassen sich wohl doch mischen* If you want to print, the functions {{code|number. Das scheint falsch zu sein: \newdimen kann nicht mit Variablen rechnentocentimeters}}, die mit \define festgelegt wurden {{code|topoints}}, {{code|topicas}}, etc. are already provided. These functions return a number as a string with (by default) the unit abbreviation appended.
==== Offene Fragen ==== \* If you want to calculate, the expand \relaxconversion factors from standard points are stored in {{code|number.dimenfactors}}. For example, {{code|65536 * number.dimenfactors["pt"]}} returns {{code|1}}.
<context source=yes mode=mkiv>
\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</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 \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=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>\definemeasure[LinkOne][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</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''' || || ||| || || || |-Text| 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|-| 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.2159| 28.3464 || 0.39370 || 10 || 1|-|} == See also ==* {{cmd|definemeasure}}* {{cmd|measure}} [[Category:Programming]][[Category:ConTeXt-IssuesDimensions|!]]

Navigation menu