Help:自定义计量单位

本页面将阐述的是页面可对计量单位的显示与转换施加更多控制的方法，尤其是对于那些数据类型为Quantity（数量型）的属性. 此功能使标注变得更加灵活：每个人均可采用自己的首选计量单位来查看和输入数据，而不会对相互之间的理解造成限制. 例如，一些人可能会首选以为"miles"（英里）单位的距离，而不是以"km"（公里）为单位. 在其他情况下，如果采用"microns"（微米）来显示距离更合适的话，那么，就适合采用"km"（公里）.

单位转换自定义类型
SMW拥有对于能够处理计量单位的一些类型的内在支持（比如，Temperature（温度型）），不过亦可轻松地添加更多的类型. 支持计量单位的类型可以接受几种不同计量单位的取值，并对其加以转换和显示. 您可以在"Berlin"之类文章的事实框当中看到这一点，其中采用多种计量单位给出了面积.

为了支持此类功能特性，SMW需要知道如何将一种计量单位的取值转换成另一种计量单位的取值. 在许多情况下，这相当容易，而在其他情况下，则可能会涉及到更加复杂的计算处理. 我们将其分为如下两种情况：
 * 1) 所需计量单位之间的转换是成比例的. 也就是说，要获得另一个计量单位的取值，只需将当前计量单位的取值乘上一个固定的转换系数. 例如，公里与英里之间的转换就属于这种情况.
 * 2) 计量单位之间的转换不成比例，且需要更为复杂计算处理. 例如，温度就属于这种情况，因为要从°C转换成°F，需要加法和乘法.

对于这种类型的计量单位转换，自定义数据类型Quantity（数量型）可用于在维基站点之中定义计量单位和转换系数. 对于第二种情况下，我们将在下文当中讨论一些可能性.

成比例计量单位之间的转换
SMW所提供的数据类型Quantity（数量型），用于声明那些其取值由一个数值与一个计量单位（unit of measurement）构成的属性. 计量单位可以是任何开头不是数字的文本标签，如"miles"、"km²"或"m/s"等等. 要让一种计量单位（或者计量单位的备选写法）变得可以使用， 如下文所述，必须首先在相应的属性页面上对其加以声明. 只有经过声明的计量单位方可使用，否则，所有其他的都将作为输入错误而遭到拒绝. 因此，在声明至少一个计量单位之前，Quantity型（数量型）属性几乎就没什么用处. 这种严格体系的优点就是，SMW可以在不同的属性取值之间进行相互比较，即使是用于编写这些取值的计量单位互不相同. 每个输入值都明确地规定了一个"数量（quantity）"（诸如一段时间或一段距离），即使是书写这些取值时采用的是不同的方式，也能够得到理解. 属性取值实际上就是这样一种数量（同时，这也正是所存储的形式），而不是用来在某个维基页面上书写该取值时所采用的具体文本（存储的并不是这种文本或其原始计量单位）. 我们已经见过其他数据类型的一种类似行为，比如，SMW并不存储究竟一个数值到底写作"2"还是"2.0"，而是始终将其视为同一数值来处理.

要使用SMW当中的计量单位转换功能，首先需要重建一个合适的属性. 像往常一样，可能首先希望利用维基站点搜索和Special:Properties页面来查看，是否早已存在一种可以满足自己目的的属性. 如果没有，请在属性命名空间之中创建一篇新的文章. 例如，假设我们希望引入属性[Property:Power]]（功率），用于度量功率的物理量（physical quantity）. 在这篇新的文章里，应当首先针对这个新属性的用途和使用写上几句. 对我们这个例子，应该说我们指的是，该物理量通常是以Watt（瓦特）为单位来测量的. 同时，这也有助于其他人在搜索关键词时找到并复用您的这个类型. 要规定其数据类型，可在该页面的某个位置（最好在一个句子当中）加入下列标注：

has type::quantity

要声明所支持的计量单位，请使用特殊属性corresponds to（对应于）. 例如，要规定适用于功率的这个新的数据类型的主要计量单位，我们在其中添加如下标注：

Corresponds to::1 W

取值"1 W"说了两件事情： (1) 该类型理解计量单位"W"； (2) 计量单位"W"是其主计量单位（这正是"1"所代表的）. 主计量单位指的是用于显示该数据类型取值的默认选项，且假设是当用户在不提供任何计量单位的情况下输入一个普通数值的时候. 规定更多的单位也并非难事，比如：

Corresponds to::0.001 kW Corresponds to::0.0013410220 hp.

这也就是说，该类型同时也理解计量单位"kW"和"hp". 这样，对标注的阅读就会更有意义了： 1 W 对应于0.001 kW，而后者又对应于0.0013410220 hp. 利用这种方式，可以支持任意的计量单位，只要能够以这种简易的方式来描述它们与主计量单位的关系即可.

在许多情况下，会有多种方式来指称一种计量单位. 例如，我们希望让用户能够采用"W"和"Watt"，可能甚至还包括"Watts". 一种简洁的办法就是采用逗号将附加计量单位分隔开来. 而不是写上多条具有相同系数的"corresponds to"语句. 比如，可以这样写：

Corresponds to::1 W, Watt, Watts Corresponds to::0.0013410220 hp,bhp,horsepower

在这种情况下，主计量单位就是关于1的"corresponds to"语句里面的第一个计量单位，在项我们这个例子里面就是"W". 属性将会理解"corresponds to"语句之中所定义的所有计量单位，并将显示这些计量单位之间的转换（不带重复，即SMW不会同时显示"W"和"Watt"）.

在内部，取值都将会被转换成主计量单位，RDF导出将仅仅显示采用这种计量单位的取值. 那些根本不包含计量单位的输入将始终被理解为采用主计量单位的取值. 从这个角度来说，计量单位转换就是一种预处理（pre-processing）（针对用户输入）和后处理（post-processing）（针对显示），从而更便于用户处理计量单位. 如下文所述，在维基站点里面，计量单位的显示呈现高度的可自定义性，且不必涉及主计量单位.

提示：如果多个属性采用的是相同的计量单位声明（比如，"Property:Width"和"Property:Height"）， 一种好的办法就是，将这些计量单位声明放到一个模板当中，继而可在所有这些属性页面上把该模板包含进来. 采取这种方式，即可保证那些度量相同数量（quantity，物理量）的属性的确始终支持相同的计量单位.

请注意： 属性取值之中的数值后面必须始终写上计量单位. 目前，并不支持诸如"$100"当中之类的前缀型计量单位（prefix units）.

不成比例计量单位之间的转换
对于Quantity（数量型）数据类型，只能规定一个成比例转换系数，即一个倍数. 因此，无法拥有针对不同计量单位的不同底数（bases）、不同的对数尺度转换等等【原文：So you cannot have different bases for different units, logarithmic scale conversions, etc. 】. 例如，无法为温度创建自定义类型，从而将摄氏度转换为华氏度（这种转换不仅涉及乘法，还要用到加法）. 对于温度，SMW已经提供了一种用于处理这种转换的内置数据类型. 但是，对于其他情况，则可能并非如此.

SMW不允许在维基站点中规定自定义的不成比例计量单位. 针对这种情况的一种变通手段就是，利用Number（数值型）数据类型，略去标注当中的计量单位，而只是将该计量单位写在相应的维基文本里面. 这种办法摒弃了计量单位支持方便的预处理和后处理功能，但就大多数其他的功能（查询、导出等等）而言，则提供了同样的效果. 另外，亦可利用带有解析器函数的模板来实现特定的计量单位转换，但这通常会导致错综复杂的维基文本和处理效率的下降.

如果的确需要一种新的计量单位，一种更好的解决办法就是，编写一个小型的PHP脚本来实现所需的转换. 采取这种方式来扩展SMW并不困难，而且仅仅复制和调整Type:Temperature（温度类型）的代码（包括注释在内，其只有100行稍多一点）即可. 在实施此类自定义类型的时候，可以在不对已有文章造成任何负面影响的情况下，将已有的Type:Number（数值型）属性更改为这种新的类型. 当面对不支持的计量单位时，自定义类型的行为仍将类似于简单的数值型数据类型.

自定义计量单位的显示
单独一种属性可以支持种类多样的计量单位. 例如，单单一个长度类型即可轻松地支持光年和纳米两种计量单位. 即使是在特定的属性里面需要的只是这些计量单位当中的一些计量单位，如上所述，在一个模板内声明所有相关的计量单位，依然可能会是有用的做法. 然而，如果使用属性"Elevation"（海拔）来说明山的高度，采用光年或纳米来显示该取值，则几乎没什么用处.

因此，SMW允许您规定，在一个属性所支持的所有计量单位里面，究竟其应当显示哪些计量单位. 如果没有提供关于显示的首选设置，则在属性所有的计量单位当中，属性首先会采用主计量单位（转换系数为1的那个计量单位）来显示.

要规定自定义的显示用计量单位，请在属性页面上添加特殊属性display units（显示用计量单位），在其中提及您所希望显示的每个计量单位，并采用逗号加以分隔. 例如，文章Property:Height之中可能就含有如下语句：

display units::km,ft,miles

这会造成事实框仅仅显示上述三种适用于高度属性Height的计量单位，尽管该属性可能会支持十几种计量单位. 类似地，每个此类取值的提示信息将会显示相应的那些转换值. 这种自定义适用于那些采用带有计量单位支持的类型的所有属性，而无论相应的类型究竟是自定义的还是内置的.

如果您要更改第一位的显示用计量单位，请考虑将主计量单位作为其余显示用计量单位之一向用户加以显示，因为SMW在存储这些取值的时候仍会将它们转换成主计量单位.

早期版本SMW当中的自定义计量单位
直至SMW 1.5.6，数据类型当时都曾有着各自的维基页面，而自定义计量单位是在数据类型页面上加以声明的，而不是在属性页面上. 当时，还不存在数据类型Qunatity（数量型），而数据类型Number（数值型）和所有的计量单位转换类型均接受未知计量单位作为输入. 为了简化整个过程（更少的命名空间、更少的页面以及更少的特殊情况/特例），这种状况已经变更到当前系统的情况. 为了重复利用就像旧版系统当中那样的许多属性页面上的计量单位声明， 可直接将计量单位声明放在那些包含在许多属性页面上的模板当中.

关于旧版本系统的文档，请参见Help:Custom units 1.5.