@menu
* Introduction to ezunits::
* Introduction to physical_constants::
* Functions and Variables for ezunits::
@end menu

@node Introduction to ezunits, Introduction to physical_constants, ezunits, ezunits
@section Introduction to ezunits

@code{ezunits}は次元量を扱うためのパッケージです。
次元解析のいくつかの関数を含みます。
@code{ezunits}は
次元量と単位変換に関する算術演算を
実行できます。
組み込み単位は国際単位系(SI)とUS慣習単位系を含み、他の単位が宣言できます。
@code{physical_constants}、物理定数のコレクション、も参照してください。

@code{load("ezunits")}はこのパッケージをロードします。
@code{demo(ezunits)}はいくつかの例を表示します。
便利な関数@code{known_units}は組み込みとユーザー宣言単位のリストを返し、
そして、
@code{display_known_unit_conversions}は
可読性の高いフォーマットで既知の変換一式を表示します。

式@math{a ` b}は、無次元量を示す@code{a}と次元単位@code{b}で
次元量を表します。
そのように宣言することなしに、シンボルを単位として使うことができます;
単位シンボルはいかなる特別なプロパティを持つ必要はありません。
式@math{a ` b}の量と単位は、
それぞれ、@code{qty}関数と@code{units}関数で抽出することができます。

シンボルは、指定された量か指定された単位か両方を持つ次元量であると宣言することができます。

式@math{a ` b `@w{}` c}は
単位@code{b}から単位@code{c}に変換します。
@code{ezunits}は
SI基本単位、SI組立単位、いくつかの非SI単位に関する組み込み変換を持っています。
まだ@code{ezunits}が知らない単位変換は、宣言することができます。
@code{ezunits}が知っている単位変換は
組み込み変換とユーザー定義の変換から構成される
グローバル変数@code{known_unit_conversions}で指定されます。
単位の積や商、冪に関する変換は知られている単位変換の組から演繹されます。

Maximaは一般的に厳密でない数(浮動小数点数か多倍長浮動小数点数)より
厳密な数(整数か有理数)を好むので、
次元量でそれらが現れた時、@code{ezunits}は厳密な数を保護します。
組み込み単位変換すべては厳密な数で表現されます;
宣言された変換で厳密でない数は厳密なものに強制的に変換されます。

単位の表示のために優先される系はありません;
入力単位は、変換を明示的に示さない限り、他の単位には変換されません。
@code{ezunits}は
前置詞m-, k-, M, G-(ミリ-, キロ-, メガ-, ギガ-)を
SI基本単位やSI組立単位に適用された際、
認識しますが、
そんな前置詞は明示的な変換で示された時だけ適用されます。

次元量に対する算術演算子は
そんな演算子の慣例的な規則で実行されます。

@itemize
@item @math{(x ` a) * (y ` b)} is equal to @math{(x * y) ` (a * b)}.
@item @math{(x ` a) + (y ` a)} is equal to @math{(x + y) ` a}.
@item @math{(x ` a)^y} is equal to @math{x^y ` a^y} when @code{y} is nondimensional.
@end itemize

@code{ezunits}は
和の中の単位が同じ次元を持つことを要求しません;
そんな項は足さられず、エラーは報告されません。

@code{ezunits}は初等的な次元解析関数を含みます。
すなわち、次元量の基本的な次元と基本的な単位、無次元量と自然単位系の計算です。
次元解析の関数は
Barton Willisが書いた別のパッケージの類似の関数から焼き直されました。

次元解析のために、
基本的な次元のリストと基本的な単位の連想リストは保持されます;
デフォルトでは、
基本的な次元は、長さ、質量、時刻、電荷、温度、量であり、
基本的な単位は関連したSI単位で、
他の基本的な次元や単位を宣言できます。

@opencatbox
@category{Physical units}
@category{Share packages}
@category{Package ezunits}
@closecatbox

@node Introduction to physical_constants, Functions and Variables for ezunits, Introduction to ezunits, ezunits
@section Introduction to physical_constants

@code{physical_constants}は物理定数のコレクションです。
CODATA 2006 推奨値からコピーしました。[1]
@code{load("physical_constants")}はこのパッケージをロードし、
まだロードされていないなら、@code{ezunits}もロードします。

物理定数は定数値のプロパティを持つシンボルとして表されます。
定数値は、@code{ezunits}が表すように次元量です。
関数@code{constvalue}は定数値を取りに行きます;
定数値はシンボルの普通の値ではなく、
@code{constvalue}が値を取りに行くまで、
物理定数のシンボルは評価される式の中でシンボルのままです。

@code{physical_constants}はある補助情報、
すなわち、それぞれの定数の記述文字列、
数値の誤差の見積もり、TeX表示のためのプロパティを含みます。
物理定数を識別するために、それぞれのシンボルは
@code{physical_constant}性質を持ちます;
それ故に、@code{propvars(physical_constant)}はそんなシンボルすべてのリストを
表示します。

@code{physical_constants}以下の定数を含みます。

@table @code
@item %c
真空中の光速度
@item %mu_0
真空の透磁率
@item %e_0
真空の誘電率
@item %Z_0
真空の特性インピーダンス
@item %G
Newtonの重力定数
@item %h
Planck定数
@item %h_bar
Planck定数
@item %m_P
Planck質量
@item %T_P
Planck温度
@item %l_P
Planck長
@item %t_P
Planck時間
@item %%e
電気素量
@item %Phi_0
磁束量子
@item %G_0
コンダクタンス量子
@item %K_J
Josephson定数
@item %R_K
von Klitzing定数
@item %mu_B
Bohr磁子
@item %mu_N
核磁子
@item %alpha
微細構造定数
@item %R_inf
Rydberg定数
@item %a_0
Bohr半径
@item %E_h
Hartreeエネルギー
@item %ratio_h_me
循環量子
@item %m_e
電子質量
@item %N_A
Avogadro数
@item %m_u
原子質量定数
@item %F
Faraday定数
@item %R
気体定数
@item %%k
Boltzmann定数
@item %V_m
理想気体のモル体積
@item %n_0
Loschmidt定数
@item %ratio_S0_R
Sackur-Tetrode定数 (絶対エントロピー定数)
@item %sigma
Stefan-Boltzmann定数
@item %c_1
第一放射定数
@item %c_1L
スペクトル放射強度の第一放射定数
@item %c_2
第二放射定数
@item %b
Wien変位則定数
@item %b_prime
Wien変位則定数
@end table

参考文献:

[1] @url{http://physics.nist.gov/constants}

例:

@code{physical_constant} プロパティを持つすべてのシンボルのリスト。

@c ===beg===
@c load ("physical_constants")$
@c propvars (physical_constant);
@c ===end===
@example
(%i1) load ("physical_constants")$
(%i2) propvars (physical_constant);
(%o2) [%c, %mu_0, %e_0, %Z_0, %G, %h, %h_bar, %m_P, %T_P, %l_P, 
%t_P, %%e, %Phi_0, %G_0, %K_J, %R_K, %mu_B, %mu_N, %alpha, 
%R_inf, %a_0, %E_h, %ratio_h_me, %m_e, %N_A, %m_u, %F, %R, %%k, 
%V_m, %n_0, %ratio_S0_R, %sigma, %c_1, %c_1L, %c_2, %b, %b_prime]
@end example

物理定数@code{%c}のプロパティ。

@c ===beg===
@c load ("physical_constants")$
@c constantp (%c);
@c get (%c, description);
@c constvalue (%c);
@c get (%c, RSU);
@c tex (%c);
@c ===end===
@example
(%i1) load ("physical_constants")$
(%i2) constantp (%c);
(%o2)                         true
(%i3) get (%c, description);
(%o3)               speed of light in vacuum
(%i4) constvalue (%c);
                                      m
(%o4)                     299792458 ` -
                                      s
(%i5) get (%c, RSU);
(%o5)                           0
(%i6) tex (%c);
$$c$$
(%o6)                         false
@end example

1ポンドの質量に等価なエネルギー。
シンボル @code{%c}は、
@code{constvalue}が値を取りにいくまでシンボルのままです。

@c ===beg===
@c load ("physical_constants")$
@c m * %c^2;
@c %, m = 1 ` lbm;
@c constvalue (%);
@c E : % `` J;
@c E `` GJ;
@c float (%);
@c ===end===
@example
(%i1) load ("physical_constants")$
(%i2) m * %c^2;
                                2
(%o2)                         %c  m
(%i3) %, m = 1 ` lbm;
                              2
(%o3)                       %c  ` lbm
(%i4) constvalue (%);
                                            2
                                       lbm m
(%o4)              89875517873681764 ` ------
                                          2
                                         s
(%i5) E : % `` J;
Computing conversions to base units; may take a moment. 
                     366838848464007200
(%o5)                ------------------ ` J
                             9
(%i6) E `` GJ;
                      458548560580009
(%o6)                 --------------- ` GJ
                         11250000
(%i7) float (%);
(%o7)              4.0759872051556356e+7 ` GJ
@end example

@opencatbox
@category{Physical units}
@category{Share packages}
@category{Package physical_constants}
@closecatbox

@node Functions and Variables for ezunits, , Introduction to physical_constants, ezunits
@section Functions and Variables for ezunits

@deffn {演算子} `

次元量演算子。
式 @math{a ` b}は次元量を表します。
@code{a}は無次元量を表し、@code{b}は次元単位を表します。
シンボルは、宣言せずに単位として使うことができます;
単位シンボルは特別なプロパティを持つ必要はありません。
式 @math{a ` b}の量と単位はそれぞれ、
@code{qty}と @code{units}関数で抽出することができます。

次元量の算術演算子は演算子の慣例規則に従って実行されます。

@itemize
@item @math{(x ` a) * (y ` b)}は @math{(x * y) ` (a * b)}に等しい。
@item @math{(x ` a) + (y ` a)}は @math{(x + y) ` a}に等しい。
@item @math{(x ` a)^y}は @code{y}が無次元の時 @math{x^y ` a^y}に等しい。
@end itemize

@code{ezunits}は和の中の単位が同じ次元であることを要求しません;
そんな項は一緒には足されませんし、エラーは報告されません。

@code{load("ezunits")}はこの演算子をイネーブルにします。

例:

SI (国際単位系) 単位。

@c ===beg===
@c load ("ezunits")$
@c foo : 10 ` m;
@c qty (foo);
@c units (foo);
@c dimensions (foo);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) foo : 10 ` m;
(%o2)                        10 ` m
(%i3) qty (foo);
(%o3)                          10
(%i4) units (foo);
(%o4)                           m
(%i5) dimensions (foo);
(%o5)                        length
@end example

"慣習"単位。

@c ===beg===
@c load ("ezunits")$
@c bar : x ` acre;
@c dimensions (bar);
@c fundamental_units (bar);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) bar : x ` acre;
(%o2)                       x ` acre
(%i3) dimensions (bar);
                                   2
(%o3)                        length
(%i4) fundamental_units (bar);
                                2
(%o4)                          m
@end example

アドホック単位。

@c ===beg===
@c load ("ezunits")$
@c baz : 3 ` sheep + 8 ` goat + 1 ` horse;
@c subst ([sheep = 3*goat, horse = 10*goat], baz);
@c baz2 : 1000`gallon/fortnight;
@c subst (fortnight = 14*day, baz2);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) baz : 3 ` sheep + 8 ` goat + 1 ` horse;
(%o2)           8 ` goat + 3 ` sheep + 1 ` horse
(%i3) subst ([sheep = 3*goat, horse = 10*goat], baz);
(%o3)                       27 ` goat
(%i4) baz2 : 1000`gallon/fortnight;
                                gallon
(%o4)                   1000 ` ---------
                               fortnight
(%i5) subst (fortnight = 14*day, baz2);
                          500   gallon
(%o5)                     --- ` ------
                           7     day
@end example

次元量の算術演算子

@c ===beg===
@c load ("ezunits")$
@c 100 ` kg + 200 ` kg;
@c 100 ` m^3 - 100 ` m^3;
@c (10 ` kg) * (17 ` m/s^2);
@c (x ` m) / (y ` s);
@c (a ` m)^2;
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) 100 ` kg + 200 ` kg;
(%o2)                       300 ` kg
(%i3) 100 ` m^3 - 100 ` m^3;
                                  3
(%o3)                        0 ` m
(%i4) (10 ` kg) * (17 ` m/s^2);
                                 kg m
(%o4)                      170 ` ----
                                   2
                                  s
(%i5) (x ` m) / (y ` s);
                              x   m
(%o5)                         - ` -
                              y   s
(%i6) (a ` m)^2;
                              2    2
(%o6)                        a  ` m
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {演算子} `@w{}`

単位変換演算子。
式 @math{a ` b `@w{}` c}は単位 @code{b}を単位 @code{c}に変換します。
@code{ezunits}にはSI基本単位、SI組立単位、いくつかの非SI単位のための
組み込み変換があります。
@code{ezunits}がまだ知らない単位変換は宣言することができます。
@code{ezunits}が知っている単位変換はグローバル変数 @code{known_unit_conversions}に
明記されます。それは、組み込みとユーザー定義の変換を含みます。
単位の積、商、べきの変換は既知の単位変換一式から演繹されます。

単位の表示のためにより好まれる系はありません;
変換が明示的に示されない限り、
入力単位は他の単位に変換されません。
@code{ezunits}は、
変換が明示的に示されない限り、
前置詞(milli-, centi-, deci-, etc)で単位を整理しようとしません。

@code{load("ezunits")}はこの演算子を有効にします。

例:

既知の単位変換一式。

@c ===beg===
@c load ("ezunits")$
@c display2d : false$
@c known_unit_conversions;
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) display2d : false$
(%i3) known_unit_conversions;
(%o3) @{acre = 4840*yard^2,Btu = 1055*J,cfm = feet^3/minute,
       cm = m/100,day = 86400*s,feet = 381*m/1250,ft = feet,
       g = kg/1000,gallon = 757*l/200,GHz = 1000000000*Hz,
       GOhm = 1000000000*Ohm,GPa = 1000000000*Pa,
       GWb = 1000000000*Wb,Gg = 1000000*kg,Gm = 1000000000*m,
       Gmol = 1000000*mol,Gs = 1000000000*s,ha = hectare,
       hectare = 100*m^2,hour = 3600*s,Hz = 1/s,inch = feet/12,
       km = 1000*m,kmol = 1000*mol,ks = 1000*s,l = liter,
       lbf = pound_force,lbm = pound_mass,liter = m^3/1000,
       metric_ton = Mg,mg = kg/1000000,MHz = 1000000*Hz,
       microgram = kg/1000000000,micrometer = m/1000000,
       micron = micrometer,microsecond = s/1000000,
       mile = 5280*feet,minute = 60*s,mm = m/1000,
       mmol = mol/1000,month = 2629800*s,MOhm = 1000000*Ohm,
       MPa = 1000000*Pa,ms = s/1000,MWb = 1000000*Wb,
       Mg = 1000*kg,Mm = 1000000*m,Mmol = 1000000000*mol,
       Ms = 1000000*s,ns = s/1000000000,ounce = pound_mass/16,
       oz = ounce,Ohm = s*J/C^2,
       pound_force = 32*ft*pound_mass/s^2,
       pound_mass = 200*kg/441,psi = pound_force/inch^2,
       Pa = N/m^2,week = 604800*s,Wb = J/A,yard = 3*feet,
       year = 31557600*s,C = s*A,F = C^2/J,GA = 1000000000*A,
       GC = 1000000000*C,GF = 1000000000*F,GH = 1000000000*H,
       GJ = 1000000000*J,GK = 1000000000*K,GN = 1000000000*N,
       GS = 1000000000*S,GT = 1000000000*T,GV = 1000000000*V,
       GW = 1000000000*W,H = J/A^2,J = m*N,kA = 1000*A,
       kC = 1000*C,kF = 1000*F,kH = 1000*H,kHz = 1000*Hz,
       kJ = 1000*J,kK = 1000*K,kN = 1000*N,kOhm = 1000*Ohm,
       kPa = 1000*Pa,kS = 1000*S,kT = 1000*T,kV = 1000*V,
       kW = 1000*W,kWb = 1000*Wb,mA = A/1000,mC = C/1000,
       mF = F/1000,mH = H/1000,mHz = Hz/1000,mJ = J/1000,
       mK = K/1000,mN = N/1000,mOhm = Ohm/1000,mPa = Pa/1000,
       mS = S/1000,mT = T/1000,mV = V/1000,mW = W/1000,
       mWb = Wb/1000,MA = 1000000*A,MC = 1000000*C,
       MF = 1000000*F,MH = 1000000*H,MJ = 1000000*J,
       MK = 1000000*K,MN = 1000000*N,MS = 1000000*S,
       MT = 1000000*T,MV = 1000000*V,MW = 1000000*W,
       N = kg*m/s^2,R = 5*K/9,S = 1/Ohm,T = J/(m^2*A),V = J/C,
       W = J/s@}
@end example

基本単位変換。

@c ===beg===
@c load ("ezunits")$
@c 1 ` ft `` m;
@c %, numer; 
@c 1 ` kg `` lbm; 
@c %, numer;
@c 1 ` W `` Btu/hour;
@c %, numer;
@c 100 ` degC `` degF;
@c -40 ` degF `` degC;
@c 1 ` acre*ft `` m^3;
@c %, numer;
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) 1 ` ft `` m;
Computing conversions to base units; may take a moment. 
                            381
(%o2)                       ---- ` m
                            1250
(%i3) %, numer;
(%o3)                      0.3048 ` m
(%i4) 1 ` kg `` lbm;
                            441
(%o4)                       --- ` lbm
                            200
(%i5) %, numer;
(%o5)                      2.205 ` lbm
(%i6) 1 ` W `` Btu/hour;
                           720   Btu
(%o6)                      --- ` ----
                           211   hour
(%i7) %, numer;
                                        Btu
(%o7)               3.412322274881517 ` ----
                                        hour
(%i8) 100 ` degC `` degF;
(%o8)                      212 ` degF
(%i9) -40 ` degF `` degC;
(%o9)                     (- 40) ` degC
(%i10) 1 ` acre*ft `` m^3;
                        60228605349    3
(%o10)                  ----------- ` m
                         48828125
(%i11) %, numer;
                                          3
(%o11)                1233.48183754752 ` m
@end example

フィートとメートルを相互に強制変換。

@c ===beg===
@c load ("ezunits")$
@c 100 ` m + 100 ` ft;
@c (100 ` m + 100 ` ft) `` ft;
@c %, numer;
@c (100 ` m + 100 ` ft) `` m;
@c %, numer;
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) 100 ` m + 100 ` ft;
(%o2)                  100 ` m + 100 ` ft
(%i3) (100 ` m + 100 ` ft) `` ft;
Computing conversions to base units; may take a moment. 
                           163100
(%o3)                      ------ ` ft
                            381
(%i4) %, numer;
(%o4)                428.0839895013123 ` ft
(%i5) (100 ` m + 100 ` ft) `` m;
                            3262
(%o5)                       ---- ` m
                             25
(%i6) %, numer;
(%o6)                      130.48 ` m
@end example

基本次元と基本単位を見つけるための次元解析

@c ===beg===
@c load ("ezunits")$
@c foo : 1 ` acre * ft;
@c dimensions (foo);
@c fundamental_units (foo);
@c foo `` m^3;
@c %, numer;
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) foo : 1 ` acre * ft;
(%o2)                      1 ` acre ft
(%i3) dimensions (foo);
                                   3
(%o3)                        length
(%i4) fundamental_units (foo);
                                3
(%o4)                          m
(%i5) foo `` m^3;
Computing conversions to base units; may take a moment. 
                        60228605349    3
(%o5)                   ----------- ` m
                         48828125
(%i6) %, numer;
                                          3
(%o6)                 1233.48183754752 ` m
@end example

宣言された単位変換。

@c ===beg===
@c load ("ezunits")$
@c declare_unit_conversion (MMBtu = 10^6*Btu, kW = 1000*W);
@c declare_unit_conversion (kWh = kW*hour, MWh = 1000*kWh, 
@c                          bell = 1800*s);
@c 1 ` kW*s `` MWh;
@c 1 ` kW/m^2 `` MMBtu/bell/ft^2;
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) declare_unit_conversion (MMBtu = 10^6*Btu, kW = 1000*W);
(%o2)                         done
(%i3) declare_unit_conversion (kWh = kW*hour, MWh = 1000*kWh,
                               bell = 1800*s);
(%o3)                         done
(%i4) 1 ` kW*s `` MWh;
Computing conversions to base units; may take a moment. 
                             1
(%o4)                     ------- ` MWh
                          3600000
(%i5) 1 ` kW/m^2 `` MMBtu/bell/ft^2;
                       1306449      MMBtu
(%o5)                 ---------- ` --------
                      8242187500          2
                                   bell ft
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} constvalue (@var{x})
@deffnx {関数} declare_constvalue (@var{a}, @var{x})
@deffnx {関数} remove_constvalue (@var{a})

@c REWORK THIS STATEMENT !!
シンボルの宣言された定数や、
シンボルに宣言された定数を代入した式の値をを返します。

定数は@code{declare_constvalue}で宣言されます。
@code{constvalue}が認識する定数は
@code{numerval}で宣言された値や@code{constantp}が認識する値と区別されることに
注意してください。

@code{physical_units}パッケージはたくさんの物理定数の定数値を宣言します。

@code{remove_constvalue}は
@code{declare_constvalue}の効果を戻します。

@code{load("ezunits")}はこれらの関数をロードします。

例:

物理定数の定数値。

@c ===beg===
@c load ("physical_constants")$
@c constvalue (%G);
@c get ('%G, 'description);
@c ===end===
@example
(%i1) load ("physical_constants")$
(%i2) constvalue (%G);
                                     3
                                    m
(%o2)                    6.67428 ` -----
                                       2
                                   kg s
(%i3) get ('%G, 'description);
(%o3)           Newtonian constant of gravitation
@end example

新しい定数の宣言。

@c ===beg===
@c load ("ezunits")$
@c declare_constvalue (FOO, 100 ` lbm / acre);
@c FOO * (50 ` acre);
@c constvalue (%);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) declare_constvalue (FOO, 100 ` lbm / acre);
                                 lbm
(%o2)                      100 ` ----
                                 acre
(%i3) FOO * (50 ` acre);
(%o3)                     50 FOO ` acre
(%i4) constvalue (%);
(%o4)                      5000 ` lbm
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} units (@var{x})
@deffnx {関数} declare_units (@var{a}, @var{u})

次元量@var{x}の単位を返します。
もし@var{x}が無次元なら、1を返します。

@var{x}は、文字通り次元式 @math{a ` b}かもしれませんし、
@code{declare_units}を介して宣言された単位を持つシンボルかもしれませんし、
それらの一方または両方を含む式かもしれません。

@code{declare_units}は、
@code{units(@var{a})}は式@var{u}を返さなければいけないことを宣言します。

@code{load("ezunits")}はこれらの関数をロードします。

例:

文字通り次元式へ適用された@code{units}。

@c ===beg===
@c load ("ezunits")$
@c foo : 100 ` kg;
@c bar : x ` m/s;
@c units (foo);
@c units (bar);
@c units (foo * bar);
@c units (foo / bar);
@c units (foo^2);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) foo : 100 ` kg;
(%o2)                       100 ` kg
(%i3) bar : x ` m/s;
                                  m
(%o3)                         x ` -
                                  s
(%i4) units (foo);
(%o4)                          kg
(%i5) units (bar);
                                m
(%o5)                           -
                                s
(%i6) units (foo * bar);
                              kg m
(%o6)                         ----
                               s
(%i7) units (foo / bar);
                              kg s
(%o7)                         ----
                               m
(%i8) units (foo^2);
                                 2
(%o8)                          kg
@end example

宣言された単位を持つシンボルに適用された@code{units}。

@c ===beg===
@c load ("ezunits")$
@c units (aa);
@c declare_units (aa, J);
@c units (aa);
@c units (aa^2);
@c foo : 100 ` kg;
@c units (aa * foo);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) units (aa);
(%o2)                           1
(%i3) declare_units (aa, J);
(%o3)                           J
(%i4) units (aa);
(%o4)                           J
(%i5) units (aa^2);
                                2
(%o5)                          J
(%i6) foo : 100 ` kg;
(%o6)                       100 ` kg
(%i7) units (aa * foo);
(%o7)                         kg J
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} qty (@var{x})
@deffnx {関数} declare_qty (@var{a}, @var{x})

@code{qty}は次元量@var{x}の無次元パーツを返します。
もし @var{x}が無次元なら、@var{x}を返します。
@var{x}は文字通り次元式 @math{a ` b}かも知れませんし、
宣言された量のシンボルかもしれませんし、
それらの一方または両方を含む式かもしれません。

@code{declare_qty}は、
@code{qty(@var{a})}は無次元量@var{x}を返さなければいけないことを宣言します。

@code{load("ezunits")}はこれらの関数をロードします。

例:

文字通り次元式に適用された@code{qty}。

@c ===beg===
@c load ("ezunits")$
@c foo : 100 ` kg;
@c qty (foo);
@c bar : v ` m/s;
@c foo * bar;
@c qty (foo * bar);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) foo : 100 ` kg;
(%o2)                       100 ` kg
(%i3) qty (foo);
(%o3)                          100
(%i4) bar : v ` m/s;
                                  m
(%o4)                         v ` -
                                  s
(%i5) foo * bar;
                                  kg m
(%o5)                     100 v ` ----
                                   s
(%i6) qty (foo * bar);
(%o6)                         100 v
@end example

宣言された量のシンボルへ適用された@code{qty}。

@c ===beg===
@c load ("ezunits")$
@c declare_qty (aa, xx);
@c qty (aa);
@c qty (aa^2);
@c foo : 100 ` kg;
@c qty (aa * foo);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) declare_qty (aa, xx);
(%o2)                          xx
(%i3) qty (aa);
(%o3)                          xx
(%i4) qty (aa^2);
                                 2
(%o4)                          xx
(%i5) foo : 100 ` kg;
(%o5)                       100 ` kg
(%i6) qty (aa * foo);
(%o6)                        100 xx
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@c PROBABLY SHOULD RENAME THIS TO DIMENSIONALP !!
@deffn {関数} unitp (@var{x})

もし@var{x}が文字通り次元式か、
次元的と宣言されたシンボルか、
主演算子が次元的宣言された式なら、
@code{true}を返します。
それ以外なら、@code{unitp}は @code{false}を返します。

@code{load("ezunits")}はこの関数を返します。

例:

文字通り次元式へ適用された@code{unitp}。

@c ===beg===
@c load ("ezunits")$
@c unitp (100 ` kg);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) unitp (100 ` kg);
(%o2)                         true
@end example

次元的と宣言されたシンボルへ適用された@code{unitp}。

@c ===beg===
@c load ("ezunits")$
@c unitp (foo);
@c declare (foo, dimensional);
@c unitp (foo);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) unitp (foo);
(%o2)                         false
(%i3) declare (foo, dimensional);
(%o3)                         done
(%i4) unitp (foo);
(%o4)                         true
@end example

主演算子が次元的と宣言された式に適用された@code{unitp}。

@c ===beg===
@c load ("ezunits")$
@c unitp (bar (x, y, z));
@c declare (bar, dimensional);
@c unitp (bar (x, y, z));
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) unitp (bar (x, y, z));
(%o2)                         false
(%i3) declare (bar, dimensional);
(%o3)                         done
(%i4) unitp (bar (x, y, z));
(%o4)                         true
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} declare_unit_conversion (@var{u} = @var{v}, ...)

式 @var{u} = @var{v}, ... を
単位変換演算子 @math{`@w{}`}が知っている単位変換のリストに追加します。
@var{u}と @var{v}はともにその中のいかなる変数も単位である乗法の項か、
文字通り次元式です。

現在、
それぞれの式の左辺が(乗法式でなく)ただの単位か、
1に等しい量とただの単位である単位の文字通り次元式であるような
変換を表現する必要があります。
この限定は将来のバージョンで緩和されるかもしれません。

@code{known_unit_conversions}は既知の単位変換のリストです。

@code{load("ezunits")}はこの関数をロードします。

例:

乗法項の等式で表現された単位変換。

@c ===beg===
@c load ("ezunits")$
@c declare_unit_conversion (nautical_mile = 1852 * m, 
@c                          fortnight = 14 * day);
@c 100 ` nautical_mile / fortnight `` m/s;
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) declare_unit_conversion (nautical_mile = 1852 * m,
                               fortnight = 14 * day);
(%o2)                         done
(%i3) 100 ` nautical_mile / fortnight `` m/s;
Computing conversions to base units; may take a moment. 
                            463    m
(%o3)                       ---- ` -
                            3024   s
@end example

文字通り次元式の等式で表現された単位変換。

@c ===beg===
@c load ("ezunits")$
@c declare_unit_conversion (1 ` fluid_ounce = 2 ` tablespoon);
@c declare_unit_conversion (1 ` tablespoon = 3 ` teaspoon);
@c 15 ` fluid_ounce `` teaspoon;
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) declare_unit_conversion (1 ` fluid_ounce = 2 ` tablespoon);
(%o2)                         done
(%i3) declare_unit_conversion (1 ` tablespoon = 3 ` teaspoon);
(%o3)                         done
(%i4) 15 ` fluid_ounce `` teaspoon;
Computing conversions to base units; may take a moment. 
(%o4)                     90 ` teaspoon
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} declare_dimensions (@var{a_1}, @var{d_1}, ..., @var{a_n}, @var{d_n})
@deffnx {関数} remove_dimensions (@var{a_1}, ..., @var{a_n})

@code{declare_dimensions}は
@var{a_1}, ..., @var{a_n}を
それぞれ、次元@var{d_1}, ..., @var{d_n}を持つと
宣言します。

@var{a_k}それぞれはシンボルかシンボルのリストです。
もしリストなら、@var{a_k}内のすべてのシンボルは
次元 @var{d_k}を持つように宣言されます。

@code{remove_dimensions}は @code{declare_dimensions}の効果を戻します。

@code{load("ezunits")}はこれらの関数をロードします。

例:

@c ===beg===
@c load ("ezunits") $
@c declare_dimensions ([x, y, z], length, [t, u], time);
@c dimensions (y^2/u);
@c fundamental_units (y^2/u);
@c ===end===
@example
(%i1) load ("ezunits") $
(%i2) declare_dimensions ([x, y, z], length, [t, u], time);
(%o2)                         done
(%i3) dimensions (y^2/u);
                                   2
                             length
(%o3)                        -------
                              time
(%i4) fundamental_units (y^2/u);
0 errors, 0 warnings
                                2
                               m
(%o4)                          --
                               s
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} declare_fundamental_dimensions (@var{d_1}, @var{d_2}, @var{d_3}, ...)
@deffnx {関数} remove_fundamental_dimensions (@var{d_1}, @var{d_2}, @var{d_3}, ...)
@deffnx {グローバル変数} fundamental_dimensions

@code{declare_fundamental_dimensions}は基本次元を宣言します。
シンボル @var{d_1}, @var{d_2}, @var{d_3}, ... は、
もしそれらがまだリストの中にないなら、基本次元のリストに追加されます。

@code{remove_fundamental_dimensions}は
@code{declare_fundamental_dimensions}の効果を戻します。

@code{fundamental_dimensions}は基本次元のリストです。
デフォルトでは、リストはいくつかの物理次元から成ります。

@code{load("ezunits")}はこれらの関数をロードします。

例:

@c ===beg===
@c load ("ezunits") $
@c fundamental_dimensions;
@c declare_fundamental_dimensions (money, cattle, happiness);
@c fundamental_dimensions;
@c remove_fundamental_dimensions (cattle, happiness);
@c fundamental_dimensions;
@c ===end===
@example
(%i1) load ("ezunits") $
(%i2) fundamental_dimensions;
(%o2) [length, mass, time, current, temperature, quantity]
(%i3) declare_fundamental_dimensions (money, cattle, happiness);
(%o3)                         done
(%i4) fundamental_dimensions;
(%o4) [length, mass, time, current, temperature, quantity, 
                                        money, cattle, happiness]
(%i5) remove_fundamental_dimensions (cattle, happiness);
(%o5)                         done
(%i6) fundamental_dimensions;
(%o6) [length, mass, time, current, temperature, quantity, money]
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} declare_fundamental_units (@var{u_1}, @var{d_1}, ..., @var{u_n}, @var{d_n})
@deffnx {関数} remove_fundamental_units (@var{u_1}, ..., @var{u_n})

@code{declare_fundamental_units}は
@var{u_1}, ..., @var{u_n}を
それぞれ、次元@var{d_1}, ..., @var{d_n}を持つように宣言します。
引数すべてはシンボルでなければいけません。

@code{declare_fundamental_units}をコールした後、
@code{dimensions(@var{u_k})}は
引数@var{u_1}, ..., @var{u_n}それぞれに対して
@var{d_k}を返し、
@code{fundamental_units(@var{d_k})}は
引数@var{d_1}, ..., @var{d_n}それぞれに対して
@var{u_k}を返します。


@code{remove_fundamental_units}は
@code{declare_fundamental_units}の効果を戻します。

@code{load("ezunits")}はこれらの関数をロードします。

例:

@c ===beg===
@c load ("ezunits") $
@c declare_fundamental_dimensions (money, cattle, happiness);
@c declare_fundamental_units (dollar, money, goat, cattle, smile, happiness);
@c dimensions (100 ` dollar/goat/km^2);
@c dimensions (x ` smile/kg);
@c fundamental_units (money*cattle/happiness);
@c ===end===
@example
(%i1) load ("ezunits") $
(%i2) declare_fundamental_dimensions (money, cattle, happiness);
(%o2)                         done
(%i3) declare_fundamental_units (dollar, money, goat, cattle, smile, happiness);
(%o3)                 [dollar, goat, smile]
(%i4) dimensions (100 ` dollar/goat/km^2);
                             money
(%o4)                    --------------
                                      2
                         cattle length
(%i5) dimensions (x ` smile/kg);
                            happiness
(%o5)                       ---------
                              mass
(%i6) fundamental_units (money*cattle/happiness);
0 errors, 0 warnings
                           dollar goat
(%o6)                      -----------
                              smile
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} dimensions (@var{x})
@deffnx {関数} dimensions_as_list (@var{x})

@code{dimensions}は
基礎次元の積と冪で構成された式として
次元量@var{x}の次元を返します。

@code{dimensions_as_list}は
それぞれの要素が@var{x}の次元に関して対応する基礎次元の冪を示す整数であるようなリストとして次元量@var{x}の次元を返します。


@code{load("ezunits")}はこれらの関数をロードします。

例:

@c ===beg===
@c load ("ezunits")$
@c dimensions (1000 ` kg*m^2/s^3);
@c declare_units (foo, acre*ft/hour);
@c dimensions (foo);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) dimensions (1000 ` kg*m^2/s^3);
                                2
                          length  mass
(%o2)                     ------------
                                 3
                             time
(%i3) declare_units (foo, acre*ft/hour);
                             acre ft
(%o3)                        -------
                              hour
(%i4) dimensions (foo);
                                   3
                             length
(%o4)                        -------
                              time
@end example

@c ===beg===
@c load ("ezunits")$
@c fundamental_dimensions;
@c dimensions_as_list (1000 ` kg*m^2/s^3);
@c declare_units (foo, acre*ft/hour);
@c dimensions_as_list (foo);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) fundamental_dimensions;
(%o2)  [length, mass, time, charge, temperature, quantity]
(%i3) dimensions_as_list (1000 ` kg*m^2/s^3);
(%o3)                 [2, 1, - 3, 0, 0, 0]
(%i4) declare_units (foo, acre*ft/hour);
                             acre ft
(%o4)                        -------
                              hour
(%i5) dimensions_as_list (foo);
(%o5)                 [3, 0, - 1, 0, 0, 0]
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} fundamental_units (@var{x})
@deffnx {関数} fundamental_units ()

@code{fundamental_units(@var{x})}は
@code{dimensions(@var{x})}が決定するように
@var{x}の基本次元に関連付けられた
単位を返します。

@var{x}は文字通り次元式@math{a ` b}か、
@code{declare_units}を介して宣言された単位を持つシンボルか
それらのいずれかもしくは両方を含む式かもしれません。

@code{fundamental_units()}は
@code{declare_fundamental_units}が宣言するように、
既知の基本単位すべてのリストを返します。


@code{load("ezunits")}はこの関数をロードします。

例:

@c ===beg===
@c load ("ezunits")$
@c fundamental_units ();
@c fundamental_units (100 ` mile/hour);
@c declare_units (aa, g/foot^2);
@c fundamental_units (aa);
@c ===end===
@example
(%i1) load ("ezunits")$
(%i2) fundamental_units ();
(%o2)                 [m, kg, s, A, K, mol]
(%i3) fundamental_units (100 ` mile/hour);
                                m
(%o3)                           -
                                s
(%i4) declare_units (aa, g/foot^2);
                                g
(%o4)                         -----
                                  2
                              foot
(%i5) fundamental_units (aa);
                               kg
(%o5)                          --
                                2
                               m
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@deffn {関数} dimensionless (@var{L})

次元量のリスト@var{L}から形成できる
無次元量の基底を返します。

@code{load("ezunits")}はこの関数をロードします。

例:

@c ===beg===
@c load ("ezunits") $
@c dimensionless ([x ` m, y ` m/s, z ` s]);
@c ===end===
@example
(%i1) load ("ezunits") $
(%i2) dimensionless ([x ` m, y ` m/s, z ` s]);
0 errors, 0 warnings
0 errors, 0 warnings
                               y z
(%o2)                         [---]
                                x
@end example

Dimensionless quantities derived from fundamental physical quantities.
Note that the first element on the list
is proportional to the fine-structure constant.

@c ===beg===
@c load ("ezunits") $
@c load ("physical_constants") $
@c dimensionless([%h_bar, %m_e, %m_P, %%e, %c, %e_0]);
@c ===end===
@example
(%i1) load ("ezunits") $
(%i2) load ("physical_constants") $
(%i3) dimensionless([%h_bar, %m_e, %m_P, %%e, %c, %e_0]);
0 errors, 0 warnings
0 errors, 0 warnings
                              2
                           %%e        %m_e
(%o3)                [--------------, ----]
                      %c %e_0 %h_bar  %m_P
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn

@c NEED TO FILL IN !!
@deffn {関数} natural_unit (@var{expr}, [@var{v_1}, ..., @var{v_n}])

@code{dimension(@var{expr}) = dimension(@var{v_1}^@var{e_1} ... @var{v_n}^@var{e_n})}であるような
指数@var{e_1}, ..., @var{e_n}を見つけます。

@code{load("ezunits")}はこの関数をロードします。

例:

@c ===beg===
@c ===end===
@example
@end example

@opencatbox
@category{Package ezunits}
@closecatbox

@end deffn


