diff --git a/Rules/Languages/zh/tw/SharedRules/calculus.yaml b/Rules/Languages/zh/tw/SharedRules/calculus.yaml index 20fcd91c..2b19609e 100644 --- a/Rules/Languages/zh/tw/SharedRules/calculus.yaml +++ b/Rules/Languages/zh/tw/SharedRules/calculus.yaml @@ -1,14 +1,29 @@ --- +- name: laplacian + tag: laplacian + match: "count(*) <= 1" # can be on ∇^2 or on enclosing mrow + replace: + - T: "LahPlahsian" # phrase('laplacian' of x) -- "LahPlahsian" sounds better with speech engines tested + - test: + if: "count(*) = 1" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # phrase(function 'of' one variable) -- note OneCore voices spell out "div" + - test: + if: "not(IsNode(*[1], 'leaf'))" + then: [pause: short] + - x: "*[1]" + - name: divergence tag: divergence - match: "." + match: "count(*) = 1" replace: - test: - if: "$Verbosity='Verbose'" - then: [t: "divergence"] # phrase('divergence' from the mean) - else: [t: "div"] # phrase('divergence' from the mean) - - t: "of" # phrase(systems 'of' linear equations) + if: "$Verbosity='Terse'" + then: [T: "div"] # phrase('div' is short for divergence) -- note OneCore voices spell out "div" + else: [T: "divergence"] # phrase('divergence of' this function from the mean) - test: if: "not(IsNode(*[1], 'leaf'))" then: [pause: short] @@ -16,9 +31,12 @@ - name: curl tag: curl - match: "." + match: "count(*) = 1" replace: - - t: "curl of" # phrase(the 'curl of' a field) + - T: "curl" # phrase(the 'curl of' a field) + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # phrase(function 'of' one variable) -- note OneCore voices spell out "div" - test: if: "not(IsNode(*[1], 'leaf'))" then: [pause: short] @@ -26,12 +44,12 @@ - name: gradient tag: gradient - match: "." + match: "count(*) = 1" replace: - test: if: "$Verbosity!='Terse'" - then: [t: "gradient of"] # phrase('divergence' from the mean) - else: [t: "del"] # phrase('divergence' from the mean) + then: [T: "gradient"] # phrase(the hill has a 'gradient of' five percent) + else: [T: "del"] # phrase(the delete key is labeled 'del') - test: if: "not(IsNode(*[1], 'leaf'))" then: [pause: short] diff --git a/Rules/Languages/zh/tw/SharedRules/default.yaml b/Rules/Languages/zh/tw/SharedRules/default.yaml index b127189d..5c02dcd7 100644 --- a/Rules/Languages/zh/tw/SharedRules/default.yaml +++ b/Rules/Languages/zh/tw/SharedRules/default.yaml @@ -10,6 +10,10 @@ - ClearSpeak_AbsoluteValue: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_AbsoluteValue='Auto', 'AbsEnd', $ClearSpeak_AbsoluteValue)" - ClearSpeak_Roots: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_Roots='Auto', 'RootEnd', $ClearSpeak_Roots)" - ClearSpeak_Matrix: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_Matrix='Auto', 'EndMatrix', $ClearSpeak_Matrix)" + + - MatchingPause: false() + # should be set at mtable level, but unknown intents make that impossible to know + - IsColumnSilent: false() replace: - test: if: "$MathRate = 100" @@ -38,7 +42,10 @@ match: "." replace: - bookmark: "@id" - - x: "translate(., $BlockSeparators, '')" # remove digit block separators + - test: + - if: "@data-roman-numeral" + then: [SPELL: "text()", pause: "short"] + else: [x: "translate(., $BlockSeparators, '')"] # remove digit block separators - name: default tag: [mo, mtext] @@ -53,9 +60,11 @@ replace: - bookmark: "@id" - test: - if: "string-length(.) = 1 and text() != '_'" # need unicode.tdl to kick in for single letter tokens + - if: "string-length(.) = 1 and text() != '_'" # need unicode.tdl to kick in for single letter tokens then: [x: "text()"] - else: [x: "translate(., '-_', ' ')" ] # from intent literals + - else_if: "@data-chem-element or @data-roman-numeral" # NavMode=Character needs this + then: [SPELL: "text()", pause: "short"] + else: [x: "translate(., '-_\u00A0', ' ')"] # from intent literals or from extra spaces added (which get deleted) - name: default tag: ms @@ -101,7 +110,9 @@ then: [pause: short] - x: "*[1]" - pause: short - - T: "結束分數" # phrase("start of fraction x over y 'end over'") + - test: + if: "$Impairment = 'Blindness'" + then: [T: "結束分數"] # phrase("start of fraction x over y 'end over'") - pause: medium @@ -120,8 +131,8 @@ - x: "*[1]" - pause: short - test: - if: "not(IsNode(*[1],'leaf'))" - then: [T: "結束根號"] # phrase("root of x 'end root symbol'") + if: "not(IsNode(*[1],'leaf')) or $Impairment = 'Blindness'" + then: [T: "結束根號", pause: medium] # phrase("root of x 'end root symbol'") # not sure what really should be said for these since we should not assume they are square roots - name: literal-default @@ -135,9 +146,6 @@ - x: "*[2]" - T: "根號" - pause: short - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # phrase("the root 'of' x") - x: "*[1]" - pause: short - test: @@ -156,23 +164,35 @@ - name: no-end-sub tag: indexed-by - # invisible comma -- want "x 1 when subscript is an integer" - match: "count(*)=2 and (IsNode(*[2], 'leaf') or *[2][self::m:mrow][*[2][.='⁣']])" + match: "count(*)=2 and *[2][self::m:mrow and *[2][.='⁣']]" replace: - x: "*[1]" - - test: - if: "$Verbosity!='Terse' or not(*[2][self::m:mn])" # just say "x 1" for terse vs "x sub 1" - then: [T: "下標"] # phrase(x 'sub' 2) + - T: "下標" # phrase(x 'sub' 2) + - x: "*[2]" + - pause: short + +- name: power-indexed-by + tag: power-indexed-by + match: "." + replace: + - x: "*[1]" + - T: "下標" # phrase(x 'sub' 2) - x: "*[2]" + - pause: short + +# otherwise let definitions/default infix handle it - name: literal tag: msub match: "." replace: - x: "*[1]" - - T: "下標" # phrase(x 'sub' 2) + - test: + if: "not($Verbosity='Terse' and *[2][self::m:mn and not(translate(., '.,', '')!=.)])" # just say "x 1" for terse vs "x sub 1" + then: [T: "下標"] # phrase(x 'sub' 2) - x: "*[2]" + - name: literal tag: [msup, msubsup] match: "." @@ -192,12 +212,18 @@ - T: "上標" # phrase(x 'super' 2) - x: "*[last()]" - test: - if: "not(IsNode(*[last()], 'simple'))" + if: "not(IsNode(*[last()], 'simple')) or $Impairment = 'Blindness'" then: [T: "結束上標"] # phrase(x super 2 'end of super') else: - - T: "的" # phrase(5 'raised to the' second power equals 25) + - test: + if: "$Verbosity='Verbose'" + then: [T: "上標"] + else: [T: "上標"] - x: "*[last()]" - - T: "次方" # phrase(5 raised to the second 'power' equals 25) + - test: + if: "$Verbosity='Verbose'" + then: [T: "結束上標"] + else: [T: "結束上標"] - name: default tag: munder @@ -213,7 +239,7 @@ - name: diacriticals tag: mover - match: "*[1][self::m:mi] and *[2][translate(., '\u0306\u030c.\u00A8\u02D9\u20DB\u20DC`^~→¯_', '')='']" + match: "*[1][self::m:mi] and *[2][translate(., '\u0306\u030c.\u00A8\u02D9\u20DB\u20DC`^ˇ~→¯_', '')='']" replace: - x: "*[1]" - x: "*[2]" @@ -224,11 +250,9 @@ replace: - test: if: "not(IsNode(*[1], 'leaf'))" - then: [T: ""] # phrase(phrase(x 'modified' with y above it) + then: [T: ""] # phrase(phrase(the 'quantity' x plus 1 with y above it) - x: "*[1]" - - test: - if: "$Verbosity='Verbose'" - then: [T: "上層"] + - T: "上層" # phrase(x modified 'with' y above it) - x: "*[2]" - T: "" # phrase(x modified 'with' y above it) @@ -238,11 +262,9 @@ replace: - test: if: "not(IsNode(*[1], 'leaf'))" - then: [T: ""] # phrase(the equation has been 'modified') + then: [T: ""] # phrase(the 'quantity' x plus 1 with y above it) - x: "*[1]" - - test: - if: "$Verbosity='Verbose'" - then: [T: "下層"] + - T: "下層" # phrase(x modified 'with' y above it) - x: "*[2]" - T: "上層" # phrase(x modified with y 'below and' y above it) - x: "*[3]" @@ -415,7 +437,7 @@ - T: "與" # phrase(the table with 3 rows 'and' 4 columns) - x: "$NumColumns" - test: - if: "$NumColumns" + if: "NumColumns=1" then: [T: "行"] # phrase(the table with 3 rows and 1 'column') else: [T: "行"] # phrase(the table with 3 rows and 4 'columns') - pause: long @@ -607,7 +629,6 @@ - pause: auto - x: "*[position() > 1]" - # Here are the intent hints that need to be handled: 'prefix' | 'infix' | 'postfix' | 'function' | 'silent' - name: silent-intent # uncaught intent -- the args have been inserted in the order of speech @@ -620,6 +641,13 @@ then: [pause: short] else: [pause: auto] +- name: nofix-intent + # uncaught intent -- the args have been inserted in the order of speech + tag: "*" + match: "contains(@data-intent-property, ':nofix:') " + replace: + - x: "SpeakIntentName(name(.), $Verbosity, 'nofix')" + - name: prefix-intent # uncaught intent -- the args have been inserted in the order of speech tag: "*" @@ -679,7 +707,7 @@ replace: - x: "SpeakIntentName(name(.), $Verbosity, 'function')" - test: - if: "not(contains(@data-intent-property, ':literal:')) and + if: "$Verbosity != 'Terse' and not(contains(@data-intent-property, ':literal:')) and not(count(*)=2 and (IsInDefinition(*[1], 'TrigFunctionNames') or IsInDefinition(name(.), 'TerseFunctionNames')) and IsNode(*[2], 'simple'))" then: [T: "", pause: auto] # phrase(sine 'of' 5) - insert: @@ -690,6 +718,7 @@ then: [x: "','"] - pause: auto - test: + # speak "end ..." if not bracketed or last child is not simple and not last node if: "$Impairment = 'Blindness' and not(*[last()][IsBracketed(., '', '') or IsNode(., 'simple')] )" then: [x: "GetBracketingIntentName(name(.), $Verbosity, 'function', 'end')"] - test: @@ -698,7 +727,6 @@ else: [pause: auto] - - name: default-text # unknown leaf -- just speak the text -- could be a literal intent tag: "*" diff --git a/Rules/Languages/zh/tw/SharedRules/general.yaml b/Rules/Languages/zh/tw/SharedRules/general.yaml index 070289ee..761243ab 100644 --- a/Rules/Languages/zh/tw/SharedRules/general.yaml +++ b/Rules/Languages/zh/tw/SharedRules/general.yaml @@ -213,6 +213,14 @@ - T: "項目" # phrase(the square root 'of' 25 equals 5) - x: "*[2]" +- name: repeating-decimal + tag: repeating-decimal + match: "." + replace: + - x: "*[1]" + - T: "重複數字" # phrase('with repeating digits') + - SPELL: "*[2]" + - name: msubsup-skip-super # handles single, double, etc., prime tag: [skip-super, say-super] @@ -225,7 +233,7 @@ else: [T: "下標"] # phrase(the result is 'sub' optimal) - x: "*[2]" - test: - if: "not(IsNode(*[2],'leaf'))" + if: "not(IsNode(*[2],'leaf') and $Impairment = 'Blindness')" then: - test: if: "$Verbosity='Verbose'" @@ -244,6 +252,13 @@ - x: "*[3]" - pause: short +# in terse mode, we just say "m" or "s", etc., not meters or seconds +- name: unit-terse + tag: unit + match: "$Verbosity = 'Terse' and string-length(.)=1" + replace: + - bookmark: "@id" + - SPELL: "text()" # the order of matching is # 1. does it match the base of an SI unit @@ -329,6 +344,24 @@ then: [x: "concat('\uF8FE', DefinitionValue($Word, 'Speech', 'PluralForms'))"] else: [x: "concat('\uF8FE', $Word)"] +# need to reverse the order of speech: $ 3 -> 3 dollars +- name: currency + tag: mrow + match: "count(*)=3 and DefinitionValue(*[1], 'Speech', 'CurrencySymbols') != ''" + variables: + # If the amount is singular, we don't add the plural ending. + - IsSingular: "*[3][self::m:mn and .=1] and *[2]='\u2062'" + - CurrencyWord: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')" + replace: + - bookmark: "*[3]/@id" + - x: "*[3]" + - test: + - if: "$IsSingular" + then: [x: "$CurrencyWord"] + - else_if: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms') != ''" + then: [x: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms')"] + else: [x: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')", CT: ""] + - name: sin tag: mi match: ".='sin'" @@ -436,10 +469,31 @@ then: [T: "cotanch"] # phrase('cotanch' is shorthand for hyperbolic cotangent) else: [T: "hyperbolic cotangent"] # phrase(the 'hyperbolic cotangent' is a mathematical function) +- name: exponential + tag: mi + match: ".='exp'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: "exp"] # phrase('exp' means exponential function) + else: [T: "exponential"] # phrase('exponential' function) + +- name: covariance + tag: mi + match: ".='Cov'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: "Cov"] # phrase('Cov' is shorthand for the covariance function) + else: [T: "covariance"] # phrase('covariance' function) + + - name: log # handle both log and ln (if in an mrow, 'intents' are used) tag: mi - match: ".= 'log' or .= 'ln'" + match: ".='log' or .='ln'" replace: - bookmark: "@id" - test: @@ -459,8 +513,9 @@ match: "." variables: # Wikipedia has some tables where all the entire first column is empty (e.g., https://en.wikipedia.org/wiki/List_of_trigonometric_identities) - - LineCountTry: "count(*/*[1][count(*)=1 and *[1][@data-added!='missing-content']])" - - LineCount: "IfThenElse($LineCountTry=0, count(*/*[1]), $LineCountTry)" + - LineCount: "count(*[not(contains(@data-intent-property, ':continued-row:'))])" + - NextLineIsContinuedRow: "false()" # default value + - IsColumnSilent: true() replace: - x: "$LineCount" - test: @@ -474,36 +529,34 @@ then: [CT: ""] # plural - pause: short - x: "*" + - pause: long - name: default-multiline tag: [mtr, mlabeledtr] match: "parent::m:piecewise or parent::m:system-of-equations or parent::m:lines" + variables: [NextLineIsContinuedRow: "following-sibling::*[1][contains(@data-intent-property, ':continued-row:')]"] replace: - test: - if: "parent::m:system-of-equations and *[1][count(*)=1 and *[1][@data-added='missing-content']] and - count(*/*[1][count(*)=1 and *[1][@data-added!='missing-content']]) != 0" + if: "not($LineCount=1 or contains(@data-intent-property, ':continued-row:'))" then: - - T: "下一列" - else_test: - if: "$LineCount != 1" - then: - - pause: medium - - test: - - if: "parent::m:piecewise" - then: [T: "情況"] # phrase('case' 1 of 10 cases) - - else_if: "parent::m:system-of-equations" - then: [T: "方程"] # phrase('equation' 1 of 10 equations) - else: [T: "列"] # phrase('line 1 of 10 lines) - - x: "count(preceding-sibling::*)+1" - + - pause: medium + - test: + - if: "parent::m:piecewise" + then: [T: "情況"] # phrase('case' 1 of 10 cases) + - else_if: "parent::m:system-of-equations" + then: [T: "方程"] # phrase('equation' 1 of 10 equations) + else: [T: "列"] # phrase('line 1 of 10 lines) + - x: "count(preceding-sibling::*[not(contains(@data-intent-property, ':continued-row:'))]) + 1" - test: - if: .[self::m:mlabeledtr] + if: "self::m:mlabeledtr" then: - T: "帶有標籤" # phrase(the diagram is complete 'with label') - x: "*[1]/*" - - pause: medium - test: - if: .[self::m:mlabeledtr] + if: "not(contains(@data-intent-property, ':continued-row:'))" + then: [pause: medium] + - test: + if: "self::m:mlabeledtr" then: [x: "*[position()>1]"] else: [x: "*"] @@ -512,20 +565,25 @@ match: "parent::*[parent::m:piecewise or parent::m:system-of-equations or parent::m:lines]" variables: [LongPause: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultiLinePausesBetweenColumns = 'Long'"] replace: - - x: "*" - test: - # short pause after each element; medium pause if last element in a row; long pause for last element in matrix unless ClearSpeak override - - if: "count(following-sibling::*) > 0" - then_test: - if: "$LongPause" - then: [pause: medium] - else: [pause: short] - - else_if: "count(../following-sibling::*) > 0" + if: "IsInDefinition(*[1], 'ComparisonOperators')" + then: [pause: short] + - test: + if: "*[1][@data-added!='missing-content']" + then: [x: "*"] + - test: + # no pause after each element; medium pause if last element in a row; long pause for last element in matrix unless ClearSpeak override + - if: "count(following-sibling::*) = 0 and not($NextLineIsContinuedRow)" then_test: - if: "$LongPause" - then: [pause: long] - else: [pause: medium] - else: [pause: long] + if: "count(../following-sibling::*) > 0" + then_test: + if: "$LongPause" + then: [pause: long] + else: [pause: medium] + else_test: + if: "IsInDefinition(*[1], 'ComparisonOperators')" + then: [pause: short] + else: [pause: auto] # Matrix/Determinant rules # matrix and determinant are the same other than "matrix"/"determinant" based on the bracketing chars @@ -546,6 +604,58 @@ - T: "成員" # phrase(the 2 by 2 matrix 'with entry' x) - x: "*[1]/*" +# simpler reading methods for special case matrices +- name: zero-matrix + tag: matrix + # select all the non-zero entries -- if there are none of them, then it is a zero matrix + match: "not( */*/*[not(self::m:mn and .= 0)] )" + replace: + - T: "" # phrase('the' 1 by 2 matrix M) + - x: count(*) + - T: "乘" # phrase(the 1 'by' 2 matrix) + - x: count(*[self::m:mtr][1]/*) + - T: "零矩陣" # phrase(the 2 by 2 'zero matrix') + - pause: long + +- name: identity-matrix + tag: matrix + # every diagonal entry must be a literal 1, and every off-diagonal entry must be a literal 0 + match: + - "count(*) = count(*[1]/*) and " # matrix is square + - "not( */*[count(preceding-sibling::*) = count(../preceding-sibling::*)]/*[not(self::m:mn and .= 1)] ) and " # on-diagonal + - "not( */*[count(preceding-sibling::*) != count(../preceding-sibling::*)]/*[not(self::m:mn and .= 0)] )" # off-diagonal + replace: + - T: "" # phrase('the' 1 by 2 matrix M) + - x: count(*) + - T: "乘" # phrase(the 1 'by' 2 matrix) + - x: count(*[self::m:mtr][1]/*) + - T: "單位矩陣" # phrase(the 2 by 2 'identity matrix') + - pause: long + +- name: diagonal-matrix + tag: matrix + # select all the non-zero entries...if they are not on the diagonal + # if there are any of them, then this isn't an identity matrix + match: + - "count(*) = count(*[1]/*) and " + - "not( */*/*[not(self::m:mn and .= 0)]" + - " [count(../preceding-sibling::*)!=count(../../preceding-sibling::*)]" + - " )" + replace: + - T: "" # phrase('the' 1 by 2 matrix) + - x: count(*) + - T: "乘" # phrase(the 1 'by' 2 matrix) + - x: count(*[self::m:mtr][1]/*) + - T: "對角矩陣" # phrase(the 2 by 2 'diagonal matrix') + - pause: long + - insert: + # this lists the diagonal 'mtd's to be read, and they say "column nnn" before reading the contents + # there seems to be an xpath bug -- without the parens, the match fails for the + # test Languages::en::mtable::diagonal_matrix due to match failure (the third matching element seems to be missing) + nodes: "(*/*/*[not(self::m:mn and .= 0)]/..)" + replace: [pause: auto] + - pause: long + # simpler reading methods for smaller matrices if the entries are simple - name: 2-or-3x1-matrix tag: matrix @@ -658,7 +768,11 @@ - test: if: "self::m:determinant" then: [T: "行列式"] # phrase(the 2 by 2 'determinant') - else: [T: "矩陣"] # phrase(the 2 by 2 'matrix') + else: + - test: + if: "@columnlines and (contains(normalize-space(@columnlines), 'solid') or contains(normalize-space(@columnlines), 'dashed'))" + then: [T: "增廣矩陣"] # phrase(the 2 by 2 'augmented matrix') + else: [T: "矩陣"] # phrase(the 2 by 2 'matrix') - pause: long - x: "*" - test: @@ -682,7 +796,11 @@ - test: if: "self::m:determinant" then: [T: "行列式"] # phrase(the 2 by 2 'determinant') - else: [T: "矩陣"] # phrase(the 2 by 2 'matrix') + else: + - test: + if: "@columnlines and (contains(normalize-space(@columnlines), 'solid') or contains(normalize-space(@columnlines), 'dashed'))" + then: [T: "增廣矩陣"] # phrase(the 2 by 2 'augmented matrix') + else: [T: "矩陣"] # phrase(the 2 by 2 'matrix') - pause: long - x: "*" - test: @@ -695,7 +813,6 @@ else: [T: "矩陣"] # phrase(the 2 by 2 'matrix's) - name: chemistry-msub - tag: [chemical-formula] match: "*[1][.='msub']" replace: @@ -708,6 +825,16 @@ then: [T: "下標"] # phrase(H 'sub' 2) - x: "*[3]" +- name: dimension-by + tag: mrow + match: dimension-product + replace: + - insert: + nodes: "*" + replace: [T: "乘", pause: auto] # phrase(3 'by' 5 matrix) + + + - name: chemistry-msup tag: [chemical-formula] match: "count(*)=3 and *[1][.='msup']" diff --git a/Rules/Languages/zh/tw/SharedRules/geometry.yaml b/Rules/Languages/zh/tw/SharedRules/geometry.yaml index 85a6c6ba..f7040441 100644 --- a/Rules/Languages/zh/tw/SharedRules/geometry.yaml +++ b/Rules/Languages/zh/tw/SharedRules/geometry.yaml @@ -57,3 +57,23 @@ - x: "*[2]" - x: "*[3]" + +- name: coordinate + tag: coordinate + match: "." + replace: + - test: + if: "$Verbosity='Verbose'" + then: [OT: ""] # phrase('the' point at 1, 2) + - T: "點" # phrase(the 'point' at 1, 2) + - test: + if: "$Verbosity='Verbose'" + then: [T: "在"] # phrase('the' point at 1, 2) + - pause: short + - insert: + nodes: "*" + replace: [T: "逗號", pause: auto] # phrase(f of x 'comma' y) + - pause: short + - test: + if: "($SpeechStyle='ClearSpeak' and $Verbosity='Verbose') or not(IsNode(*[last()],'leaf'))" + then: [T: "結束點"] # phrase(start point, 'end point') diff --git a/Rules/Languages/zh/tw/SharedRules/linear-algebra.yaml b/Rules/Languages/zh/tw/SharedRules/linear-algebra.yaml index 49f7587d..e02baecd 100644 --- a/Rules/Languages/zh/tw/SharedRules/linear-algebra.yaml +++ b/Rules/Languages/zh/tw/SharedRules/linear-algebra.yaml @@ -15,27 +15,9 @@ - T: "" # phrase(systems 'of' linear equations) - x: "*[1]" - test: - if: "not(IsNode(*[1], 'simple'))" + if: "not(IsNode(*[1], 'simple')) and $Impairment = 'Blindness'" then: [T: "結束行列式"] # phrase('end determinant' of a matrix) -- name: norm - tag: norm - match: "count(*)=1" - replace: - - test: - if: "$Verbosity='Verbose'" - then: - - T: "" # phrase('the' square root of 25 equals 5) - - x: "*[1]" - - test: - if: "$Verbosity!='Terse'" - then: - - T: "的" # phrase(this is the mean 'of' the data) - - T: "範數" # phrase(the 'norm' can be a measure of distance) - #- test: - # if: "not(IsNode(*[1], 'simple'))" - # then: [t: "結束範數"] # phrase('end norm' that is a measure of distance) - - name: subscripted-norm tag: subscripted-norm @@ -45,77 +27,10 @@ if: "$Verbosity='Verbose'" then: - T: "" # phrase('the' square root of 25 equals 5) - - x: "*[1]" - - test: - if: "$Verbosity!='Terse'" - then: - - T: "的" # phrase(systems 'of' linear equations) - x: "*[2]" - - T: "範數" # phrase(the 'norm' can be a measure of distance) - -- name: transpose - tag: transpose - match: "count(*)=1" - replace: - - x: "*[1]" - - T: "的 轉置" # phrase(this will 'transpose' the values) -- name: trace - tag: trace - match: "count(*)=1" - replace: - - test: - if: "$Verbosity='Verbose'" - then: - - T: "" # phrase('the' square root of 25 equals 5) - - x: "*[1]" - - test: - if: "$Verbosity!='Terse'" - then: - - T: "的" # phrase(systems 'of' linear equations) - - T: "跡" # phrase('trace' of a matrix) - -- name: dimension - tag: dimension - match: "count(*)=1" - replace: - - test: - if: "$Verbosity='Verbose'" - then: - - T: "" # phrase('the' square root of 25 equals 5) - - x: "*[1]" + - T: "norm" # phrase(the 'norm' can be a measure of distance) - test: if: "$Verbosity!='Terse'" then: - - T: "的" # phrase(systems 'of' linear equations) - - T: "維數" # phrase(the 'dimension' of the matrix) - -- name: homomorphism - tag: homomorphism - match: "count(*)=1" - replace: - - test: - if: "$Verbosity='Verbose'" - then: - - T: "" # phrase('the' square root of 25 equals 5) - - x: "*[1]" - - test: - if: "$Verbosity!='Terse'" - then: - - T: "的" # phrase(systems 'of' linear equations) - - T: "同態" # phrase('homomorphism' indicates similarity of form) - -- name: kernel - tag: kernel - match: "count(*)=1" - replace: - - test: - if: "$Verbosity='Verbose'" - then: - - T: "" # phrase('the' square root of 25 equals 5) + - T: "" # phrase(systems 'of' linear equations) - x: "*[1]" - - test: - if: "$Verbosity!='Terse'" - then: - - T: "的" # phrase(systems 'of' linear equations) - - T: "核" # phrase(this is the 'kernel' of the function) - diff --git a/Rules/Languages/zh/tw/SimpleSpeak_Rules.yaml b/Rules/Languages/zh/tw/SimpleSpeak_Rules.yaml index 7877cb2e..af8eed96 100644 --- a/Rules/Languages/zh/tw/SimpleSpeak_Rules.yaml +++ b/Rules/Languages/zh/tw/SimpleSpeak_Rules.yaml @@ -1,4 +1,18 @@ --- +- name: pause + tag: "!*" + match: "not(self::m:math) and not($MatchingPause) and @data-intent-property[contains(., ':pause')]" + replace: + - with: + variables: [MatchingPause: "true()"] + replace: + - test: + - if: "contains(@data-intent-property, ':pause-long')" + then: [pause: long] + - else_if: "contains(@data-intent-property, ':pause-short')" + then: [pause: short] + else: [pause: medium] + - x: "." - name: intent-literal-silent tag: [mi, mo, mn] @@ -26,32 +40,28 @@ - test: if: "$Verbosity!='Terse'" then: [T: ""] # phrase(the square root 'of' x) - else: [pause: short] + else: [pause: short] # pause: short - test: - if: IsNode(*[1], 'leaf') - then: [pause: short] - else: [T: "結束根號", pause: medium] # phrase(start the square root of x 'end of root') + if: "not(IsNode(*[1], 'leaf')) and $Impairment = 'Blindness'" + then: [T: "結束根號", pause: medium] # phrase(start the square root of x 'end of root') + else: [pause: short] - name: default tag: root match: "." replace: - - T: "" - x: "*[1]" - test: if: "$Verbosity!='Terse'" then: [T: "的"] # phrase(the square root 'of' x) - test: - if: "*[2][self::m:mn]" + if: "*[2][self::m:mn and not(contains(., '.'))]" then_test: - if: "*[2][.='2']" then: [T: "平方根"] # phrase(the 'square root' of x) - else_if: "*[2][.='3']" then: [T: "立方根"] # phrase(the 'cube root' of x) - - else_if: "*[2][not(contains(., '.'))]" - then: [x: "*[2]", T: "次方根"] # phrase(the square 'root' of x) - - else: [x: "*[2]", T: "次方根"] - + - else: [x: "*[2]", T: "次方根"] # phrase(the square 'root' of 25) else: - test: if: "*[2][self::m:mi][string-length(.)=1]" @@ -63,19 +73,28 @@ # Fraction rules # Mixed numbers mostly "just work" because the invisible char reads as "and" and other parts read properly on their own -#- name: common-fraction -# tag: fraction -# match: -# - "*[1][self::m:mn][not(contains(., '.')) and text()<20] and" -# - "*[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]" -# replace: [x: ToCommonFraction(.)] -#- name: common-fraction-mixed-number -# tag: fraction -# match: -# - "preceding-sibling::*[1][self::m:mo][.='⁤'] and" # preceding element is invisible plus -# - "*[1][self::m:mn][not(contains(., '.'))] and" -# - "*[2][self::m:mn][not(contains(., '.'))]" -# replace: [x: ToCommonFraction(.)] +- name: common-fraction + tag: fraction + match: + - "*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - "*[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]" + variables: [IsPlural: "*[1]!=1"] + replace: + - x: "*[2]" + - T: "分之" + - x: "*[1]" # extra args specify fractional ordinal and whether it is plural + +- name: common-fraction-mixed-number + tag: fraction + match: + - "preceding-sibling::*[1][self::m:mo][.='⁤'] and" # preceding element is invisible plus + - "*[1][self::m:mn][not(contains(., '.'))] and" + - "*[2][self::m:mn][not(contains(., '.'))]" + replace: + - x: "*[2]" + - T: "分之" + - x: "*[1]" # extra args specify fractional ordinal and whether it is plural + # Units (e.g., meters per second, m^2/s^2, (3m^2)/s) - name: per-fraction @@ -86,9 +105,9 @@ - " *[1][self::m:mn] and *[2][.='\u2062'] and BaseNode(*[3])[contains(@data-intent-property, ':unit')] ) ] and" - "BaseNode(*[2])[contains(@data-intent-property, ':unit')] " replace: - - t: "每" # phrase('5 meters 'per' second) - - x: "*[2]" - x: "*[1]" + - T: "每" # phrase('5 meters 'per' second) + - x: "*[2]" - name: simple # don't include nested fractions. E.g, fraction a plus b over c + 1 end fraction" is ambiguous @@ -272,6 +291,7 @@ - name: times tag: mo match: + # say "times" when invisible times is followed by parens or a superscript that has a base with parens or "|"s # added: say times is the superscript is not simple # if we aren't sure if it is times or not, don't say anything - ".='⁢' and" @@ -280,15 +300,15 @@ - " following-sibling::*[1][" - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|') or " - " self::m:matrix or self::m:determinant or self::m:binomial or" # followed by parens - - " ( (self::m:msub or self::m:msubsup or - ((self::m:msup or self::m:power) and not(IsNode(*[1], 'leaf') and *[2][self::m:mn and (.=2 or '.=3')]))) and " # followed by msup, etc. - - " (*[1][self::m:mrow[IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')] or " - - " self::m:matrix or self::m:determinant] or" # base has parens - - " not(IsNode(*[2], 'simple')) or " - - " (self::m:msubsup and not(IsNode(*[3], 'simple'))))" - - " )" - - " ]" - # other possibility is the preceding element has parens (but not the following) + - " self::m:square-root or self::m:msqrt or self::m:root or self::m:mroot or" + - " (self::m:msub or self::m:msubsup or" + - " ((self::m:msup or self::m:power) and not(IsNode(*[1], 'leaf') and *[2][self::m:mn and (.=2 or '.=3')]))) and " # followed by msup, etc. + - " (*[1][self::m:mrow[IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')] or " + - " self::m:matrix or self::m:determinant] or" # base has parens + - " not(IsNode(*[2], 'simple')) or " + - " (self::m:msubsup and not(IsNode(*[3], 'simple')))" + - " )" + - " ]" # other possibility is the preceding element has parens (but not the following) - " or " - " preceding-sibling::*[1][" - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')]" # followed by parens @@ -303,6 +323,7 @@ - " not(self::m:math) ] and " # rule out [x] standing alone - "( IsBracketed(., '(', ')') or IsBracketed(., '[', ']') ) and " - "( IsNode(*[2], 'simple') ) and" + - "not(preceding-sibling::*[1][.='\u2062' and @data-function-guess]) and" - "not(ancestor-or-self::*[contains(@data-intent-property, ':literal:')])" # missing clause: 'a positive fraction that is spoken as an ordinal # (either by the Ordinal preference or by the default rules_' diff --git a/Rules/Languages/zh/tw/definitions.yaml b/Rules/Languages/zh/tw/definitions.yaml index 280ec603..d5857679 100644 --- a/Rules/Languages/zh/tw/definitions.yaml +++ b/Rules/Languages/zh/tw/definitions.yaml @@ -1,14 +1,8 @@ --- - include: "../../../definitions.yaml" -# Lines starting with "#" are a comment -# Each definition in this file is of the form -# - name: { "...", "..." "..." } -# For numbers, -# - name: [] "...", "..." "..." ] - -# If an "intent" is used, the 'terse:medium:verbose' speech for the intent name is given here for a prefix||infix||postfix||function fixity -# If only one ":" is used, it the first part is used for 'terse' and the second part is used for 'medium' and 'verbose' +# If an "intent" is used, the 'terse:medium:verbose' speech for the intent name is given here for a prefix||infix||postfix||function||nofix||silent fixity +# If only one ":" is used, the first part is used for 'terse' and the second part is used for 'medium' and 'verbose' # If no ":"s are used, the same speech is used for all forms # If bracketing words make sense, they are separated with ";"s # Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign @@ -16,38 +10,313 @@ # for readability, spaces can be used around any of the delimiter characters # Note: if there are multiple fixities, the first one is used if the fixity is not given in the intent - IntentMappings: { + "binomial": "infix=; 選; ", + + ### Functions and Inverses + # "closed-interval": "other=closed-interval; from,to; end closed-interval", + # "closed-interval":"function=closed interval between; and", #NOTE: Check test, does not follow this pattern + #"closed-open-interval":"function=interval between; included and", + #"open-closed-interval":"function=interval between; and included", + #"open-interval":"function=open interval between; and", + "inverse":"function=inverse || postfix=inverse", + + "domain": "function= ; domain", + "codomain": "function= ; codomain", + + "image":"function=image", + #"fraction":"function=fraction; over; end fraction", # NOTE: Fails + "mixed-fraction":"infix=and", # NOTE: in website says function, but follow infix speech pattern. + "quotient":"function=integer part; divided by", # NOTE: Logic somewhere here failing, becomes "divided by of x comma, y" instead of "integer part of x divided by y" + "evaluated-at":"infix=evaluated at", + "remainder":"function=the remainder; divided by", + + "max":"function=max", + "min":"function=min", + + "power":"infix=to the power", + "root":"function=root", + + "greatest-common-divisor": "function=gcd: the gcd: the greatest common divisor", + "least-common-multiple":"function=lcm: the lcm: the least common multiple", # In webpage typo "lest common" + + "absolute-value": "function= ; absolute value: the absolute value: the absolute value; end absolute value", + "complex-conjugate":"function=complex conjugate", + "complex-arg":"function=arg", + "real-part": "function=the real part", + "imaginary-part": "function=imaginary part: the imaginary part: the imaginary part", + + "polar-coordinate":"function=polar coordinate; comma", + "spherical-coordinate":"function=spherical coordinate; comma; comma", + "cartesian-coordinate":"function=cartesian coordinate; comma", + "coordinate":"function=coordinate; comma", + "floor":"function=floor", + "ceiling":"function=ceiling", + "round":"function=rounded-value", + "fractional-part":"function=fractional part", + + + ### Calculus + # "definite-integral":"function=integral over || function=integral from; to", # Property ??? + # "derivative":"function=the derivative; with respect to", # Property ??? + # "partial-derivative":"function=partial", ## Note, included with infix, but separately under calculus tab has ??? for functionality + + "limit": "prefix=極限", + "tends-to":"infix=tends to", + "tends-to-from-above":"infix=tends to from above", + "tends-to-from-below":"infix=tends to from below", + + + ### Sets + "set": "function= ; set: the set", + "set-difference":"function=set difference; and || infix=minus", # NOTE: not tested + "complement":"function=complement", + #"empty-set":"nofix=empty set", + "cardinality":"function=cardinality", # NOTE: does not have a defined speech template in website + "list":"function=list", + "tuple": "function= ; tuple: the tuple", + + + ### Sequence and Series + "sum":"function= ; sum over : sum ; ", #: sum over : sum from; to", + "product":"function=product || function=product over || function=product from; to", + + + ### Elementary classical functions + "sine":"function=sin: sine", + "cosine":"function=cos: cosine", + "tangent":"function=tan: tangent", + "secant":"function=seech: secant", + "cosecant":"function=co-seech: cosecant", + "cotangent":"function=co-tan: cotangent", + + "arcsine":"function=arcsine", + "arccosine":"function=arccosine", + "arctangent":"function=arctangent", + "arcsecant":"function=arcsecant", + "arccosecant":"function=arc-cosecant", + "arccotangent":"function=arc-cotangent", + + "hyperbolic-sine":"function=shine", + "hyperbolic-cosine":"function=cosh", + "hyperbolic-tangent":"function=tanch", + "hyperbolic-secant":"function=sech", + "hyperbolic-cosecant":"function=cosech", + "hyperbolic-cotangent":"function=coth", + + "arc-hyperbolic-sine":"function=arc shine", + "arc-hyperbolic-cosine":"function=arc cosh", + "arc-hyperbolic-tangent":"function=arc tanch", + "arc-hyperbolic-secant":"function=arc sech", + "arc-hyperbolic-cosecant":"function=arc cosech", + "arc-hyperbolic-cotangent":"function=arc coth", + + "exponential":"function=exponential", + "natural-logarithm": "function=l n: natural log: natural log", + "logarithm":"function=log", ##Check arity 2 + + + ### Statistics and Probability + "mean":"function=mean", + "standard-deviation":"function=standard deviation", + "variance":"function=variance", + "median":"function=median", + "mode":"function=mode", + + "conditional-probability":"function=probability; given", # NOTE: Check test + + + ### Linear Algebra + "vector": "function= ; 向量 || prefix=向量", # prefix not tested, also prefix not on webpage + "matrix":"function=matrix", # NOTE: Failing test, recheck + "determinant":"function=determinant", + "adjugate":"function=adjugate", + "magnitude":"function=magnitude", + "norm": "function=; norm: norm: norm; 結束 norm", + "span":"function=span", + + "unit-vector":"prefix=unit vector", + + "identity-matrix":"nofix=identity matrix", # NOTE: no function specified + "transpose":"function=transpose || postfix= transpose", # postfix needs testing + "dimensional-product":"infix=by", # INFIX + + + ### Constants and Sets + "set-of-integers":"nofix=ℤ: set of all integers", + "set-of-reals":"nofix=ℝ: set of all real numbers", + "set-of-rationals":"nofix=ℚ: set of all rational numbers", + "set-of-natural-numbers":"nofix=ℕ: set of all natural numbers", + "set-of-complex-numbers":"nofix=ℂ: set of all complex numbers", + "set-of-primes":"nofix=ℙ: set of all prime numbers", + + + ### Geometry + "line-segment":"prefix=line segment", + "directed-line-segment":"prefix=directed line segment", + "line":"prefix=line", + "ray":"prefix=ray", + "arc":"prefix=arc", + + "length":"function=length", + "area":"function=area", + + "point":"prefix=point", ## NOTE: Has ??? for property in site. Should it be prefix? Or something else. + + ### Separators + "time-separator":"infix=", + + ### General Concepts + "fenced-group":"function=fenced-group", # appears both under general concepts and grouping + # NOTE: in site mentions "the pair x and y", due to being defined as function, needs the "of" keyword + "ordered-pair": "function= ; the pair; and", # Needs to be tested, test converts "and" to "comma," "indexed-by": "infix= ; 下標; 結束下標", + # "indexed-by": "infix= ; indexed by; ", + + "highlight":"postfix=highlighted", + "least-common-denominator":"function=least common denominator", + "rate":"infix=per", + "translation":"function= translation by; comma", # NOTE: not tested, changes "translation" -> "comma" in test + "constraint":"infix= ; with constraint; ", + + "binomial-coefficient":"infix=choose", + "pochhammer":"function=permutation", + "permutation-cycle":"function=permutation cycle", + "embellished-name":"infix=with annotation", + + ### Grouping + "annotation":"infix= ; which is ;", # NOTE: Follows the same order as indexed-by, in site listed as function. Should it be infix? + "braced-group":"function=grouped; end grouped", # NOTE: not tested, site is missing "of" keyword function introduces + #"repeating-decimal":"function=repeating decimal", # NOTE: BREAKS TEST. Check again. Site is missing "of" keyword function introduces. + + + ### Other + ## Default fixity function + "curl": "function=curl", + "divergence": "function=div:divergence", + "gradient": "function=del:gradient", + "laplacian": "function=laplacian", + + ## Default fixity prefix + "angle": "prefix=angle", + "angle-measure": "prefix=angle measure", + "change": "prefix=change in", + "for-all": "prefix=for all", + "measured-angle": "prefix=measured angle", + "not": "prefix=not", + "number-of": "prefix=number of", + "partial-derivative": "prefix=partial", + "right-angle": "prefix=right angle", + "square-root-of": "prefix=square root of", + "there-does-not-exist": "prefix=there does not exist", + "there-exists": "prefix=there exists", + + + ## Default fixity infix + "and": "infix=and", + "applied-to": "infix=applied to", + "approximately": "infix=approximately", + "congruent": "infix=congruent to", + "cartesian-product": "infix=cartesian product", + "composed-with": "infix=composed with", + "cross-product": "infix=cross: cross product: cross product", + "defined-as": "infix=defined as", + "divided-by": "infix=divided by", + "divides": "infix=divides", + "does-not-belong-to": "infix=does not belong to", + "does-not-divide": "infix=does not divide", + "dot-product": "infix=dot product", + "downwards-diagonal-ellipsis": "infix=downwards diagonal ellipsis", + "direct-product": "infix=direct product", + "element-of": "infix=element of", + "ellipsis": "infix=ellipsis", + "equals": "infix=equals", + "equivalent-to": "infix=equivalent to", + "evaluates-to": "infix=evaluates to", + "given": "infix=given", + "greater-than": "infix=greater than", + "greater-than-or-equal-to": "infix=greater than or equal to", + "identically-equals": "infix=identically equals", + "if-and-only-if": "infix=if and only if", + "implies": "infix=implies", + "inner-product": "infix=inner product", + "intersection": "infix=intersection", + "less-than": "infix=less than", + "less-than-or-equal-to": "infix=less than or equal to", + "list-separator": "infix=comma", + "maps-to": "infix=maps to", + "member-of": "infix=member of", + "minus-or-plus": "infix=minus or plus", + "not-subset": "infix=not subset of", + "not-superset": "infix=not superset of", + "not-equal-to": "infix=not equal to", + "not-member-of": "infix=not member of", + "not-parallel-to": "infix=not parallel to", + "obtained-from": "infix=obtained from", + "or": "infix=or", + "outer-product": "infix=outer product", + "parallel-to": "infix=parallel to", + "perpendicular": "infix= 垂直於", + "plus": "infix=加 || prefix=正", # Prefix not tested + "minus": "infix=減 || prefix=負", # Prefix not tested + "plus-or-minus": "infix=plus or minus", + "precedes": "infix=precedes", + "proportional": "infix=proportional to", + "range-separator": "infix=through", + "ratio": "infix=ratio", + "similar": "infix=similar to", + "subset": "infix=subset of", + "subset-or-equal": "infix=subset or equal to", + "succeeds": "infix=succeeds", + "such-that": "infix=such that", + "superset": "infix=superset of", + "superset-or-equal": "infix=superset or equal to", + "tilde": "infix=tilde", + "times": "infix=times", + "union": "infix=union", + "upwards-diagonal-ellipsis": "infix=upwards diagonal ellipsis", + "vertical-ellipsis": "infix=vertical ellipsis", + "xor": "infix=exclusive or", + + ## Default fixity postfix + "factorial": "postfix=factorial", + "percent": "postfix=percent", + + ## Default fixity nofix + "diameter":"nofix=d: diameter", + "distance":"nofix=d; D: distance", + "probability":"nofix=P: probability", + "radius":"nofix=r: radius", + "volume":"nofix=V: volume || function=volume", + "exponential-e":"nofix=e", + "imaginary-i":"nofix=i", + "differential-d":"nofix=d", + "golden-ratio":"nofix=golden ratio", + + + ## Other : Not tested, don't appear in https://w3c.github.io/mathml-docs/intent-core-concepts/ "modified-variable": "silent= ", "say-super": "infix=上標", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") - - "absolute-value": "function= ; 絕對值; 結束絕對值", - "binomial": "infix=; 選; end binomial", - "limit": "prefix=極限", + # "large-op": "infix=over || other=from,to", "lim-sup": "prefix=lim sup as: the limit superior as: the limit superior as", "lim-inf": "prefix=lim inf as: the limit inferior as : the limit inferior as", - "logarithm-with-base": "prefix=log 底", - "minus": "infix=減 || prefix=負", - "plus": "infix=加 || prefix=正", - - # These act like postfix in linear-algebra.yaml, so rules are currently used instead of these defaults - # "transpose": "postfix=的 轉置 || function=的 轉置", - # "norm": "function=範數: 的 範數: 的 範數; 結束範數", - # "trace": "function=跡 : 的 跡: 的 跡", - # "dimension": "function=維數 : 的 維數: 的 維數", - # "homomorphism": "function=同態 : 的 同態: 的 同態", - # "kernel": "function=核 : 的 核: 的 核", - "vector": "function=向量 || prefix=向量", - "cross-product": "infix=cross: cross product: cross product", - "dot-product": "infix=dot: dot product: dot:dot product", + "logarithm-with-base": "prefix=log 底數", #"prefix=log base: the log base: the log base", + # "pochhammer": "infix=permutations of", # arguments are in reverse order, so can't work here + "trace": "function= ; trace : trace: trace; 結束 trace", + "dimension": "function=; dimension : dimension: dimension; 結束 dimension", + "homomorphism": "function= ; homomorphism : homomorphism: homomorphism; 結束 homomorphism", + "kernel": "function= ; kernel : kernel: kernel; 結束 kernel", + + "chemistry-concentration": "function= ; concentration: concentration of: the concentration of; end concentration", + } - "divergence": "function= ; div: divergence: divergence; end divergence", - "curl": "function= ; curl; end curl", - "gradient": "function= ; grad: gradient: gradient; end gradient", - "laplacian": "function=lahplahsian", # speech engines don't do a good job with "laplacian" + # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) +- TerseFunctionNames: { + "divergence", "del:gradient", "curl" } - NavigationParts: { + # These are the parts of a formula that can be navigated to "large-op": "基底; 下限; 上限", "mfrac": "分子;分母", "fraction": "分子;分母", @@ -57,6 +326,8 @@ "root": "根號;根指數", "msub": "基底;下標", "sub": "基底;下標", + "logarithm-with-base": "底數", + "indexed-by": "基底; 下標", "msup": "基底;上標", "say-super": "基底;上標", "skip-super": "基底;上標", @@ -65,6 +336,10 @@ "munder": "基底;下限", "mover": "基底;上限", "munderover": "基底;下限;上限", + "absolute-value":"絕對值", + "minus":"減號", + "vector":"向量", + "magnitude":"magnitude", # words for moving into and out of one of the parts (e.g., "move right 'out of' numerator, 'in' denominator") # it's a hack to put them here, but at least they are grouped with the other navigation parts @@ -72,6 +347,14 @@ "out": "離開", } +- KnownWords: { + # MathCAT will put together some runs of three or more mi's (a common mistake), but skips those in alphabetical order. + # This is a list of exceptions so that they do get put together. Don't list words with repeated letters. + + # I asked bard and chatgpt for formula words that are alphabetical, and they failed. + # Here are the words I managed to find, but it almost certainly not complete. Change the list for other languages. + "Abel", "aery", "ails", "airy", "amps", "ceil", "cents", "chop", "flux", "flow", "knot", "most" + } - SIPrefixes: { "Q": "昆", "R": "羅", "Y": "佑", "Z": "皆", "E": "艾", "P": "拍", "T": "兆", "G": "吉", "M": "百萬", "k": "千", "h": "百", "da": "十", @@ -107,10 +390,8 @@ "N": "牛頓", "Ω": "歐姆", "Ω": "歐姆", # Greek Cap letter, U+2126 OHM SIGN "Pa": "帕", - "rad": "弳", "S": "西門", "Sv": "西弗", - "sr": "立弳", "T": "特士拉", "V": "伏特", "W": "瓦", @@ -121,16 +402,15 @@ "t": "公噸", "Da": "道爾頓", "Np": "奈培", # nepar # should only take negative powers - "amu": "原子質量單位", "u": "原子質量單位", # 'u' is correct: https://en.wikipedia.org/wiki/Dalton_(unit) - "au": "天文單位", "AU": "天文單位", + "u": "原子質量單位", # 'u' is correct: https://en.wikipedia.org/wiki/Dalton_(unit) "eV": "電子伏特", + "rad": "弳", + "sr": "立弳", - # copy from english version by hjy # others that take a prefix "a": "年", # should only take positive powers "as": "角秒", # see en.wikipedia.org/wiki/Minute_and_second_of_arc - # Copy from english version by hjy # technically wrong, but used in practice with SI Units "b": "位元", # should only take positive powers "B": "位元組", # should only take positive powers @@ -155,20 +435,20 @@ "MOA": "角分", "arcsec": "角秒", "asec": "角秒", - "as": "角秒", - - # other accepted units that don't take SI prefixes - "ha": "公頃", - "B": "貝爾", - "dB": "分貝", # distance + "au": "天文單位", "AU": "天文單位", "ltyr": "光年", "ly": "光年", "pc": "秒差距", "Å": "埃", "Å": "埃", # U+00C5 and U+212B "fm": "費米", - # others + # other accepted units that don't take SI prefixes + "ha": "公頃", + # "B": "貝爾", # "B" more commonly means bytes + "dB": "分貝", + + "amu": "原子質量單位", "atm": "大氣壓", "bar": "巴", "cal": "卡", @@ -180,11 +460,10 @@ "℧": "姆歐", "dyn": "達因", "erg": "耳格", - # copy from english version by hjy + # powers of 2 used with bits and bytes "Kib": "kibi-位元", "Mib": "mebi-位元", "Gib": "gibi-位元", "Tib": "tebi-位元", "Pib": "pebi-位元", "Eib": "exbi-位元", "Zib": "zebi-位元", "Yib": "yobi-位元", "KiB": "kibi-位元組", "MiB": "mebi-位元組", "GiB": "gibi-位元組", "TiB": "tebi-位元組", "PiB": "pebi-位元組", "EiB": "exbi-位元組", "ZiB": "zebi-位元組", "YiB": "yobi-位元組", - } # this will only be used if the language is English, so it can be empty for other countries @@ -244,6 +523,12 @@ "mpg": "英里每加侖", } +- CurrencySymbols: { + "$": "美元", "¢": "cent", "€": "歐元", "£": "英鎊", "₡": "colón", "₤": "lira", "₨": "rupee", + "₩": "won", "₪": "shekel", "₱": "peso", "₹": "rupee", "₺": "lira", "₿": "bitcoin", + # could add more currencies... + } + - PluralForms: { # FIX: this needs to be flushed out "inch": "英寸", "square inch": "平方英寸", "cubic inch": "立方英寸", @@ -251,11 +536,22 @@ "board foot": "板英尺", "degree celsius": "攝氏度", "degree fahrenheit": "華氏度", + "henry": "亨利", "hertz": "赫茲", + "lux": "勒克斯", "siemens": "西門", "revolution per minute": "轉每分", + "mile per hour": "英里每小時", + "mile per gallon": "英里每加侖", + "colón": "colones", "lira": "lire", "won": "won", "bitcoin": "bitcoin" } +# Lines starting with "#" are a comment +# Each definition in this file is of the form +# - name: { "...", "..." "..." } +# For numbers, +# - name: [] "...", "..." "..." ] + # ---------------- Cardinal and Ordinal Numbers -------------------------- # The following definitions are used to convert numbers to words diff --git a/Rules/Languages/zh/tw/navigate.yaml b/Rules/Languages/zh/tw/navigate.yaml index 0e94a535..16fc1e80 100644 --- a/Rules/Languages/zh/tw/navigate.yaml +++ b/Rules/Languages/zh/tw/navigate.yaml @@ -50,47 +50,48 @@ - if: "self::m:math and starts-with($NavCommand, 'ZoomOut')" then: [T: "已完全縮小", pause: "medium"] - else_if: "IsNode(., 'leaf') and starts-with($NavCommand, 'ZoomIn')" - then: [T: "已完全放大", pause: "medium"] + then: + - test: + - if: "string-length(.) = 1" + then: [T: "已完全放大"] # phrase('zoomed in all of the way') + - else_if: "$NavNodeOffset = 0" + then: [T: "放大到第一字元"] # phrase('zoomed in to first character') + else: [T: "放大到字元"] # phrase('zoomed in to character') + - pause: "medium" else: - test: - if: "starts-with($NavCommand, 'Zoom')" - then: [set_variables: [Prefix: "' '"]] # phrase('zoom' in to see more details) #hjy -- 'zoom' is a bit weird in Chinese, so skip it. + then: [set_variables: [Prefix: "' '", CommandOffset: "5"]] # phrase('zoom' in to see more details) # a space in single quotation is necessary #hjy - else_if: "starts-with($NavCommand, 'Move')" - then: [set_variables: [Prefix: "'移到'"]] # phrase('move' to next entry in table) + then: [set_variables: [Prefix: "'移到'", CommandOffset: "5"]] # phrase('move' to next entry in table) - else_if: "starts-with($NavCommand, 'Read')" - then: [set_variables: [Prefix: "'讀出'"]] # phrase('read' to next entry in table) + then: [set_variables: [Prefix: "'讀出'", CommandOffset: "5"]] # phrase('read' to next entry in table) - else_if: "starts-with($NavCommand, 'Describe')" - then: [set_variables: [Prefix: "'描述'"]] # phrase('describe' to next entry in table) + then: [set_variables: [Prefix: "'描述'", CommandOffset: "9"]] # phrase('describe' to next entry in table) - test: if: "$Prefix != ''" then: - x: "$Prefix" - test: - - if: "substring($NavCommand, 5) = 'In'" + - if: "substring($NavCommand, $CommandOffset) = 'In'" then: [T: "放大"] # phrase(zoom 'in' to see more details) - - else_if: "substring($NavCommand, 5) = 'InAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'InAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [T: "完全放大"] # phrase(zoom 'out all the way' to see more details) - - else_if: "substring($NavCommand, 5) = 'Out'" + then: [T: "完全放大"] # phrase(zoom 'out all of the way' to see more details) + - else_if: "substring($NavCommand, $CommandOffset) = 'Out'" then: [T: "縮小"] # phrase(zoom 'out' to see more details) - - else_if: "substring($NavCommand, 5) = 'OutAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'OutAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [T: "完全縮小"] # phrase(zoom 'out all the way' to see more details) - - else_if: "substring($NavCommand, 5) = 'Next'" # string-length($Prefix)+1 ###fix by hjy - then: [T: "下一項"] # phrase(move to the 'right') - - else_if: "substring($NavCommand, 9) = 'Next'" # string-length($Prefix)+1 ###fix by hjy for describe + then: [T: "完全縮小"] # phrase(zoom 'out all of the way' to see more details) + - else_if: "substring($NavCommand, $CommandOffset) = 'Next'" then: [T: "下一項"] # phrase(move to the 'right') - - else_if: "substring($NavCommand, 5) = 'Previous'" #string-length($Prefix)+1 ###fix by hjy + - else_if: "substring($NavCommand, $CommandOffset) = 'Previous'" then: [T: "上一項"] # phrase(move to the 'left') - - else_if: "substring($NavCommand, 9) = 'Previous'" #string-length($Prefix)+1 ###fix by hjy for describe - then: [T: "上一項"] # phrase(move to the 'left') - - else_if: "substring($NavCommand, 5) = 'Current'" - then: [T: "目前"] # phrase(who is the 'current' president) - - else_if: "substring($NavCommand, 9) = 'Current'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Current'" then: [T: "目前"] # phrase(who is the 'current' president) - - else_if: "substring($NavCommand, 5) = 'LineStart'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineStart'" then: [T: "到行首"] # phrase(move 'to start of line') - - else_if: "substring($NavCommand, 5) = 'LineEnd'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineEnd'" then: [T: "到行尾"] # phrase(move 'to end of line') - pause: "medium" - set_variables: [MatchCounter: "$MatchCounter + 1"] @@ -212,18 +213,19 @@ # ********* ZoomIn *************** - name: zoom-in-leaf - tag: "*" match: "($NavCommand = 'ZoomIn' or $NavCommand = 'ZoomInAll') and IsNode(., 'leaf')" replace: + - with: + variables: [SayCommand: "string($NavVerbosity != 'Terse')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" - then: [T: "已完全放大", pause: "long"] # phrase('zoomed in all of the way') - - test: - if: "$ReadZoomLevel!=-1" + if: "$ReadZoomLevel !=-1" then: - set_variables: [ReadZoomLevel: "0"] - - set_variables: [NavNode: "@id"] + - set_variables: + - NavNode: "@id" + - NavNodeOffset: "IfThenElse(string-length(.) > 1 and $MatchCounter = 1 and $NavNodeOffset = 0, '1', '0')" # special case of zooming into a table -- move to the first row (if only one row, first column) - name: zoom-in-table @@ -233,12 +235,7 @@ - with: variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] replace: [x: "."] - - test: - if: "count(*)=1" - then: - - set_variables: [NavNode: "*[1]/*[1]/@id"] - else: - - set_variables: [NavNode: "*[1]/@id"] + - set_variables: [NavNode: "IfThenElse(count(*)=1, (*[1]/*[1]/@id), (*[1]/@id))"] - name: zoom-in-mrow-in-math # zooming in only once is meaningless because 'math' has only a single child and it was spoken at the math level -- dig inside and do it again @@ -265,7 +262,7 @@ variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] replace: [x: "."] - test: - if: "name(*[1]) != 'mrow'" + if: "not(*[1][self::m:mrow or @data-from-mathml='mrow'])" then: - with: variables: [Move2D: "'進入'", Child2D: "IfThenElse(count(*)=0, $Move2D, $Move2D)"] # phrase('in' the denominator) @@ -310,7 +307,7 @@ variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] replace: [x: "."] - test: - if: "DEBUG($MatchCounter) > 1 and IsNode(., '2D') " + if: "$MatchCounter > 1 and IsNode(., '2D')" then: [set_variables: [NavNode: "@id"]] # time to stop, not going "in" to next thing, so before "Move2D" else: - with: @@ -481,20 +478,26 @@ variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] replace: [x: "."] - test: - if: "$NavMode='Enhanced' and parent::*[self::m:mrow and (IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false))]" + - if: "$NavNodeOffset > 0 and IsNode(., 'leaf')" # Inside leaf -- just reset offset, intent offset doesn't change + then: + - set_variables: [NavNodeOffset: "0"] + # NavNode remains the same + - else_if: "$NavMode='Enhanced' and parent::*[self::m:mrow and (IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false))]" then: [x: ".."] # auto-zoom: move out a level and retry else: - with: - variables: [Move2D: "'離開'", Child2D: "."] + variables: [Move2D: "'離開'", Child2D: "."] # phrase('out of' the denominator) replace: [x: ".."] - test: if: "parent::m:mtd" then: [x: ".."] else: - test: - if: "$ReadZoomLevel!=-1" + if: "DEBUG($ReadZoomLevel)!=-1" then: [set_variables: [ReadZoomLevel: "DistanceFromLeaf(.., true, $NavMode!='Character')"]] - - set_variables: [NavNode: "../@id"] + - set_variables: + - NavNode: "../@id" + - NavNodeOffset: "IfThenElse(../@data-id-offset, ../@data-id-offset, '0')" # ********* MoveStart/End *************** - name: math-move-to-start-or-end @@ -1073,6 +1076,27 @@ # ======== Move/Read/Describe Next rules ================= +- name: move-next-character + tag: [mn, mi, mtext] + match: + - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext' or $NavCommand = 'MoveNextZoom') and" + - "$NavNodeOffset > 0 and" + - "($NavNodeOffset < string-length(.) or name(EdgeNode(., 'right', 'math'))!='math')" # not at edge of math + replace: + - test: + if: "$NavNodeOffset < string-length(.)" + then: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - set_variables: [NavNodeOffset: "$NavNodeOffset + 1"] + else: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - set_variables: [NavNodeOffset: "0"] + - x: "." + # skip 'none' - name: move-next-none tag: [none, mprescripts] @@ -1148,7 +1172,7 @@ - pause: medium - with: variables: - - Move2D: "'end of'" + - Move2D: "'終點'" - Child2D: "$EdgeNode/*[last()]" - MatchCounter: $MatchCounter + 1 replace: [x: "$EdgeNode"] @@ -1343,7 +1367,7 @@ - pause: medium - with: variables: - - Move2D: "'end of'" + - Move2D: "'終點'" - Child2D: "$EdgeNode/*[1]" - MatchCounter: $MatchCounter + 1 replace: [x: "$EdgeNode"] @@ -1372,11 +1396,32 @@ - T: "無法移到上一項" # phrase('cannot move left') - pause: short - with: - variables: [Move2D: "'start of'", Child2D: "."] + variables: [Move2D: "'開頭'", Child2D: "."] replace: [x: "."] - pause: long - set_variables: [SpeakExpression: "'false'"] +- name: move-prev-character + tag: [mn, mi, mtext] + match: + - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious' or $NavCommand = 'MovePreviousZoom') and" + - "$NavNodeOffset > 0 and" + - "($NavNodeOffset > 1 or name(EdgeNode(., 'left', 'math'))!='math')" # not at edge of math + replace: + - test: + if: "$NavNodeOffset > 1" + then: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - set_variables: [NavNodeOffset: "$NavNodeOffset - 1"] + else: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - set_variables: [NavNodeOffset: "0"] + - x: "." + - name: move-previous-auto-zoom-up-one-level # Last child or in auto-zoom'd in-- move up a level and try again # Note: we've already checked the for the case where we are at an edge and should not AutoZoomOut diff --git a/Rules/Languages/zh/tw/overview.yaml b/Rules/Languages/zh/tw/overview.yaml index 240fb45c..255b9e8f 100644 --- a/Rules/Languages/zh/tw/overview.yaml +++ b/Rules/Languages/zh/tw/overview.yaml @@ -12,10 +12,9 @@ # There is a balance that you want to maximize the info given, so 10 words is likely better then 3. # That might mean that at the top level, we may want to allow the first few children to expand -- include: "SimpleSpeak_Rules.yaml" - name: overview-default - tag: mfrac + tag: [mfrac, fraction] match: "." replace: - test: @@ -28,7 +27,7 @@ - T: "分數" - name: overview-default - tag: msqrt + tag: [msqrt, "square-root"] match: "." replace: - T: "根號" @@ -41,7 +40,7 @@ - x: "*[1]" - name: overview-default - tag: mroot + tag: [mroot, root] match: "." replace: - T: "" @@ -119,3 +118,5 @@ - x: "*[5]" - pause: auto - T: "等等" + +- include: "SimpleSpeak_Rules.yaml" diff --git a/Rules/Languages/zh/tw/unicode-full.yaml b/Rules/Languages/zh/tw/unicode-full.yaml index 9e4e8508..b319122e 100644 --- a/Rules/Languages/zh/tw/unicode-full.yaml +++ b/Rules/Languages/zh/tw/unicode-full.yaml @@ -37,6 +37,9 @@ then: [T: "乘"] # (en: 'by', google translation) else: [T: "乘"] # (en: 'cross') - "÷": [T: "除以"] # 0xf7 (en: 'divided by') + - "¡": [t: "inverted exclamation mark"] # 0xa1 + - "¶": [t: "paragraph mark"] # 0xb6 + - "¿": [t: "inverted question mark"] # 0xbf - "ʰ": [t: "modifier small h"] # 0x2b0 (en: 'modifier small h', google translation) - "ʱ": [t: "modifier small h with hook"] # 0x2b1 (en: 'modifier small h with hook', google translation) - "ʲ": [t: "modifier small j"] # 0x2b2 (en: 'modifier small j', google translation) @@ -187,6 +190,7 @@ - "̀": [t: "grave tone mark embellishment"] # 0x340 (en: 'grave tone mark embellishment', google translation) - "́": [t: "acute tone mark embellishment"] # 0x341 (en: 'acute tone mark embellishment', google translation) + - "͆": [t: "bridge above"] # 0x346 - "ΪΫϏ": # 0x3aa, 0x3ab, 0x3cf - test: if: "$CapitalLetters_Beep" @@ -219,6 +223,8 @@ - "ϕ": [T: "phi"] # 0x3d5 (en: 'phi') - "ϖ": [t: "pi"] # 0x3d6 (en: 'pi') - "ϗ": [t: "kai"] # 0x3d7 (en: 'kai') + - "Ϙ": [t: "cap archaic koppa"] # 0x3d8 + - "ϙ": [t: "archaic koppa"] # 0x3d9 - "ϵ": [T: "epsilon"] # 0x3f5 (en: 'epsilon') - "϶": [t: "reversed epsilon"] # 0x3f6 (en: 'reversed epsilon') - "А-Я": # 0x410 - 0x42f @@ -271,16 +277,20 @@ - "э": [t: "e"] # 0x44d (en: 'e', google translation) - "ю": [t: "yu"] # 0x44e (google translation) - "я": [T: "ya"] # 0x44f (en: 'ya', google translation) + - "؆": [t: "Arabic-Indic cube root"] # 0x606 + - "؇": [t: "Arabic-Indic fourth root"] # 0x607 + - "؈": [t: "Arabic ray"] # 0x608 - "‐": [T: "連字符"] # 0x2010 (en: 'hyphen', google translation) - "‑": [T: "連字符"] # 0x2011 (en: 'hyphen', google translation) - "‒": [t: "圖破折號"] # 0x2012 (en: 'figure dash', google translation) - "–": [t: "en dash"] # 0x2013 (google translation) - "—": [t: "em dash"] # 0x2014 (google translation) - "―": [T: "橫線"] # 0x2015 (en: 'horizontal bar', google translation) - - "‖": [T: "雙垂直線"] # 0x2016 (en: 'double vertical line', google translation) + - "‖": [T: "雙豎線"] # 0x2016 (en: 'double vertical line', google translation) - "†": [t: "dagger"] # 0x2020 (en: 'dagger', google translation) - "‡": [t: "double dagger"] # 0x2021 (en: 'double dagger', google translation) + - " - ": [t: " "] # 0x2000 - 0x2007 - "•": # 0x2022 - test: if: "@data-chem-formula-op" @@ -311,10 +321,26 @@ - "‸": [t: "到"] # 0x2038 (en: 'to the', google translation) - "‹": [t: "single left pointing angle quote mark"] # 0x2039 (en: 'single left pointing angle quote mark', google translation) - "›": [t: "single right pointing angle quote mark"] # 0x203a (en: 'single right pointing angle quote mark', google translation) - - "‼": [T: "雙階乘"] # 0x203c (en: 'double factorial', google translation) - - "⁄": [T: "除以"] # 0x2044 (en: 'divided by', google translation) + - "‼": # 0x203c (en: 'double factorial', google translation) + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [t: "double exclamation point"] # 0x203c + else: [T: "雙階乘"] # 0x203c + - "⁄": # 0x2044 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [t: "large slash"] # 0x203c + else: [T: "除以"] # 0x203c - "⁅": [T: "帶毛左中括號"] # 0x2045 (en: 'left square bracket with quill', google translation) - "⁆": [T: "帶毛右中括號"] # 0x2046 (en: 'right square bracket with quill', google translation) + - "※": [t: "reference mark"] # 0x203b + - "‿": [t: "under tie"] # 0x203F + - "⁀": [t: "tie"] # 0x2040 + - "⁎": [t: "low asterisk"] # 0x204e + - "⁏": [t: "reversed semicolon"] # 0x204f + - "⁐": [t: "close up"] # 0x2050 + - "⁑": [t: "two vertical asterisks"] # 0x2051 + - "⁒": [t: "commercial minus sign"] # 0x2052 - "⁗": [T: "quadruple prime"] # 0x2057 (en: 'quadruple prime', google translation) - "⁠": [t: ""] # 0x2060 - "⁰": [T: "上標零"] # 0x2070 (en: 'to the zeroth power', google translation) @@ -430,17 +456,11 @@ - SPELL: "translate('.', 'ℌℑℨℭ', 'HIZC')" - "ℍℙℾℿ": # 0x210d, 0x2119, 0x213e, 0x213f - - test: - if: "$Verbosity!='Terse'" - then: [T: "空心"] # (en: 'double struck', google translation) - - SPELL: "translate('.', 'ℍℙℾℿ', 'HPΓΠ')" + - T: "雙線" + - spell: "translate('.', 'ℍℙℾℿ', 'HPΓΠ')" - "ℎ": [T: "普朗克常數"] # 0x210e (en: 'planck constant', google translation) - - "ℏ": # 0x210f - - test: - if: "($Verbosity='Terse')" - then: [T: "h bar"] # (google translation) - else: [T: "約化普朗克常數"] # (en: 'reduced planck constant', google translation) + - "ℏ": [t: "h bar"] # 0x210f - "ℐℒ℘ℬℰℱℳ": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 - T: "草體" # (en: 'script', google translation) @@ -474,12 +494,15 @@ - "ℶ": [T: "第二transfinite cardinal"] # 0x2136 (en: 'second transfinite cardinal', google translation) - "ℷ": [T: "第三transfinite cardinal"] # 0x2137 (en: 'third transfinite cardinal', google translation) - "ℸ": [T: "第四transfinite cardinal"] # 0x2138 (en: 'fourth transfinite cardinal', google translation) - - "ℼ": [T: "空心pi"] # 0x213c (en: 'double struck pi', google translation) - - "ℽ": [T: "空心伽瑪"] # 0x213d (en: 'double struck gamma', google translation) - - "⅀": [T: "空心總和"] # 0x2140 (en: 'double struck n-ary summation', google translation) + - "ℼ": [T: "雙線pi"] # 0x213c (en: 'double struck pi', google translation) + - "ℽ": [T: "雙線伽瑪"] # 0x213d (en: 'double struck gamma', google translation) + - "⅀": [T: "雙線總和"] # 0x2140 (en: 'double struck n-ary summation', google translation) - "⅋": [T: "轉向ampersand"] # 0x214b (en: 'turned ampersand', google translation) - "⅌": [T: "每"] # 0x214c (en: 'per', google translation) - "ⅎ": [T: "翻身f"] # 0x214e (en: 'turned F', google translation) + - "¼": [t: "one quarter"] # 0x00bc + - "½": [t: "one half"] # 0x00bd + - "¾": [t: "three quarters"] # 0x00be - "⅐": [T: "七分之1"] # 0x2150 (en: 'one seventh', google translation) - "⅑": [T: "九分之1"] # 0x2151 (en: 'one ninth', google translation) - "⅒": [T: "十分之1"] # 0x2152 (en: 'one tenth', google translation) @@ -529,12 +552,8 @@ - "ⅾ": [T: "d"] # 0x217e (en: 'D', google translation) - "ⅿ": [T: "m"] # 0x217f (en: 'M', google translation) - "↉": [T: "三分之0"] # 0x2189 (en: 'zero thirds', google translation) - - "←": [T: "左箭頭"] # 0x2190 (en: 'leftwards arrow', google translation) - - "↑": [T: "向上箭頭"] # 0x2191 (en: 'upwards arrow', google translation) - - "→": [T: "右箭頭"] # 0x2192 (en: 'rightwards arrow') - - "↓": [T: "向下箭頭"] # 0x2193 (en: 'downwards arrow', google translation) - - "↔": [T: "左右雙箭頭"] # 0x2194 (en: 'left right arrow') - - "↕": [T: "上下雙箭頭"] # 0x2195 (en: 'up down arrow', google translation) + - "↔": [T: "左右箭頭"] # 0x2194 (en: 'left right arrow') + - "↕": [T: "上下箭頭"] # 0x2195 (en: 'up down arrow', google translation) - "↖": [T: "左上箭頭"] # 0x2196 (en: 'north west arrow', google translation) - "↗": # 0x2197 - test: @@ -561,15 +580,15 @@ - "↣": [T: "有尾巴右箭頭"] # 0x21a3 (en: 'rightwards arrow with tail', google translation) - "↤": [T: "左箭頭尾直線"] # 0x21a4 (en: 'leftwards arrow from bar', google translation) - "↥": [T: "向上箭頭尾直線"] # 0x21a5 (en: 'upwards arrow from bar', google translation) - - "↦": [T: "右箭頭的箭頭"] # 0x21a6 (en: 'rightwards arrow from bar', google translation) + - "↦": [T: "右箭頭尾直線"] # 0x21a6 (en: 'rightwards arrow from bar', google translation) - "↧": [T: "向下箭頭尾直線"] # 0x21a7 (en: 'downwards arrow from bar', google translation) - - "↨": [T: "上下雙箭頭有底線"] # 0x21a8 (en: 'up down arrow with base', google translation) + - "↨": [T: "上下箭頭有底線"] # 0x21a8 (en: 'up down arrow with base', google translation) - "↩": [T: "帶鉤向左箭頭"] # 0x21a9 (en: 'leftwards arrow with hook', google translation) - "↪": [T: "帶鉤向右箭頭"] # 0x21aa (en: 'rightwards arrow with hook', google translation) - "↫": [T: "帶環左箭頭"] # 0x21ab (en: 'leftwards arrow with loop', google translation) - "↬": [T: "帶環右箭頭"] # 0x21ac (en: 'rightwards arrow with loop', google translation) - "↭": [T: "左右波浪箭頭"] # 0x21ad (en: 'left right wave arrow', google translation) - - "↮": [T: "帶撇左右雙箭頭"] # 0x21ae (en: 'left right arrow with stroke', google translation) + - "↮": [T: "帶撇左右箭頭"] # 0x21ae (en: 'left right arrow with stroke', google translation) - "↯": [T: "向下曲折箭頭"] # 0x21af (en: 'downwards zigzag arrow', google translation) - "↰": [T: "向上轉左箭頭"] # 0x21b0 (en: 'upwards arrow with tip leftwards', google translation) - "↱": [T: "向上轉右箭頭"] # 0x21b1 (en: 'upwards arrow with tip rightwards', google translation) @@ -577,80 +596,80 @@ - "↳": [T: "向下轉右箭頭"] # 0x21b3 (en: 'downwards arrow with tip rightwards', google translation) - "↴": [T: "向右轉下箭頭"] # 0x21b4 (en: 'rightwards arrow with corner downwards', google translation) - "↵": [T: "下轉左箭頭"] # 0x21b5 (en: 'downwards arrow with corner leftwards', google translation) - - "↶": [T: "逆時針往左半圓箭頭"] # 0x21b6 (en: 'anticlockwise top semicircle arrow', google translation) - - "↷": [T: "順時針往右半圓箭頭"] # 0x21b7 (en: 'clockwise top semicircle arrow', google translation) - - "↸": [t: "左上箭頭到橫線"] # 0x21b8 (en: 'north west arrow to long bar', google translation) - - "↹": [t: "上方左箭頭到垂線下方右箭頭到垂線"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar', google translation) - - "↺": [t: "逆時針開放圓箭頭"] # 0x21ba (en: 'anticlockwise open circle arrow', google translation) - - "↻": [t: "順時針開放圓箭頭"] # 0x21bb (en: 'clockwise open circle arrow', google translation) - - "↼": [t: "向左魚叉尖朝上"] # 0x21bc (en: 'left harpoon up', google translation) - - "↽": [t: "向左魚叉尖朝下"] # 0x21bd (en: 'left harpoon down', google translation) - - "↾": [t: "向上魚叉尖朝右"] # 0x21be (en: 'up harpoon right', google translation) - - "↿": [t: "向上魚叉尖朝左"] # 0x21bf (en: 'up harpoon left', google translation) - - "⇀": [t: "向量"] # 0x21c0 (en: 'right harpoon up') - - "⇁": [t: "向右魚叉尖朝下"] # 0x21c1 (en: 'right harpoon down', google translation) - - "⇂": [t: "向下魚叉尖朝右"] # 0x21c2 (en: 'down harpoon right', google translation) - - "⇃": [t: "向下魚叉尖朝左"] # 0x21c3 (en: 'down harpoon left', google translation) - - "⇄": [t: "上方右箭頭下方左箭頭"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow', google translation) - - "⇅": [t: "左方向上右方向下箭頭"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow', google translation) - - "⇆": [t: "上方向左下方向右箭頭"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow', google translation) - - "⇇": [t: "向左成對箭頭"] # 0x21c7 (en: 'leftwards paired arrows', google translation) - - "⇈": [t: "向上成對箭頭"] # 0x21c8 (en: 'upwards paired arrows', google translation) - - "⇉": [t: "向右成對箭頭"] # 0x21c9 (en: 'rightwards paired arrows', google translation) - - "⇊": [t: "向下成對箭頭"] # 0x21ca (en: 'downwards paired arrows', google translation) - - "⇋": [t: "上方向左下方向右魚叉"] # 0x21cb (en: 'left harpoon over right harpoon', google translation) - - "⇌": [t: "上方向右下方向左魚叉"] # 0x21cc (en: 'right harpoon over left harpoon', google translation) - - "⇍": [t: "帶撇向左粗箭頭"] # 0x21cd (en: 'leftwards double arrow with stroke', google translation) - - "⇎": [t: "帶撇左右粗箭頭"] # 0x21ce (en: 'left right double arrow with stroke', google translation) - - "⇏": [t: "帶撇向右粗箭頭"] # 0x21cf (en: 'rightwards double arrow with stroke', google translation) - - "⇐": [t: "向左粗箭頭"] # 0x21d0 (en: 'leftwards double arrow', google translation) - - "⇑": [t: "向上粗箭頭"] # 0x21d1 (en: 'upwards double arrow', google translation) - - "⇒": [t: "向右粗箭頭"] # 0x21d2 (en: 'rightwards double arrow', google translation) - - "⇓": [t: "向下粗箭頭"] # 0x21d3 (en: 'downwards double arrow', google translation) - - "⇔": [t: "左右粗箭頭"] # 0x21d4 (en: 'left right double arrow', google translation) - - "⇕": [t: "上下粗箭頭"] # 0x21d5 (en: 'up down double arrow', google translation) - - "⇖": [t: "左上粗箭頭"] # 0x21d6 (en: 'north west double arrow', google translation) - - "⇗": [t: "右上粗箭頭"] # 0x21d7 (en: 'north east double arrow', google translation) - - "⇘": [t: "右下粗箭頭"] # 0x21d8 (en: 'south east double arrow', google translation) - - "⇙": [t: "左下粗箭頭"] # 0x21d9 (en: 'south west double arrow', google translation) - - "⇚": [t: "向左重箭頭"] # 0x21da (en: 'leftwards triple arrow', google translation) - - "⇛": [t: "向右重箭頭"] # 0x21db (en: 'rightwards triple arrow', google translation) - - "⇜": [t: "向左花箭頭"] # 0x21dc (en: 'leftwards squiggle arrow', google translation) - - "⇝": [t: "向右花箭頭"] # 0x21dd (en: 'rightwards squiggle arrow', google translation) - - "⇞": [t: "雙撇向上箭頭"] # 0x21de (en: 'upwards arrow with double stroke', google translation) - - "⇟": [t: "雙撇向下箭頭"] # 0x21df (en: 'downwards arrow with double stroke', google translation) - - "⇠": [t: "向左虛線箭頭"] # 0x21e0 (en: 'leftwards dashed arrow', google translation) - - "⇡": [t: "向上虛線箭頭"] # 0x21e1 (en: 'upwards dashed arrow', google translation) - - "⇢": [t: "向右虛線箭頭"] # 0x21e2 (en: 'rightwards dashed arrow', google translation) - - "⇣": [t: "向下虛線箭頭"] # 0x21e3 (en: 'downwards dashed arrow', google translation) - - "⇤": [t: "向左箭頭到垂線"] # 0x21e4 (en: 'leftwards arrow to bar', google translation) - - "⇥": [t: "向右箭頭到垂線"] # 0x21e5 (en: 'rightwards arrow to bar', google translation) - - "⇦": [t: "左白箭頭"] # 0x21e6 (en: 'leftwards white arrow', google translation) - - "⇧": [t: "向上空心箭頭"] # 0x21e7 (en: 'upwards white arrow', google translation) - - "⇨": [t: "向右空心箭頭"] # 0x21e8 (en: 'rightwards white arrow', google translation) - - "⇩": [t: "向下空心箭頭"] # 0x21e9 (en: 'downwards white arrow', google translation) - - "⇪": [t: "起頭橫線向上空心箭頭"] # 0x21ea (en: 'upwards white arrow from bar', google translation) - - "⇫": [t: "有座向上空心箭頭"] # 0x21eb (en: 'upwards white arrow on pedestal', google translation) - - "⇬": [t: "有座向上空心橫線箭頭"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar', google translation) - - "⇭": [t: "有座向上中心垂線空心箭頭"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar', google translation) - - "⇮": [t: "向上空心雙箭頭"] # 0x21ee (en: 'upwards white double arrow', google translation) - - "⇯": [t: "有座向上空心雙箭頭"] # 0x21ef (en: 'upwards white double arrow on pedestal', google translation) - - "⇰": [t: "有座向空心箭頭"] # 0x21f0 (en: 'rightwards white arrow from wall', google translation) - - "⇱": [t: "左上箭頭到拐角"] # 0x21f1 (en: 'north west arrow to corner', google translation) - - "⇲": [t: "右下箭頭到拐角"] # 0x21f2 (en: 'south east arrow to corner', google translation) - - "⇳": [t: "上下空心箭頭"] # 0x21f3 (en: 'up down white arrow', google translation) - - "⇴": [t: "右箭頭有小圓圈"] # 0x21f4 (en: 'right arrow with small circle', google translation) - - "⇵": [t: "左方向下右方向上箭頭"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow', google translation) - - "⇶": [t: "三個向右箭頭"] # 0x21f6 (en: 'three rightwards arrows', google translation) - - "⇷": [t: "左箭頭帶有垂直衝程"] # 0x21f7 (en: 'leftwards arrow with vertical stroke', google translation) - - "⇸": [t: "垂直中風的右箭頭"] # 0x21f8 (en: 'rightwards arrow with vertical stroke', google translation) - - "⇹": [t: "左右箭頭帶有垂線"] # 0x21f9 (en: 'left right arrow with vertical stroke', google translation) - - "⇺": [t: "向左箭頭帶有二垂線"] # 0x21fa (en: 'leftwards arrow with double vertical stroke', google translation) - - "⇻": [t: "向右箭頭帶有二垂線"] # 0x21fb (en: 'rightwards arrow with double vertical stroke', google translation) - - "⇼": [t: "左右箭頭帶有二垂線"] # 0x21fc (en: 'left right arrow with double vertical stroke', google translation) - - "⇽": [t: "向左開頭箭頭"] # 0x21fd (en: 'leftwards open headed arrow', google translation) - - "⇾": [t: "向右開頭箭頭"] # 0x21fe (en: 'rightwards open headed arrow', google translation) - - "⇿": [t: "左右開頭箭頭"] # 0x21ff (en: 'left right open headed arrow', google translation) + - "↶": [T: "逆時針上半圓箭頭"] # 0x21b6 (en: 'anticlockwise top semicircle arrow', google translation) + - "↷": [T: "順時針上半圓箭頭"] # 0x21b7 (en: 'clockwise top semicircle arrow', google translation) + - "↸": [T: "左上箭頭到橫線"] # 0x21b8 (en: 'north west arrow to long bar', google translation) + - "↹": [T: "上方左箭頭到豎線下方右箭頭到豎線"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar', google translation) + - "↺": [T: "逆時針圓箭頭"] # 0x21ba (en: 'anticlockwise open circle arrow', google translation) + - "↻": [T: "順時針圓箭頭"] # 0x21bb (en: 'clockwise open circle arrow', google translation) + - "↼": [T: "向左魚叉尖朝上"] # 0x21bc (en: 'left harpoon up', google translation) + - "↽": [T: "向左魚叉尖朝下"] # 0x21bd (en: 'left harpoon down', google translation) + - "↾": [T: "向上魚叉尖朝右"] # 0x21be (en: 'up harpoon right', google translation) + - "↿": [T: "向上魚叉尖朝左"] # 0x21bf (en: 'up harpoon left', google translation) + - "⇀": [T: "向右魚叉尖朝上"] # 0x21c0 (en: 'right harpoon up') + - "⇁": [T: "向右魚叉尖朝下"] # 0x21c1 (en: 'right harpoon down', google translation) + - "⇂": [T: "向下魚叉尖朝右"] # 0x21c2 (en: 'down harpoon right', google translation) + - "⇃": [T: "向下魚叉尖朝左"] # 0x21c3 (en: 'down harpoon left', google translation) + - "⇄": [T: "上方右箭頭下方左箭頭"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow', google translation) + - "⇅": [T: "左方向上右方向下箭頭"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow', google translation) + - "⇆": [T: "上方向左下方向右箭頭"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow', google translation) + - "⇇": [T: "向左成對箭頭"] # 0x21c7 (en: 'leftwards paired arrows', google translation) + - "⇈": [T: "向上成對箭頭"] # 0x21c8 (en: 'upwards paired arrows', google translation) + - "⇉": [T: "向右成對箭頭"] # 0x21c9 (en: 'rightwards paired arrows', google translation) + - "⇊": [T: "向下成對箭頭"] # 0x21ca (en: 'downwards paired arrows', google translation) + - "⇋": [T: "上方向左下方向右魚叉"] # 0x21cb (en: 'left harpoon over right harpoon', google translation) + - "⇌": [T: "上方向右下方向左魚叉"] # 0x21cc (en: 'right harpoon over left harpoon', google translation) + - "⇍": [T: "帶撇向左粗箭頭"] # 0x21cd (en: 'leftwards double arrow with stroke', google translation) + - "⇎": [T: "帶撇左右粗箭頭"] # 0x21ce (en: 'left right double arrow with stroke', google translation) + - "⇏": [T: "帶撇向右粗箭頭"] # 0x21cf (en: 'rightwards double arrow with stroke', google translation) + - "⇐": [T: "向左粗箭頭"] # 0x21d0 (en: 'leftwards double arrow', google translation) + - "⇑": [T: "向上粗箭頭"] # 0x21d1 (en: 'upwards double arrow', google translation) + - "⇒": [T: "向右粗箭頭"] # 0x21d2 (en: 'rightwards double arrow', google translation) + - "⇓": [T: "向下粗箭頭"] # 0x21d3 (en: 'downwards double arrow', google translation) + - "⇔": [T: "左右粗箭頭"] # 0x21d4 (en: 'left right double arrow', google translation) + - "⇕": [T: "上下粗箭頭"] # 0x21d5 (en: 'up down double arrow', google translation) + - "⇖": [T: "左上粗箭頭"] # 0x21d6 (en: 'north west double arrow', google translation) + - "⇗": [T: "右上粗箭頭"] # 0x21d7 (en: 'north east double arrow', google translation) + - "⇘": [T: "右下粗箭頭"] # 0x21d8 (en: 'south east double arrow', google translation) + - "⇙": [T: "左下粗箭頭"] # 0x21d9 (en: 'south west double arrow', google translation) + - "⇚": [T: "向左重箭頭"] # 0x21da (en: 'leftwards triple arrow', google translation) + - "⇛": [T: "向右重箭頭"] # 0x21db (en: 'rightwards triple arrow', google translation) + - "⇜": [T: "向左波浪箭頭"] # 0x21dc (en: 'leftwards squiggle arrow', google translation) + - "⇝": [T: "向右波浪箭頭"] # 0x21dd (en: 'rightwards squiggle arrow', google translation) + - "⇞": [T: "雙撇向下箭頭"] # 0x21de (en: 'upwards arrow with double stroke', google translation) + - "⇟": [T: "雙撇向上箭頭"] # 0x21df (en: 'downwards arrow with double stroke', google translation) + - "⇠": [T: "向左虛線箭頭"] # 0x21e0 (en: 'leftwards dashed arrow', google translation) + - "⇡": [T: "向上虛線箭頭"] # 0x21e1 (en: 'upwards dashed arrow', google translation) + - "⇢": [T: "向右虛線箭頭"] # 0x21e2 (en: 'rightwards dashed arrow', google translation) + - "⇣": [T: "向下虛線箭頭"] # 0x21e3 (en: 'downwards dashed arrow', google translation) + - "⇤": [T: "向左箭頭到豎線"] # 0x21e4 (en: 'leftwards arrow to bar', google translation) + - "⇥": [T: "向右箭頭到豎線"] # 0x21e5 (en: 'rightwards arrow to bar', google translation) + - "⇦": [T: "左白箭頭"] # 0x21e6 (en: 'leftwards white arrow', google translation) + - "⇧": [T: "向上白箭頭"] # 0x21e7 (en: 'upwards white arrow', google translation) + - "⇨": [T: "向右白箭頭"] # 0x21e8 (en: 'rightwards white arrow', google translation) + - "⇩": [T: "向下白箭頭"] # 0x21e9 (en: 'downwards white arrow', google translation) + - "⇪": [t: "起頭橫線向上白箭頭"] # 0x21ea (en: 'upwards white arrow from bar', google translation) + - "⇫": [t: "有座向上白心箭頭"] # 0x21eb (en: 'upwards white arrow on pedestal', google translation) + - "⇬": [t: "有座向上白橫線箭頭"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar', google translation) + - "⇭": [t: "有座向上中心豎線白箭頭"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar', google translation) + - "⇮": [t: "向上白雙箭頭"] # 0x21ee (en: 'upwards white double arrow', google translation) + - "⇯": [t: "有座向上白雙箭頭"] # 0x21ef (en: 'upwards white double arrow on pedestal', google translation) + - "⇰": [T: "有座向右白箭頭"] # 0x21f0 (en: 'rightwards white arrow from wall', google translation) + - "⇱": [T: "左上箭頭到拐角"] # 0x21f1 (en: 'north west arrow to corner', google translation) + - "⇲": [T: "右下箭頭到拐角"] # 0x21f2 (en: 'south east arrow to corner', google translation) + - "⇳": [T: "上下白箭頭"] # 0x21f3 (en: 'up down white arrow', google translation) + - "⇴": [T: "右箭頭有小圓圈"] # 0x21f4 (en: 'right arrow with small circle', google translation) + - "⇵": [T: "左向下右向上箭頭"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow', google translation) + - "⇶": [T: "三個向右箭頭"] # 0x21f6 (en: 'three rightwards arrows', google translation) + - "⇷": [T: "左箭頭帶有豎線"] # 0x21f7 (en: 'leftwards arrow with vertical stroke', google translation) + - "⇸": [T: "右箭頭帶有豎線"] # 0x21f8 (en: 'rightwards arrow with vertical stroke', google translation) + - "⇹": [T: "左右箭頭帶有豎線"] # 0x21f9 (en: 'left right arrow with vertical stroke', google translation) + - "⇺": [T: "向左箭頭帶有二豎線"] # 0x21fa (en: 'leftwards arrow with double vertical stroke', google translation) + - "⇻": [T: "向右箭頭帶有二豎線"] # 0x21fb (en: 'rightwards arrow with double vertical stroke', google translation) + - "⇼": [T: "左右箭頭帶有二豎線"] # 0x21fc (en: 'left right arrow with double vertical stroke', google translation) + - "⇽": [T: "向左中空箭頭"] # 0x21fd (en: 'leftwards open headed arrow', google translation) + - "⇾": [T: "向右中空箭頭"] # 0x21fe (en: 'rightwards open headed arrow', google translation) + - "⇿": [T: "左右中空箭頭"] # 0x21ff (en: 'left right open headed arrow', google translation) - "∀": [T: "對所有的"] # 0x2200 (en: 'for all') - "∁": # 0x2201 - test: @@ -666,38 +685,14 @@ - "∄": [T: "不存在"] # 0x2204 (en: 'there does not exist') - "∅": [T: "空集合"] # 0x2205 (en: 'empty set') - "∆": # 0x2206 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'the', google translation) - - T: "變化量" # (en: 'laplacian of') - - "∇": # 0x2207 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'the', google translation) - - T: "梯度" # (en: 'gradient of') - - "∈": # 0x2208 - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "屬於"] # (en: 'an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "在"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "成員"] # (en: 'member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "元素"] # (en: 'element of', google translation) - - else: [T: "屬於"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "是"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "是一個元素"] # (en: 'is an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "在"] # (en: 'is in', google translation) - - else: [T: "屬於"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + if: "following-sibling::*" + then_test: + if: "$Verbosity!='Terse'" + then: [t: "the LahPlahsian of"] # "LahPlahsian" sounds better than "laplacian" in speech engines tested + else: [t: "LahPlahsian"] + else: [t: "LahPlahsian"] + - "∇": [t: "nahblah"] # 0x2207 - "∉": # 0x2209 # rule is identical to 0x2208 - test: @@ -725,7 +720,11 @@ - "∊": # 0x220a - test: if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "屬於"] # (en: 'is an element of', google translation) + then: # (en: 'is an element of', google translation) + - test: + if: "$Verbosity!='Terse' and not(parent::m:set)" # "the set x is an element of ..." sounds bad + then: [t: ""] + - T: "屬於" # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option else_test: if: "../../self::m:set or ../../../self::m:set" # inside a set @@ -825,7 +824,7 @@ if: "$Verbosity!='Terse'" then: [T: ""] # (en: 'is', google translation) - T: "同位" # (en: 'homothetic to') - - "∼": [T: "波浪符"] # 0x223c (en: 'varies with') + - "∼": [T: "相似"] # 0x223c (en: 'varies with') - "∽": [T: "反波浪符"] # 0x223d (en: 'reversed tilde') - "∾": # 0x223e - test: @@ -850,7 +849,7 @@ - test: if: "$Verbosity!='Terse'" then: [T: ""] # (en: 'is', google translation) - - T: "近似等於" # (en: 'approximately equal to') + - T: "全等於" # (en: 'approximately equal to') - "≆": # 0x2246 - test: if: "$Verbosity!='Terse'" @@ -898,7 +897,7 @@ - test: if: "$Verbosity!='Terse'" then: [T: ""] # (en: 'is', google translation) - - T: "幾何等於" # (en: 'geometrically equal to') + - T: "近似於" # (en: 'geometrically equal to') - "≒": # 0x2252 - test: if: "$Verbosity!='Terse'" @@ -1314,7 +1313,7 @@ then: [T: ""] # (en: 'is', google translation) - t: "不正規子群或等於" # (en: 'not a normal subgroup of nor is equal to') - "⋭": [t: "does not contain as a normal subgroup nor is equal to"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to') - - "⋮": [T: "垂線省略號"] # 0x22ee (en: 'vertical ellipsis') + - "⋮": [T: "豎線省略號"] # 0x22ee (en: 'vertical ellipsis') - "⋯": [T: "水平省略號"] # 0x22ef (en: 'dot dot dot') - "⋰": [t: "右上省略號"] # 0x22f0 (en: 'upwards diagonal ellipsis') - "⋱": [t: "右下省略號"] # 0x22f1 (en: 'diagonal ellipsis') @@ -1386,10 +1385,28 @@ - "⌳": [t: "slope"] # 0x2333 (en: 'slope', google translation) - "⌴": [t: "counterbore"] # 0x2334 (en: 'counterbore', google translation) - "⌵": [t: "counterink"] # 0x2335 (en: 'countersink', google translation) + - "⌶": [t: "apl i beam"] # 0x2336 + - "⌽": [t: "apl circle stile"] # 0x233d + - "⌿": [t: "apl slash bar"] # 0x233f - "⍰": [T: "盒內問號"] # 0x2370 (en: 'unknown box', google translation) + - "⍼": [t: "right angle with down zigzag arrow"] # 0x237c + - "⎔": [t: "hexagon"] # 0x2394 - "⎕": [T: "盒子"] # 0x2395 (en: 'box', google translation) + - "⎶": [t: "bottom square bracket over top square bracket"] # 0x23b6 + - "⏜": [T: "頂小括"] # 0x23dc + - "⏝": [T: "底小括"] # 0x23dd - "⏞": [T: "頂大括"] # 0x23DE (en: 'top brace', google translation) - "⏟": [T: "底大括"] # 0x23DF (en: 'bottom brace', google translation) + - "⏠": [t: "top tortoise shell bracket"] # 0x23e0 + - "⏡": [t: "bottom tortoise shell bracket"] # 0x23e1 + - "⏢": [t: "white trapezium"] # 0x23e2 + - "⏣": [t: "benzene right with circle"] # 0x23e3 + - "⏤": [t: "straightness"] # 0x23e4 + - "⏥": [t: "flatness"] # 0x23e5 + - "⏦": # 0x23e6 + - spell: "ac" + - t: "current" + - "⏧": [t: "electrical intersection"] # 0x23e7 - "①-⑨": # 0x2460 - 0x2469 - T: "圈圈" # (en: 'circled', google translation) - SPELL: "translate('.', '①②③④⑤⑥⑦⑧⑨', '123456789')" @@ -1436,9 +1453,9 @@ - T: "括號圍繞" # (en: 'parenthesized', google translation) - SPELL: "translate('.', '⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵', 'abcdefghijklmnopqrstuvwxyz')" - - "Ⓐ-Ⓩ": - - T: "圈圈" # (en: 'circled', google translation) - - SPELL: "translate('.', 'ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "Ⓐ-ⓩ": # 0x24b6 - 0x24cf + - t: "圈圈" + - spell: "translate('.', 'ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "🅐-🅩": # 0x1f150 - 0x1f169 - T: "黑圈圈" # (en: 'black circled', google translation) @@ -1464,21 +1481,21 @@ - "⓾": [T: "雙圈10"] # 0x24fe (en: 'double circled ten', google translation) - "⓿": [T: "黑圈圈0"] # 0x24ff (en: 'black circled zero', google translation) - "■": [T: "黑方塊"] # 0x25a0 (en: 'black square', google translation) - - "□": [T: "白方塊"] # 0x25a1 (en: 'white square', google translation) - - "▢": [T: "白圓角方塊"] # 0x25a2 (en: 'white square with rounded corners', google translation) - - "▣": [t: "白方塊內有黑方塊"] # 0x25a3 (en: 'white square containing small black square', google translation) + - "□": [T: "方塊"] # 0x25a1 (en: 'white square', google translation) + - "▢": [T: "圓角方塊"] # 0x25a2 (en: 'white square with rounded corners', google translation) + - "▣": [t: "方塊內有黑方塊"] # 0x25a3 (en: 'white square containing small black square', google translation) - "▤": [t: "方塊內佈滿水平線"] # 0x25a4 (en: 'square with horizontal fill', google translation) - - "▥": [t: "方塊內佈滿垂直線"] # 0x25a5 (en: 'square with vertical fill', google translation) + - "▥": [t: "方塊內佈滿豎線"] # 0x25a5 (en: 'square with vertical fill', google translation) - "▦": [t: "正方形內填充橫豎線"] # 0x25a6 (en: 'square with orthogonal crosshatch fill', google translation) - "▧": [t: "正方形內填充反斜線"] # 0x25a7 (en: 'square with upper left to lower right fill', google translation) - "▨": [t: "正方形內填充正斜線"] # 0x25a8 (en: 'square with upper right to lower left fill', google translation) - "▩": [t: "正方形內填充正反斜線"] # 0x25a9 (en: 'square with diagonal crosshatch fill', google translation) - "▪": [T: "黑小方塊"] # 0x25aa (en: 'black small square', google translation) - "▫": [T: "小方塊"] # 0x25ab (en: 'white small square', google translation) - - "▬": [T: "黑小矩形"] # 0x25ac (en: 'black rectangle', google translation) + - "▬": [T: "黑矩形"] # 0x25ac (en: 'black rectangle', google translation) - "▭": [T: "矩形"] # 0x25ad (en: 'white rectangle', google translation) - - "▮": [T: "黑垂直矩形"] # 0x25ae (en: 'black vertical rectangle', google translation) - - "▯": [T: "垂直矩形"] # 0x25af (en: 'white vertical rectangle', google translation) + - "▮": [T: "黑豎矩形"] # 0x25ae (en: 'black vertical rectangle', google translation) + - "▯": [T: "豎矩形"] # 0x25af (en: 'white vertical rectangle', google translation) - "▰": [T: "黑平行四邊形"] # 0x25b0 (en: 'black parallelogram', google translation) - "▱": [T: "平行四邊形"] # 0x25b1 (en: 'white parallelogram', google translation) - "▲": [T: "黑三角形"] # 0x25b2 (en: 'black up pointing triangle', google translation) @@ -1490,7 +1507,7 @@ - "▸": [T: "黑向右小三角形"] # 0x25b8 (en: 'black right pointing small triangle', google translation) - "▹": [T: "向右小三角形"] # 0x25b9 (en: 'white right pointing small triangle', google translation) - "►": [t: "黑色指右指針"] # 0x25ba (en: 'black right pointing pointer', google translation) - - "▻": [t: "白色指右指針"] # 0x25bb (en: 'white right pointing pointer', google translation) + - "▻": [t: "指右指針"] # 0x25bb (en: 'white right pointing pointer', google translation) - "▼": [T: "黑倒三角形"] # 0x25bc (en: 'black down pointing triangle', google translation) - "▽": [T: "倒三角形"] # 0x25bd (en: 'white down pointing triangle', google translation) - "▾": [T: "黑倒小三角形"] # 0x25be (en: 'black down pointing small triangle', google translation) @@ -1500,15 +1517,15 @@ - "◂": [T: "黑向左小三角形"] # 0x25c2 (en: 'black left pointing small triangle', google translation) - "◃": [T: "向左小三角形"] # 0x25c3 (en: 'white left pointing small triangle', google translation) - "◄": [t: "黑色指左指針"] # 0x25c4 (en: 'black left pointing pointer', google translation) - - "◅": [t: "白色指左指針"] # 0x25c5 (en: 'white left pointing pointer', google translation) + - "◅": [t: "指左指針"] # 0x25c5 (en: 'white left pointing pointer', google translation) - "◆": [t: "黑鑽石"] # 0x25c6 (en: 'black diamond', google translation) - - "◇": [t: "白鑽石"] # 0x25c7 (en: 'white diamond', google translation) - - "◈": [t: "白鑽石含黑小鑽石"] # 0x25c8 (en: 'white diamond containing black small diamond', google translation) + - "◇": [t: "鑽石"] # 0x25c7 (en: 'white diamond', google translation) + - "◈": [t: "鑽石含黑小鑽石"] # 0x25c8 (en: 'white diamond containing black small diamond', google translation) - "◉": [t: "魚眼"] # 0x25c9 (en: 'fisheye', google translation) - - "◊": [t: "白菱形"] # 0x25ca (en: 'lozenge', google translation) - - "○": [t: "白色圓圈"] # 0x25cb (en: 'white circle', google translation) + - "◊": [t: "菱形"] # 0x25ca (en: 'lozenge', google translation) + - "○": [t: "圓圈"] # 0x25cb (en: 'white circle', google translation) - "◌": [t: "虛線圓圈"] # 0x25cc (en: 'dotted circle', google translation) - - "◍": [t: "用垂直填充圓圈"] # 0x25cd (en: 'circle with vertical fill', google translation) + - "◍": [t: "用豎線填充圓圈"] # 0x25cd (en: 'circle with vertical fill', google translation) - "◎": [t: "靶心"] # 0x25ce (en: 'bullseye', google translation) - "●": [t: "黑色圓圈"] # 0x25cf (en: 'black circle', google translation) - "◐": [t: "圓內左半黑"] # 0x25d0 (en: 'circle with left half black', google translation) @@ -1516,57 +1533,97 @@ - "◒": [t: "圓內下半黑"] # 0x25d2 (en: 'circle with lower half black', google translation) - "◓": [t: "圓內上半黑"] # 0x25d3 (en: 'circle with upper half black', google translation) - "◔": [t: "圓內右上黑"] # 0x25d4 (en: 'circle with upper right quadrant black', google translation) - - "◕": [t: "圓內左上白"] # 0x25d5 (en: 'circle with all but upper left quadrant black', google translation) + - "◕": [t: "圓內左上黑"] # 0x25d5 (en: 'circle with all but upper left quadrant black', google translation) - "◖": [t: "左半圓黑"] # 0x25d6 (en: 'left half black circle', google translation) - "◗": [t: "右半圓黑"] # 0x25d7 (en: 'right half black circle', google translation) - - "◘": [t: "inverse bullet"] # 0x25d8 (en: 'inverse bullet', google translation) - - "◙": [t: "inverse white circle"] # 0x25d9 (en: 'inverse white circle', google translation) - - "◚": [t: "上半部逆白色圓圈"] # 0x25da (en: 'upper half inverse white circle', google translation) - - "◛": [t: "下半部逆白色圓圈"] # 0x25db (en: 'lower half inverse white circle', google translation) + - "◘": [t: "標靶反白"] # 0x25d8 (en: 'inverse bullet', google translation) + - "◙": [t: "圓圈反白"] # 0x25d9 (en: 'inverse white circle', google translation) + - "◚": [t: "圓圈反白上半部"] # 0x25da (en: 'upper half inverse white circle', google translation) + - "◛": [t: "圓圈反白下半部"] # 0x25db (en: 'lower half inverse white circle', google translation) - "◜": [t: "左上圓弧"] # 0x25dc (en: 'upper left quadrant circular arc', google translation) - "◝": [t: "右上圓弧"] # 0x25dd (en: 'upper right quadrant circular arc', google translation) - "◞": [t: "右下圓弧"] # 0x25de (en: 'lower right quadrant circular arc', google translation) - "◟": [t: "左下圓弧"] # 0x25df (en: 'lower left quadrant circular arc', google translation) - "◠": [t: "上半圓弧"] # 0x25e0 (en: 'upper half circle', google translation) - "◡": [t: "下半圈弧"] # 0x25e1 (en: 'lower half circle', google translation) - - "◢": [t: "黑色右下三角"] # 0x25e2 (en: 'black lower right triangle', google translation) - - "◣": [t: "黑色左下三角"] # 0x25e3 (en: 'black lower left triangle', google translation) - - "◤": [t: "黑色左上三角"] # 0x25e4 (en: 'black upper left triangle', google translation) - - "◥": [t: "黑色右上三角"] # 0x25e5 (en: 'black upper right triangle', google translation) + - "◢": [t: "黑色右下三角形"] # 0x25e2 (en: 'black lower right triangle', google translation) + - "◣": [t: "黑色左下三角形"] # 0x25e3 (en: 'black lower left triangle', google translation) + - "◤": [t: "黑色左上三角形"] # 0x25e4 (en: 'black upper left triangle', google translation) + - "◥": [t: "黑色右上三角形"] # 0x25e5 (en: 'black upper right triangle', google translation) - "◦": [t: "合成"] # 0x25e6 (en: 'composition', google translation) - "◧": [t: "正方形內左半黑"] # 0x25e7 (en: 'square with left half black', google translation) - "◨": [t: "正方形內右半黑"] # 0x25e8 (en: 'square with right half black', google translation) - "◩": [t: "正方形內左上黑"] # 0x25e9 (en: 'square with upper left half black', google translation) - "◪": [t: "正方形內右下黑"] # 0x25ea (en: 'square with lower right half black', google translation) - - "◫": [t: "正方形內一垂線"] # 0x25eb (en: 'white square with bisecting line', google translation) - - "◬": [t: "白色指上三角內有圓點"] # 0x25ec (en: 'white up pointing triangle with dot', google translation) + - "◫": [t: "正方形內一豎線"] # 0x25eb (en: 'white square with bisecting line', google translation) + - "◬": [t: "指上三角內有圓點"] # 0x25ec (en: 'white up pointing triangle with dot', google translation) - "◭": [t: "指上三角形內左半黑"] # 0x25ed (en: 'up pointing triangle with left half black', google translation) - "◮": [t: "指上三角形內右半黑"] # 0x25ee (en: 'up pointing triangle with right half black', google translation) - "◯": [t: "大圓圈"] # 0x25ef (en: 'large circle', google translation) - - "◰": [t: "白正方形左上象限"] # 0x25f0 (en: 'white square with upper left quadrant', google translation) - - "◱": [t: "白正方形左下象限"] # 0x25f1 (en: 'white square with lower left quadrant', google translation) - - "◲": [t: "白正方形右下象限"] # 0x25f2 (en: 'white square with lower right quadrant', google translation) - - "◳": [t: "白正方形右上象限"] # 0x25f3 (en: 'white square with upper right quadrant', google translation) - - "◴": [t: "白圓圈左上象限"] # 0x25f4 (en: 'white circle with upper left quadrant', google translation) - - "◵": [t: "白圓圈左下象限"] # 0x25f5 (en: 'white circle with lower left quadrant', google translation) - - "◶": [t: "白圓圈右下象限"] # 0x25f6 (en: 'white circle with lower right quadrant', google translation) - - "◷": [t: "白圓圈右上象限"] # 0x25f7 (en: 'white circle with upper right quadrant', google translation) - - "◸": [t: "左上三角"] # 0x25f8 (en: 'upper left triangle', google translation) - - "◹": [t: "右上三角"] # 0x25f9 (en: 'upper right triangle', google translation) - - "◺": [t: "左下三角"] # 0x25fa (en: 'lower left triangle', google translation) - - "◻": [t: "白中方塊"] # 0x25fb (en: 'white medium square', google translation) + - "◰": [t: "正方形左上象限"] # 0x25f0 (en: 'white square with upper left quadrant', google translation) + - "◱": [t: "正方形左下象限"] # 0x25f1 (en: 'white square with lower left quadrant', google translation) + - "◲": [t: "正方形右下象限"] # 0x25f2 (en: 'white square with lower right quadrant', google translation) + - "◳": [t: "正方形右上象限"] # 0x25f3 (en: 'white square with upper right quadrant', google translation) + - "◴": [t: "圓圈左上象限"] # 0x25f4 (en: 'white circle with upper left quadrant', google translation) + - "◵": [t: "圓圈左下象限"] # 0x25f5 (en: 'white circle with lower left quadrant', google translation) + - "◶": [t: "圓圈右下象限"] # 0x25f6 (en: 'white circle with lower right quadrant', google translation) + - "◷": [t: "圓圈右上象限"] # 0x25f7 (en: 'white circle with upper right quadrant', google translation) + - "◸": [t: "左上三角形"] # 0x25f8 (en: 'upper left triangle', google translation) + - "◹": [t: "右上三角形"] # 0x25f9 (en: 'upper right triangle', google translation) + - "◺": [t: "左下三角形"] # 0x25fa (en: 'lower left triangle', google translation) + - "◻": [t: "中方塊"] # 0x25fb (en: 'white medium square', google translation) - "◼": [t: "黑中方塊"] # 0x25fc (en: 'black medium square', google translation) - "◽": [t: "黑中小型方塊"] # 0x25fd (en: 'white medium small square', google translation) - - "◾": [t: "白中小型方塊"] # 0x25fe (en: 'black medium small square', google translation) - - "◿": [t: "右下三角"] # 0x25ff (en: 'lower right triangle', google translation) + - "◾": [t: "中小型方塊"] # 0x25fe (en: 'black medium small square', google translation) + - "◿": [t: "右下三角形"] # 0x25ff (en: 'lower right triangle', google translation) + - "★": [t: "black star"] # 0x2605 + - "☆": [t: "white star"] # 0x2606 + - "☉": [t: "sun"] # 0x2609 + - "☌": [t: "conjunction"] # 0x260c + - "☒": [t: "ballot box with x"] # 0x2612 + - "☽": [t: "waxing moon"] # 0x263d + - "☾": [t: "waning moon"] # 0x263e + - "☿": [t: "mercury"] # 0x263f + - "♀": [t: "female"] # 0x2640 + - "♁": [t: "earth"] # 0x2641 + - "♂": [t: "male"] # 0x2642 + - "♃": [t: "jupiter"] # 0x2643 + - "♄": [t: "saturn"] # 0x2644 + - "♅": [t: "uranus"] # 0x2645 + - "♆": [t: "neptune"] # 0x2646 + - "♇": [t: "pluto"] # 0x2647 + - "♈": [t: "aries"] # 0x2648 + - "♉": [t: "taurus"] # 0x2649 + - "♩": [t: "quarter note"] # 0x2669 + - "♭": [t: "flat"] # 0x266d + - "♮": [t: "natural"] # 0x266e + - "♯": [t: "sharp"] # 0x266f - "♠": [t: "黑心"] # 0x2660 (en: 'black spade suit', google translation) - "♡": [t: "紅心"] # 0x2661 (en: 'white heart suit', google translation) - - "♢": [t: "白方鑽"] # 0x2662 (en: 'white diamond suit', google translation) + - "♢": [t: "方鑽"] # 0x2662 (en: 'white diamond suit', google translation) - "♣": [t: "黑梅花"] # 0x2663 (en: 'black club suit', google translation) - - "♤": [t: "白黑心"] # 0x2664 (en: 'white spade suit', google translation) + - "♤": [t: "黑心"] # 0x2664 (en: 'white spade suit', google translation) - "♥": [t: "黑紅心"] # 0x2665 (en: 'black heart suit', google translation) - "♦": [t: "黑方鑽"] # 0x2666 (en: 'black diamond suit', google translation) - - "♧": [t: "白梅花"] # 0x2667 (en: 'white club suit', google translation) + - "♧": [t: "梅花"] # 0x2667 (en: 'white club suit', google translation) + - "⚀": [t: "die face 1"] # 0x2680 + - "⚁": [t: "die face 2"] # 0x2681 + - "⚂": [t: "die face 3"] # 0x2682 + - "⚃": [t: "die face 4"] # 0x2683 + - "⚄": [t: "die face 5"] # 0x2684 + - "⚅": [t: "die face 6"] # 0x2685 + - "⚆": [t: "white circle with dot right"] # 0x2686 + - "⚇": [t: "white circle wiht two dots"] # 0x2687 + - "⚈": [t: "black circle with dot right"] # 0x2688 + - "⚉": [t: "black circle wiht two dots"] # 0x2689 + - "⚪": [t: "medium white circle"] # 0x26aa + - "⚫": [t: "medium black circle"] # 0x26ab + - "⚬": [t: "medium small white circle"] # 0x26ac + - "⚲": [t: "neuter"] # 0x26b2 + - "✓": [t: "check mark"] # 0x2713 + - "✠": [t: "maltese cross"] # 0x2720 + - "✪": [t: "circled white star"] # 0x272a + - "✶": [t: "six pionted black star"] # 0x2736 - "❨": [t: "中左括號"] # 0x2768 (en: 'medium left parentheses ornament', google translation) - "❩": [t: "中右括號"] # 0x2769 (en: 'medium right parentheses ornament', google translation) - "❪": [t: "中扁平左括"] # 0x276a (en: 'medium flattened left parentheses ornament', google translation) @@ -1581,36 +1638,36 @@ - "❳": [t: "輕右龜殼"] # 0x2773 (en: 'light right tortoise shell bracket ornament', google translation) - "❴": [t: "中左大括"] # 0x2774 (en: 'medium left brace ornament', google translation) - "❵": [t: "中右大括"] # 0x2775 (en: 'medium right brace ornament', google translation) - - "❶": [T: "黑圈內1"] # 0x2776 (en: 'black circled one', google translation) - - "❷": [T: "黑圈內2"] # 0x2777 (en: 'black circled two', google translation) - - "❸": [T: "黑圈內3"] # 0x2778 (en: 'black circled three', google translation) - - "❹": [T: "黑圈內4"] # 0x2779 (en: 'black circled four', google translation) - - "❺": [T: "黑圈內5"] # 0x277a (en: 'black circled five', google translation) - - "❻": [T: "黑圈內6"] # 0x277b (en: 'black circled six', google translation) - - "❼": [T: "黑圈內7"] # 0x277c (en: 'black circled seven', google translation) - - "❽": [T: "黑圈內8"] # 0x277d (en: 'black circled eight', google translation) - - "❾": [T: "黑圈內9"] # 0x277e (en: 'black circled nine', google translation) - - "❿": [T: "黑圈內10"] # 0x277f (en: 'black circled ten', google translation) - - "➀": [T: "圈圈內1"] # 0x2780 (en: 'circled sans serif one', google translation) - - "➁": [T: "圈圈內2"] # 0x2781 (en: 'circled sans serif two', google translation) - - "➂": [T: "圈圈內3"] # 0x2782 (en: 'circled sans serif three', google translation) - - "➃": [T: "圈圈內4"] # 0x2783 (en: 'circled sans serif four', google translation) - - "➄": [T: "圈圈內5"] # 0x2784 (en: 'circled sans serif five', google translation) - - "➅": [T: "圈圈內6"] # 0x2785 (en: 'circled sans serif six', google translation) - - "➆": [T: "圈圈內7"] # 0x2786 (en: 'circled sans serif seven', google translation) - - "➇": [T: "圈圈內8"] # 0x2787 (en: 'circled sans serif eight', google translation) - - "➈": [T: "圈圈內9"] # 0x2788 (en: 'circled sans serif nine', google translation) - - "➉": [T: "圈圈內10"] # 0x2789 (en: 'circled sans serif ten', google translation) - - "➊": [T: "黑圈內1"] # 0x278a (en: 'black circled sans serif one', google translation) - - "➋": [T: "黑圈內2"] # 0x278b (en: 'black circled sans serif two', google translation) - - "➌": [T: "黑圈內3"] # 0x278c (en: 'black circled sans serif three', google translation) - - "➍": [T: "黑圈內4"] # 0x278d (en: 'black circled sans serif four', google translation) - - "➎": [T: "黑圈內5"] # 0x278e (en: 'black circled sans serif five', google translation) - - "➏": [T: "黑圈內6"] # 0x278f (en: 'black circled sans serif six', google translation) - - "➐": [T: "黑圈內7"] # 0x2790 (en: 'black circled sans serif seven', google translation) - - "➑": [T: "黑圈內8"] # 0x2791 (en: 'black circled sans serif eight', google translation) - - "➒": [T: "黑圈內9"] # 0x2792 (en: 'black circled sans serif nine', google translation) - - "➓": [T: "黑圈內10"] # 0x2793 (en: 'black circled sans serif ten', google translation) + - "❶": [T: "黑圈圈1"] # 0x2776 (en: 'black circled one', google translation) + - "❷": [T: "黑圈圈2"] # 0x2777 (en: 'black circled two', google translation) + - "❸": [T: "黑圈圈3"] # 0x2778 (en: 'black circled three', google translation) + - "❹": [T: "黑圈圈4"] # 0x2779 (en: 'black circled four', google translation) + - "❺": [T: "黑圈圈5"] # 0x277a (en: 'black circled five', google translation) + - "❻": [T: "黑圈圈6"] # 0x277b (en: 'black circled six', google translation) + - "❼": [T: "黑圈圈7"] # 0x277c (en: 'black circled seven', google translation) + - "❽": [T: "黑圈圈8"] # 0x277d (en: 'black circled eight', google translation) + - "❾": [T: "黑圈圈9"] # 0x277e (en: 'black circled nine', google translation) + - "❿": [T: "黑圈圈10"] # 0x277f (en: 'black circled ten', google translation) + - "➀": [T: "圈圈1"] # 0x2780 (en: 'circled sans serif one', google translation) + - "➁": [T: "圈圈2"] # 0x2781 (en: 'circled sans serif two', google translation) + - "➂": [T: "圈圈3"] # 0x2782 (en: 'circled sans serif three', google translation) + - "➃": [T: "圈圈4"] # 0x2783 (en: 'circled sans serif four', google translation) + - "➄": [T: "圈圈5"] # 0x2784 (en: 'circled sans serif five', google translation) + - "➅": [T: "圈圈6"] # 0x2785 (en: 'circled sans serif six', google translation) + - "➆": [T: "圈圈7"] # 0x2786 (en: 'circled sans serif seven', google translation) + - "➇": [T: "圈圈8"] # 0x2787 (en: 'circled sans serif eight', google translation) + - "➈": [T: "圈圈9"] # 0x2788 (en: 'circled sans serif nine', google translation) + - "➉": [T: "圈圈10"] # 0x2789 (en: 'circled sans serif ten', google translation) + - "➊": [T: "黑圈圈1"] # 0x278a (en: 'black circled sans serif one', google translation) + - "➋": [T: "黑圈圈2"] # 0x278b (en: 'black circled sans serif two', google translation) + - "➌": [T: "黑圈圈3"] # 0x278c (en: 'black circled sans serif three', google translation) + - "➍": [T: "黑圈圈4"] # 0x278d (en: 'black circled sans serif four', google translation) + - "➎": [T: "黑圈圈5"] # 0x278e (en: 'black circled sans serif five', google translation) + - "➏": [T: "黑圈圈6"] # 0x278f (en: 'black circled sans serif six', google translation) + - "➐": [T: "黑圈圈7"] # 0x2790 (en: 'black circled sans serif seven', google translation) + - "➑": [T: "黑圈圈8"] # 0x2791 (en: 'black circled sans serif eight', google translation) + - "➒": [T: "黑圈圈9"] # 0x2792 (en: 'black circled sans serif nine', google translation) + - "➓": [T: "黑圈圈10"] # 0x2793 (en: 'black circled sans serif ten', google translation) - "➔": [t: "厚重向右箭頭"] # 0x2794 (en: 'heavy wide-headed rightwards arrow', google translation) - "➕": [t: "重加標誌"] # 0x2795 (en: 'heavy plus sign', google translation) - "➖": [t: "重減標誌"] # 0x2796 (en: 'heavy minus sign', google translation) @@ -1654,7 +1711,7 @@ - "➽": [t: "重楔形尾右箭頭"] # 0x27bd (en: 'heavy wedge-tailed rightwards arrow', google translation) - "➾": [t: "向右開箭頭"] # 0x27be (en: 'open-outlined rightwards arrow', google translation) - "⟀": [t: "三維角"] # 0x27c0 (en: 'three dimensional angle', google translation) - - "⟁": [t: "白色三角形內小白色三角形"] # 0x27c1 (en: 'white triangle containing small white triangle', google translation) + - "⟁": [t: "三角形內小三角形"] # 0x27c1 (en: 'white triangle containing small white triangle', google translation) - "⟂": # 0x27c2 - test: if: "$Verbosity!='Terse'" @@ -1675,13 +1732,13 @@ - "⟇": [T: "或裡面圓點"] # 0x27c7 (en: 'or with dot inside', google translation) - "⟈": [t: "reverse solidus preceding subset"] # 0x27c8 (en: 'reverse solidus preceding subset', google translation) - "⟉": [t: "superset preceding solidus"] # 0x27c9 (en: 'superset preceding solidus', google translation) - - "⟊": [t: "垂線有水平劃記"] # 0x27ca (en: 'vertical bar with horizontal stroke', google translation) + - "⟊": [t: "豎線有水平劃記"] # 0x27ca (en: 'vertical bar with horizontal stroke', google translation) - "⟋": [t: "數學上升對角線"] # 0x27cb (en: 'mathematical rising diagonal', google translation) - "⟌": [T: "長除法"] # 0x27cc (en: 'long division', google translation) - "⟍": [t: "數學下降對角線"] # 0x27cd (en: 'mathematical falling diagonal', google translation) - "⟎": [T: "方塊邏輯和"] # 0x27ce (en: 'squared logical and', google translation) - "⟏": [T: "方塊邏輯或"] # 0x27cf (en: 'squared logical or', google translation) - - "⟐": [t: "白鑽內圓點"] # 0x27d0 (en: 'white diamond with centered dot', google translation) + - "⟐": [t: "鑽內圓點"] # 0x27d0 (en: 'white diamond with centered dot', google translation) - "⟑": [t: "且裡面點"] # 0x27d1 (en: 'and with dot', google translation) - "⟒": [t: "向上開放的元素"] # 0x27d2 (en: 'element of opening upwards', google translation) - "⟓": [t: "右下角帶有點"] # 0x27d3 (en: 'lower right corner with dot', google translation) @@ -1698,11 +1755,11 @@ - "⟞": [t: "長左釘"] # 0x27de (en: 'long left tack', google translation) - "⟟": [t: "圓在釘上"] # 0x27df (en: 'up tack with circle above', google translation) - "⟠": [t: "lozenge被水平線隔開"] # 0x27e0 (en: 'lozenge divided by horizontal rule', google translation) - - "⟡": [t: "白色凹面鑽石"] # 0x27e1 (en: 'white concave sided diamond', google translation) - - "⟢": [t: "白色凹面鑽石左滴答"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick', google translation) - - "⟣": [t: "白色的凹面鑽石右滴答"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick', google translation) - - "⟤": [t: "白色正方形左有記號"] # 0x27e4 (en: 'white square with leftwards tick', google translation) - - "⟥": [t: "白色正方形右有記號"] # 0x27e5 (en: 'white square with rightwards tick', google translation) + - "⟡": [t: "凹面鑽石"] # 0x27e1 (en: 'white concave sided diamond', google translation) + - "⟢": [t: "凹面鑽石左滴答"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick', google translation) + - "⟣": [t: "凹面鑽石右滴答"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick', google translation) + - "⟤": [t: "正方形左有記號"] # 0x27e4 (en: 'white square with leftwards tick', google translation) + - "⟥": [t: "正方形右有記號"] # 0x27e5 (en: 'white square with rightwards tick', google translation) - "⟦": [t: "左白中括"] # 0x27e6 (en: 'left white square bracket', google translation) - "⟧": [t: "右白中括"] # 0x27e7 (en: 'right white square bracket', google translation) - "⟨": [t: "左角括"] # 0x27e8 (en: 'left angle bracket', google translation) @@ -1729,11 +1786,11 @@ - "⟽": [t: "起自豎線長粗左箭頭"] # 0x27fd (en: 'long leftwards double arrow from bar', google translation) - "⟾": [t: "起自豎線長粗右箭頭"] # 0x27fe (en: 'long rightwards double arrow from bar', google translation) - "⟿": [t: "長向右花箭頭"] # 0x27ff (en: 'long rightwards squiggle arrow', google translation) - - "⤀": [t: "向右帶有垂線的雙箭頭"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke', google translation) - - "⤁": [t: "向右帶有雙垂線的雙箭頭"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke', google translation) - - "⤂": [t: "向左帶有垂線的粗箭頭"] # 0x2902 (en: 'leftwards double arrow with vertical stroke', google translation) - - "⤃": [t: "向右帶有垂線的粗箭頭"] # 0x2903 (en: 'rightwards double arrow with vertical stroke', google translation) - - "⤄": [t: "左右帶有垂線的粗箭頭"] # 0x2904 (en: 'left right double arrow with vertical stroke', google translation) + - "⤀": [t: "向右帶有豎線的雙箭頭"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke', google translation) + - "⤁": [t: "向右帶有雙豎線的雙箭頭"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke', google translation) + - "⤂": [t: "向左帶有豎線的粗箭頭"] # 0x2902 (en: 'leftwards double arrow with vertical stroke', google translation) + - "⤃": [t: "向右帶有豎線的粗箭頭"] # 0x2903 (en: 'rightwards double arrow with vertical stroke', google translation) + - "⤄": [t: "左右帶有豎線的粗箭頭"] # 0x2904 (en: 'left right double arrow with vertical stroke', google translation) - "⤅": [t: "起自豎線向右雙箭頭"] # 0x2905 (en: 'rightwards two headed arrow from bar', google translation) - "⤆": [t: "起自豎線向左粗箭頭"] # 0x2906 (en: 'leftwards double arrow from bar', google translation) - "⤇": [t: "起自豎線向右粗箭頭"] # 0x2907 (en: 'rightwards double arrow from bar', google translation) @@ -1749,11 +1806,11 @@ - "⤑": [t: "向右虛線箭頭"] # 0x2911 (en: 'rightwards arrow with dotted stem', google translation) - "⤒": [t: "向上箭頭到橫線"] # 0x2912 (en: 'upwards arrow to bar', google translation) - "⤓": [t: "向下箭頭到橫線"] # 0x2913 (en: 'downwards arrow to bar', google translation) - - "⤔": [t: "向右箭頭,帶有尾部和垂線"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke', google translation) - - "⤕": [t: "向右箭頭,帶有尾巴和雙垂線"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke', google translation) + - "⤔": [t: "向右箭頭,帶有尾部和豎線"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke', google translation) + - "⤕": [t: "向右箭頭,帶有尾巴和雙豎線"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke', google translation) - "⤖": [t: "向右帶尾巴的雙頭箭頭"] # 0x2916 (en: 'rightwards two headed arrow with tail', google translation) - - "⤗": [t: "向右有尾帶有垂線的雙頭箭頭"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke', google translation) - - "⤘": [t: "向右有尾帶有雙垂線的雙頭箭頭"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke', google translation) + - "⤗": [t: "向右有尾帶有豎線的雙頭箭頭"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke', google translation) + - "⤘": [t: "向右有尾帶有雙豎線的雙頭箭頭"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke', google translation) - "⤙": [t: "左箭頭尾巴"] # 0x2919 (en: 'leftwards arrow tail', google translation) - "⤚": [t: "向右箭頭尾巴"] # 0x291a (en: 'rightwards arrow tail', google translation) - "⤛": [t: "左箭頭尾巴"] # 0x291b (en: 'leftwards double arrow tail', google translation) @@ -1943,7 +2000,7 @@ - "⧓": [t: "黑色領結"] # 0x29d3 (en: 'black bowtie', google translation) - "⧔": [t: "剩下的半黑色"] # 0x29d4 (en: 'times with left half black', google translation) - "⧕": [t: "右半黑"] # 0x29d5 (en: 'times with right half black', google translation) - - "⧖": [T: "白色沙漏"] # 0x29d6 (en: 'white hourglass', google translation) + - "⧖": [T: "沙漏"] # 0x29d6 (en: 'white hourglass', google translation) - "⧗": [T: "黑色沙漏"] # 0x29d7 (en: 'black hourglass', google translation) - "⧘": [t: "左wiggly籬笆"] # 0x29d8 (en: 'left wiggly fence', google translation) - "⧙": [t: "右wiggly柵欄"] # 0x29d9 (en: 'right wiggly fence', google translation) @@ -1965,7 +2022,7 @@ - "⧩": [t: "向下指向三角形,右半黑"] # 0x29e9 (en: 'down pointing triangle with right half black', google translation) - "⧪": [t: "黑色鑽石和下箭"] # 0x29ea (en: 'black diamond with down arrow', google translation) - "⧫": [t: "黑色片"] # 0x29eb (en: 'black lozenge', google translation) - - "⧬": [t: "白色圓圈和向下箭頭"] # 0x29ec (en: 'white circle with down arrow', google translation) + - "⧬": [t: "圓圈和向下箭頭"] # 0x29ec (en: 'white circle with down arrow', google translation) - "⧭": [t: "黑色圓圈和向下箭頭"] # 0x29ed (en: 'black circle with down arrow', google translation) - "⧮": [t: "錯誤的白色廣場"] # 0x29ee (en: 'error-barred white square', google translation) - "⧯": [t: "錯誤的黑色廣場"] # 0x29ef (en: 'error-barred black square', google translation) @@ -2032,7 +2089,11 @@ - "⨬": [t: "減去點升高的點數"] # 0x2a2c (en: 'minus sign with rising dots', google translation) - "⨭": [t: "加上左半圓圈"] # 0x2a2d (en: 'plus sign in left half circle', google translation) - "⨮": [t: "加上右半圈登錄"] # 0x2a2e (en: 'plus sign in right half circle', google translation) - - "⨯": [t: "跨產品"] # 0x2a2f (en: 'cross product', google translation) + - "⨯": # 0x2a2f + - test: + if: "$Verbosity='Terse'" + then: [t: "cross"] + else: [t: "cross product"] - "⨰": [t: "上面有點的乘法標誌"] # 0x2a30 (en: 'multiplication sign with dot above', google translation) - "⨱": [t: "帶有underbar的乘法標誌"] # 0x2a31 (en: 'multiplication sign with underbar', google translation) - "⨲": [t: "底部關閉的半程產品"] # 0x2a32 (en: 'semidirect product with bottom closed', google translation) @@ -2047,6 +2108,7 @@ - "⨻": [t: "三角形中的乘法標誌"] # 0x2a3b (en: 'multiplication sign in triangle', google translation) - "⨼": [t: "內部產品"] # 0x2a3c (en: 'interior product', google translation) - "⨽": [t: "右內部產品"] # 0x2a3d (en: 'righthand interior product', google translation) + - "⨾": [t: "z notation relational composition"] # 0x2a3e - "⨿": [t: "合併或合併"] # 0x2a3f (en: 'amalgamation or coproduct', google translation) - "⩀": [t: "與點的交點"] # 0x2a40 (en: 'intersection with dot', google translation) - "⩁": [t: "與減號的結合"] # 0x2a41 (en: 'union with minus sign', google translation) @@ -2223,8 +2285,8 @@ - "⫬": [t: "雙沖程沒有簽名"] # 0x2aec (en: 'double stroke not sign', google translation) - "⫭": [t: "逆轉雙沖程沒有簽名"] # 0x2aed (en: 'reversed double stroke not sign', google translation) - "⫮": [t: "不與反向的否定斜線分開"] # 0x2aee (en: 'does not divide with reversed negation slash', google translation) - - "⫯": [t: "垂直線,上面有圓"] # 0x2aef (en: 'vertical line with circle above', google translation) - - "⫰": [t: "垂直線,下面有圓"] # 0x2af0 (en: 'vertical line with circle below', google translation) + - "⫯": [t: "豎線,上面有圓"] # 0x2aef (en: 'vertical line with circle above', google translation) + - "⫰": [t: "豎線,下面有圓"] # 0x2af0 (en: 'vertical line with circle below', google translation) - "⫱": [t: "下面的圓形下方"] # 0x2af1 (en: 'down tack with circle below', google translation) - "⫲": [t: "與水平衝程平行"] # 0x2af2 (en: 'parallel with horizontal stroke', google translation) - "⫳": [t: "與tilde操作員平行"] # 0x2af3 (en: 'parallel with tilde operator', google translation) @@ -2238,8 +2300,8 @@ - "⫻": [t: "三固體二元關係"] # 0x2afb (en: 'triple solidus binary relation', google translation) - "⫼": [t: "大三重垂直桿操作員"] # 0x2afc (en: 'large triple vertical bar operator', google translation) - "⫽": [t: "雙固體操作員"] # 0x2afd (en: 'double solidus operator', google translation) - - "⫾": [t: "白色垂直條"] # 0x2afe (en: 'white vertical bar', google translation) - - "⫿": [t: "白色垂直條"] # 0x2aff (en: 'white vertical bar', google translation) + - "⫾": [t: "垂直條"] # 0x2afe (en: 'white vertical bar', google translation) + - "⫿": [t: "垂直條"] # 0x2aff (en: 'white vertical bar', google translation) - "⬀": [t: "東北白色箭頭"] # 0x2b00 (en: 'north east white arrow', google translation) - "⬁": [t: "西北白色箭頭"] # 0x2b01 (en: 'north west white arrow', google translation) - "⬂": [t: "東南白色箭頭"] # 0x2b02 (en: 'south east white arrow', google translation) @@ -2267,70 +2329,70 @@ - "⬘": [t: "鑽石上半黑色"] # 0x2b18 (en: 'diamond with top half black', google translation) - "⬙": [t: "鑽石與下半部分"] # 0x2b19 (en: 'diamond with bottom half black', google translation) - "⬚": [t: "盒子"] # 0x2b1a (en: 'box', google translation) - - "⬛": [t: "黑色大正方形"] # 0x2b1b (en: 'black large square', google translation) - - "⬜": [t: "白色大正方形"] # 0x2b1c (en: 'white large square', google translation) - - "⬝": [t: "黑色非常小的正方形"] # 0x2b1d (en: 'black very small square', google translation) - - "⬞": [t: "白色非常小的正方形"] # 0x2b1e (en: 'white very small square', google translation) - - "⬟": [t: "黑色五角大樓"] # 0x2b1f (en: 'black pentagon', google translation) - - "⬠": [t: "白五角大樓"] # 0x2b20 (en: 'white pentagon', google translation) - - "⬡": [t: "白色六角形"] # 0x2b21 (en: 'white hexagon', google translation) - - "⬢": [t: "黑色六角形"] # 0x2b22 (en: 'black hexagon', google translation) - - "⬣": [t: "水平黑色六角形"] # 0x2b23 (en: 'horizontal black hexagon', google translation) + - "⬛": [t: "黑大正方形"] # 0x2b1b (en: 'black large square', google translation) + - "⬜": [t: "白大正方形"] # 0x2b1c (en: 'white large square', google translation) + - "⬝": [t: "黑極小正方形"] # 0x2b1d (en: 'black very small square', google translation) + - "⬞": [t: "極小正方形"] # 0x2b1e (en: 'white very small square', google translation) + - "⬟": [t: "黑五角形"] # 0x2b1f (en: 'black pentagon', google translation) + - "⬠": [t: "五角形"] # 0x2b20 (en: 'white pentagon', google translation) + - "⬡": [t: "六角形"] # 0x2b21 (en: 'white hexagon', google translation) + - "⬢": [t: "黑六角形"] # 0x2b22 (en: 'black hexagon', google translation) + - "⬣": [t: "水平黑六角形"] # 0x2b23 (en: 'horizontal black hexagon', google translation) - "⬤": [t: "黑色大圓圈"] # 0x2b24 (en: 'black large circle', google translation) - - "⬥": [t: "黑色中鑽"] # 0x2b25 (en: 'black medium diamond', google translation) - - "⬦": [t: "白色中型鑽石"] # 0x2b26 (en: 'white medium diamond', google translation) - - "⬧": [t: "黑色中型潤滑油"] # 0x2b27 (en: 'black medium lozenge', google translation) - - "⬨": [t: "白色中型潤滑脂"] # 0x2b28 (en: 'white medium lozenge', google translation) - - "⬩": [t: "黑色小鑽石"] # 0x2b29 (en: 'black small diamond', google translation) - - "⬪": [t: "黑色的小烤"] # 0x2b2a (en: 'black small lozenge', google translation) - - "⬫": [t: "白色小烤"] # 0x2b2b (en: 'white small lozenge', google translation) - - "⬬": [t: "黑色水平橢圓"] # 0x2b2c (en: 'black horizontal ellipse', google translation) - - "⬭": [t: "白色水平橢圓"] # 0x2b2d (en: 'white horizontal ellipse', google translation) - - "⬮": [t: "黑色垂直橢圓"] # 0x2b2e (en: 'black vertical ellipse', google translation) - - "⬯": [t: "白色垂直橢圓"] # 0x2b2f (en: 'white vertical ellipse', google translation) + - "⬥": [t: "黑中鑽"] # 0x2b25 (en: 'black medium diamond', google translation) + - "⬦": [t: "中鑽"] # 0x2b26 (en: 'white medium diamond', google translation) + - "⬧": [t: "黑中菱形"] # 0x2b27 (en: 'black medium lozenge', google translation) + - "⬨": [t: "中菱形"] # 0x2b28 (en: 'white medium lozenge', google translation) + - "⬩": [t: "黑小鑽"] # 0x2b29 (en: 'black small diamond', google translation) + - "⬪": [t: "黑小菱形"] # 0x2b2a (en: 'black small lozenge', google translation) + - "⬫": [t: "小菱形"] # 0x2b2b (en: 'white small lozenge', google translation) + - "⬬": [t: "黑橫擺橢圓"] # 0x2b2c (en: 'black horizontal ellipse', google translation) + - "⬭": [t: "橫擺橢圓"] # 0x2b2d (en: 'white horizontal ellipse', google translation) + - "⬮": [t: "黑豎擺橢圓"] # 0x2b2e (en: 'black vertical ellipse', google translation) + - "⬯": [t: "豎擺橢圓"] # 0x2b2f (en: 'white vertical ellipse', google translation) - "⬰": [t: "左箭頭有小圓圈"] # 0x2b30 (en: 'left arrow with small circle', google translation) - - "⬱": [t: "三個左箭頭"] # 0x2b31 (en: 'three leftwards arrows', google translation) - - "⬲": [t: "左箭頭帶有圓圈"] # 0x2b32 (en: 'left arrow with circled plus', google translation) - - "⬳": [t: "長左彎曲箭頭"] # 0x2b33 (en: 'long leftwards squiggle arrow', google translation) - - "⬴": [t: "左兩個帶有垂直衝程的頭箭頭"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke', google translation) - - "⬵": [t: "左兩個帶有雙垂直衝程的頭箭頭"] # 0x2b35 (en: 'leftwards two headed arrow with double vertical stroke', google translation) - - "⬶": [t: "從酒吧左下有兩個頭箭頭"] # 0x2b36 (en: 'leftwards two headed arrow from bar', google translation) - - "⬷": [t: "左兩個頭三翼箭頭"] # 0x2b37 (en: 'leftwards two headed triple dash arrow', google translation) - - "⬸": [t: "左箭頭帶有虛線"] # 0x2b38 (en: 'leftwards arrow with dotted stem', google translation) - - "⬹": [t: "左箭頭,帶有垂直衝程"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke', google translation) - - "⬺": [t: "左箭頭,帶有雙垂直衝程"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke', google translation) - - "⬻": [t: "向左兩個帶有尾巴的頭箭頭"] # 0x2b3b (en: 'leftwards two headed arrow with tail', google translation) - - "⬼": [t: "向左兩個頭箭頭,帶有垂直衝程"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke', google translation) - - "⬽": [t: "左兩個頭箭,帶有雙垂直行程"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke', google translation) + - "⬱": [t: "三重箭頭"] # 0x2b31 (en: 'three leftwards arrows', google translation) + - "⬲": [t: "左箭頭有圓圈加號"] # 0x2b32 (en: 'left arrow with circled plus', google translation) + - "⬳": [t: "長左波浪箭頭"] # 0x2b33 (en: 'long leftwards squiggle arrow', google translation) + - "⬴": [t: "左雙箭頭帶有豎線"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke', google translation) + - "⬵": [t: "左雙箭頭雙豎線"] # 0x2b35 (en: 'leftwards two headed arrow with double vertical stroke', google translation) + - "⬶": [t: "從豎線出發往左雙箭頭"] # 0x2b36 (en: 'leftwards two headed arrow from bar', google translation) + - "⬷": [t: "左雙箭頭虛線有箭尾"] # 0x2b37 (en: 'leftwards two headed triple dash arrow', google translation) + - "⬸": [t: "左箭頭帶有虛線箭身"] # 0x2b38 (en: 'leftwards arrow with dotted stem', google translation) + - "⬹": [t: "左箭頭帶有豎線箭尾"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke', google translation) + - "⬺": [t: "左箭頭雙豎線箭尾"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke', google translation) + - "⬻": [t: "左雙箭頭帶有箭尾"] # 0x2b3b (en: 'leftwards two headed arrow with tail', google translation) + - "⬼": [t: "向左雙箭頭帶有豎線箭尾"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke', google translation) + - "⬽": [t: "向左雙箭頭雙豎線箭尾"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke', google translation) - "⬾": [t: "向左箭頭穿過x"] # 0x2b3e (en: 'leftwards arrow through x', google translation) - "⬿": [t: "箭頭直接向左指向"] # 0x2b3f (en: 'wave arrow pointing directly left', google translation) - - "⭀": [t: "等於向左箭頭上方的標誌"] # 0x2b40 (en: 'equals sign above leftwards arrow', google translation) - - "⭁": [t: "向左箭頭上方反向tilde操作員"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow', google translation) - - "⭂": [t: "反向上方的左箭頭幾乎等於"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to', google translation) - - "⭃": [t: "向右箭頭大於大於"] # 0x2b43 (en: 'rightwards arrow through greater than', google translation) + - "⭀": [t: "向左箭頭上方有等號"] # 0x2b40 (en: 'equals sign above leftwards arrow', google translation) + - "⭁": [t: "向左箭頭上方有tilde"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow', google translation) + - "⭂": [t: "左箭頭下方有逆向幾乎等於"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to', google translation) + - "⭃": [t: "向右箭頭貫穿大於大於"] # 0x2b43 (en: 'rightwards arrow through greater than', google translation) - "⭄": [t: "向右箭頭穿過超集"] # 0x2b44 (en: 'rightwards arrow through superset', google translation) - - "⭅": [t: "左四倍箭頭"] # 0x2b45 (en: 'leftwards quadruple arrow', google translation) + - "⭅": [t: "向左四重箭頭"] # 0x2b45 (en: 'leftwards quadruple arrow', google translation) - "⭆": [t: "向右四倍箭頭"] # 0x2b46 (en: 'rightwards quadruple arrow', google translation) - - "⭇": [t: "向右箭頭上方反向tilde操作員"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow', google translation) - - "⭈": [t: "反向上方的右箭頭幾乎等於"] # 0x2b48 (en: 'rightwards arrow above reverse almost equal to', google translation) - - "⭉": [t: "tilde操作員在左上方箭頭上方"] # 0x2b49 (en: 'tilde operator above leftwards arrow', google translation) - - "⭊": [t: "左箭頭幾乎等於"] # 0x2b4a (en: 'leftwards arrow above almost equal to', google translation) - - "⭋": [t: "反向tilde操作員上方的左箭頭"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator', google translation) - - "⭌": [t: "右箭頭上方的箭頭操作員上方"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator', google translation) - - "⭐": [t: "白色中等星星"] # 0x2b50 (en: 'white medium star', google translation) - - "⭑": [t: "黑色小星星"] # 0x2b51 (en: 'black small star', google translation) - - "⭒": [t: "白色的小星星"] # 0x2b52 (en: 'white small star', google translation) - - "⭓": [t: "黑色右指向五角大樓"] # 0x2b53 (en: 'black right pointing pentagon', google translation) - - "⭔": [t: "白色右指向五角大樓"] # 0x2b54 (en: 'white right pointing pentagon', google translation) - - "⭕": [t: "沉重的大圓圈"] # 0x2b55 (en: 'heavy large circle', google translation) - - "⭖": [t: "內部有橢圓形的重橢圓形"] # 0x2b56 (en: 'heavy oval with oval inside', google translation) - - "⭗": [t: "內部有圓圈的重圓"] # 0x2b57 (en: 'heavy circle with circle inside', google translation) - - "⭘": [t: "沉重的圓圈"] # 0x2b58 (en: 'heavy circle', google translation) - - "⭙": [t: "沉重盤旋的鹽鹽"] # 0x2b59 (en: 'heavy circled saltire', google translation) + - "⭇": [t: "向右箭頭上方有tilde"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow', google translation) + - "⭈": [t: "右箭頭下方有幾乎等於"] # 0x2b48 (en: 'rightwards arrow above reverse almost equal to', google translation) + - "⭉": [t: "左箭頭上方有tilde"] # 0x2b49 (en: 'tilde operator above leftwards arrow', google translation) + - "⭊": [t: "左箭頭下方有幾乎等於"] # 0x2b4a (en: 'leftwards arrow above almost equal to', google translation) + - "⭋": [t: "左箭頭下方有tilde"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator', google translation) + - "⭌": [t: "右箭頭下方有tilde"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator', google translation) + - "⭐": [t: "白中星星"] # 0x2b50 (en: 'white medium star', google translation) + - "⭑": [t: "黑小星星"] # 0x2b51 (en: 'black small star', google translation) + - "⭒": [t: "小星星"] # 0x2b52 (en: 'white small star', google translation) + - "⭓": [t: "黑向右五角形"] # 0x2b53 (en: 'black right pointing pentagon', google translation) + - "⭔": [t: "向右五角形"] # 0x2b54 (en: 'white right pointing pentagon', google translation) + - "⭕": [t: "粗大圓"] # 0x2b55 (en: 'heavy large circle', google translation) + - "⭖": [t: "雙重橢圓形"] # 0x2b56 (en: 'heavy oval with oval inside', google translation) + - "⭗": [t: "雙重圓"] # 0x2b57 (en: 'heavy circle with circle inside', google translation) + - "⭘": [t: "粗圓"] # 0x2b58 (en: 'heavy circle', google translation) + - "⭙": [t: "粗十字圓"] # 0x2b59 (en: 'heavy circled saltire', google translation) - "⸀": [t: "直角替代標記"] # 0x2e00 (en: 'right angle substitution marker', google translation) - "⸁": [t: "直角虛線替代標記"] # 0x2e01 (en: 'right angle dotted substitution marker', google translation) - "⸂": [t: "左替代括號"] # 0x2e02 (en: 'left substitution bracket', google translation) - - "⸃": [t: "正確的替換括號"] # 0x2e03 (en: 'right substitution bracket', google translation) + - "⸃": [t: "右替代括號"] # 0x2e03 (en: 'right substitution bracket', google translation) - "⸄": [t: "左虛線替代括號"] # 0x2e04 (en: 'left dotted substitution bracket', google translation) - "⸅": [t: "右虛線替代括號"] # 0x2e05 (en: 'right dotted substitution bracket', google translation) - "⸆": [t: "提出的插值標記"] # 0x2e06 (en: 'raised interpolation marker', google translation) @@ -2416,36 +2478,36 @@ - "㉍": [t: "在黑色廣場上盤旋六十"] # 0x324d (en: 'circled number sixty on black square', google translation) - "㉎": [t: "在黑色廣場上盤旋七十"] # 0x324e (en: 'circled number seventy on black square', google translation) - "㉏": [t: "在黑色廣場上盤旋的數字"] # 0x324f (en: 'circled number eighty on black square', google translation) - - "㉑": [T: "圈圈內21"] # 0x3251 (en: 'circled number twenty one', google translation) - - "㉒": [T: "圈圈內22"] # 0x3252 (en: 'circled number twenty two', google translation) - - "㉓": [T: "圈圈內23"] # 0x3253 (en: 'circled number twenty three', google translation) - - "㉔": [T: "圈圈內24"] # 0x3254 (en: 'circled number twenty four', google translation) - - "㉕": [T: "圈圈內25"] # 0x3255 (en: 'circled number twenty five', google translation) - - "㉖": [T: "圈圈內26"] # 0x3256 (en: 'circled number twenty six', google translation) - - "㉗": [T: "圈圈內27"] # 0x3257 (en: 'circled number twenty seven', google translation) - - "㉘": [T: "圈圈內28"] # 0x3258 (en: 'circled number twenty eight', google translation) - - "㉙": [T: "圈圈內29"] # 0x3259 (en: 'circled number twenty nine', google translation) - - "㉚": [T: "圈圈內30"] # 0x325a (en: 'circled number thirty', google translation) - - "㉛": [T: "圈圈內31"] # 0x325b (en: 'circled number thirty one', google translation) - - "㉜": [T: "圈圈內32"] # 0x325c (en: 'circled number thirty two', google translation) - - "㉝": [T: "圈圈內33"] # 0x325d (en: 'circled number thirty three', google translation) - - "㉞": [T: "圈圈內34"] # 0x325e (en: 'circled number thirty four', google translation) - - "㉟": [T: "圈圈內35"] # 0x325f (en: 'circled number thirty five', google translation) - - "㊱": [T: "圈圈內36"] # 0x32b1 (en: 'circled number thirty six', google translation) - - "㊲": [T: "圈圈內37"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 translation) - - "㊳": [T: "圈圈內38"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 translation) - - "㊴": [T: "圈圈內39"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 translation) - - "㊵": [T: "圈圈內40"] # 0x32b5 (en: 'circled number forty', GPT-5.4 translation) - - "㊶": [T: "圈圈內41"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 translation) - - "㊷": [T: "圈圈內42"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 translation) - - "㊸": [T: "圈圈內43"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 translation) - - "㊹": [T: "圈圈內44"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 translation) - - "㊺": [T: "圈圈內45"] # 0x32ba (en: 'circled number forty five', GPT-5.4 translation) - - "㊻": [T: "圈圈內46"] # 0x32bb (en: 'circled number forty six', GPT-5.4 translation) - - "㊼": [T: "圈圈內47"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 translation) - - "㊽": [T: "圈圈內48"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 translation) - - "㊾": [T: "圈圈內49"] # 0x32be (en: 'circled number forty nine', GPT-5.4 translation) - - "㊿": [T: "圈圈內50"] # 0x32bf (en: 'circled number fifty', GPT-5.4 translation) + - "㉑": [T: "圈圈21"] # 0x3251 (en: 'circled number twenty one', google translation) + - "㉒": [T: "圈圈22"] # 0x3252 (en: 'circled number twenty two', google translation) + - "㉓": [T: "圈圈23"] # 0x3253 (en: 'circled number twenty three', google translation) + - "㉔": [T: "圈圈24"] # 0x3254 (en: 'circled number twenty four', google translation) + - "㉕": [T: "圈圈25"] # 0x3255 (en: 'circled number twenty five', google translation) + - "㉖": [T: "圈圈26"] # 0x3256 (en: 'circled number twenty six', google translation) + - "㉗": [T: "圈圈27"] # 0x3257 (en: 'circled number twenty seven', google translation) + - "㉘": [T: "圈圈28"] # 0x3258 (en: 'circled number twenty eight', google translation) + - "㉙": [T: "圈圈29"] # 0x3259 (en: 'circled number twenty nine', google translation) + - "㉚": [T: "圈圈30"] # 0x325a (en: 'circled number thirty', google translation) + - "㉛": [T: "圈圈31"] # 0x325b (en: 'circled number thirty one', google translation) + - "㉜": [T: "圈圈32"] # 0x325c (en: 'circled number thirty two', google translation) + - "㉝": [T: "圈圈33"] # 0x325d (en: 'circled number thirty three', google translation) + - "㉞": [T: "圈圈34"] # 0x325e (en: 'circled number thirty four', google translation) + - "㉟": [T: "圈圈35"] # 0x325f (en: 'circled number thirty five', google translation) + - "㊱": [T: "圈圈36"] # 0x32b1 (en: 'circled number thirty six', google translation) + - "㊲": [T: "圈圈37"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 translation) + - "㊳": [T: "圈圈38"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 translation) + - "㊴": [T: "圈圈39"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 translation) + - "㊵": [T: "圈圈40"] # 0x32b5 (en: 'circled number forty', GPT-5.4 translation) + - "㊶": [T: "圈圈41"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 translation) + - "㊷": [T: "圈圈42"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 translation) + - "㊸": [T: "圈圈43"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 translation) + - "㊹": [T: "圈圈44"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 translation) + - "㊺": [T: "圈圈45"] # 0x32ba (en: 'circled number forty five', GPT-5.4 translation) + - "㊻": [T: "圈圈46"] # 0x32bb (en: 'circled number forty six', GPT-5.4 translation) + - "㊼": [T: "圈圈47"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 translation) + - "㊽": [T: "圈圈48"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 translation) + - "㊾": [T: "圈圈49"] # 0x32be (en: 'circled number forty nine', GPT-5.4 translation) + - "㊿": [T: "圈圈50"] # 0x32bf (en: 'circled number fifty', GPT-5.4 translation) - "㋌": [T: "汞柱"] # 0x32cc (en: 'mercury', google translation) - "㋍": [T: "耳格"] # 0x32cd (google translation) - "㋎": [T: "電子伏特"] # 0x32ce (en: 'electron volts', google translation) @@ -2460,19 +2522,19 @@ - "㍸": [T: "平方分米"] # 0x3378 (en: 'decimeters squared', google translation) - "㍹": [T: "立方分米"] # 0x3379 (en: 'decimeters cubed', google translation) - "㍺": [t: "樂器單元"] # 0x337a (en: 'instrumental units', google translation) - - "㎀": [t: "皮安培"] # 0x3380 (google translation) - - "㎁": [t: "奈安培"] # 0x3381 (en: 'nanoamps', google translation) - - "㎂": [t: "微安培"] # 0x3382 (en: 'microamps', google translation) - - "㎃": [t: "毫安培"] # 0x3383 (en: 'milliamps', google translation) + - "㎀": [T: "皮安培"] # 0x3380 (google translation) + - "㎁": [T: "奈安培"] # 0x3381 (en: 'nanoamps', google translation) + - "㎂": [T: "微安培"] # 0x3382 (en: 'microamps', google translation) + - "㎃": [T: "毫安培"] # 0x3383 (en: 'milliamps', google translation) - "㎄": [T: "千安培"] # 0x3384 (en: 'kiloamps', google translation) - "㎅": [T: "KB"] # 0x3385 (en: 'kilobytes', google translation) - "㎆": [T: "MB"] # 0x3386 (en: 'megabytes', google translation) - "㎇": [T: "GB"] # 0x3387 (en: 'gigabytes', google translation) - "㎈": [T: "卡"] # 0x3388 (en: 'calories', google translation) - "㎉": [T: "大卡"] # 0x3389 (en: 'kilocalories', google translation) - - "㎊": [t: "皮法拉"] # 0x338a (google translation) - - "㎋": [t: "奈法拉"] # 0x338b (en: 'nanofarads', google translation) - - "㎌": [t: "微法拉"] # 0x338c (en: 'microfarads', google translation) + - "㎊": [T: "皮法拉"] # 0x338a (google translation) + - "㎋": [T: "奈法拉"] # 0x338b (en: 'nanofarads', google translation) + - "㎌": [T: "微法拉"] # 0x338c (en: 'microfarads', google translation) - "㎍": [T: "微克"] # 0x338d (en: 'micrograms', google translation) - "㎎": [T: "毫克"] # 0x338e (en: 'milligrams', google translation) - "㎏": [T: "公斤"] # 0x338f (en: 'kilograms', google translation) @@ -2480,12 +2542,12 @@ - "㎑": [T: "千赫"] # 0x3391 (en: 'kilohertz', google translation) - "㎒": [T: "百萬赫"] # 0x3392 (en: 'megahertz', google translation) - "㎓": [T: "吉赫"] # 0x3393 (en: 'gigahertz', google translation) - - "㎔": [t: "兆赫"] # 0x3394 (google translation) + - "㎔": [T: "兆赫"] # 0x3394 (google translation) - "㎕": [T: "微升"] # 0x3395 (en: 'microliters', google translation) - "㎖": [T: "毫升"] # 0x3396 (en: 'milliliters', google translation) - - "㎗": [t: "分升"] # 0x3397 (en: 'deciliters', google translation) + - "㎗": [T: "分升"] # 0x3397 (en: 'deciliters', google translation) - "㎘": [T: "公秉"] # 0x3398 (en: 'kiloliters', google translation) - - "㎙": [t: "飛米"] # 0x3399 (google translation) + - "㎙": [T: "飛米"] # 0x3399 (google translation) - "㎚": [T: "奈米"] # 0x339a (en: 'nanometers', google translation) - "㎛": [T: "微米"] # 0x339b (en: 'micrometers', google translation) - "㎜": [T: "毫米"] # 0x339c (en: 'millimeters', google translation) @@ -2501,59 +2563,59 @@ - "㎦": [T: "立方公里"] # 0x33a6 (en: 'kilometers cubed', google translation) - "㎧": [T: "公尺/秒"] # 0x33a7 (en: 'meters per second', google translation) - "㎨": [T: "公尺/平方秒"] # 0x33a8 (en: 'meters per second squared', google translation) - - "㎩": [t: "帕"] # 0x33a9 (en: 'pascals', google translation) - - "㎪": [t: "千帕"] # 0x33aa (google translation) - - "㎫": [t: "百萬帕"] # 0x33ab (en: 'megapascals', google translation) - - "㎬": [t: "吉帕"] # 0x33ac (google translation) + - "㎩": [T: "帕"] # 0x33a9 (en: 'pascals', google translation) + - "㎪": [T: "千帕"] # 0x33aa (google translation) + - "㎫": [T: "百萬帕"] # 0x33ab (en: 'megapascals', google translation) + - "㎬": [T: "吉帕"] # 0x33ac (google translation) - "㎭": [T: "弳"] # 0x33ad (en: 'rads', google translation) - "㎮": [T: "弳/秒"] # 0x33ae (en: 'rads per second', google translation) - "㎯": [T: "弳/平方秒"] # 0x33af (en: 'rads per second squared', google translation) - - "㎰": [t: "皮秒"] # 0x33b0 (en: 'picoseconds', google translation) - - "㎱": [t: "奈秒"] # 0x33b1 (en: 'nanoseconds', google translation) + - "㎰": [T: "皮秒"] # 0x33b0 (en: 'picoseconds', google translation) + - "㎱": [T: "奈秒"] # 0x33b1 (en: 'nanoseconds', google translation) - "㎲": [T: "微秒"] # 0x33b2 (en: 'microseconds', google translation) - "㎳": [T: "毫秒"] # 0x33b3 (en: 'milliseconds', google translation) - - "㎴": [t: "皮伏特"] # 0x33b4 (google translation) - - "㎵": [t: "奈伏特"] # 0x33b5 (en: 'nanovolts', google translation) + - "㎴": [T: "皮伏特"] # 0x33b4 (google translation) + - "㎵": [T: "奈伏特"] # 0x33b5 (en: 'nanovolts', google translation) - "㎶": [T: "微伏特"] # 0x33b6 (en: 'microvolts', google translation) - "㎷": [T: "毫伏特"] # 0x33b7 (en: 'millivolts', google translation) - "㎸": [T: "千伏特"] # 0x33b8 (en: 'kilovolts', google translation) - - "㎹": [t: "百萬伏特"] # 0x33b9 (google translation) - - "㎺": [t: "皮瓦"] # 0x33ba (google translation) - - "㎻": [t: "奈瓦"] # 0x33bb (en: 'nanowatts', google translation) - - "㎼": [t: "微瓦"] # 0x33bc (google translation) + - "㎹": [T: "百萬伏特"] # 0x33b9 (google translation) + - "㎺": [T: "皮瓦"] # 0x33ba (google translation) + - "㎻": [T: "奈瓦"] # 0x33bb (en: 'nanowatts', google translation) + - "㎼": [T: "微瓦"] # 0x33bc (google translation) - "㎽": [T: "毫瓦"] # 0x33bd (en: 'milliwatts', google translation) - "㎾": [T: "千瓦"] # 0x33be (en: 'kilowatts', google translation) - "㎿": [T: "百萬瓦"] # 0x33bf (en: 'megawatts', google translation) - "㏀": [T: "千歐姆"] # 0x33c0 (en: 'kilo-ohms', google translation) - "㏁": [T: "百萬歐姆"] # 0x33c1 (google translation) - "㏂": [t: "attometers"] # 0x33c2 (google translation) - - "㏃": [t: "貝克"] # 0x33c3 (en: 'becquerels', google translation) + - "㏃": [T: "貝克"] # 0x33c3 (en: 'becquerels', google translation) - "㏄": [T: "cc"] # 0x33c4 (en: 'cubic centimeters', google translation) - - "㏅": [t: "燭光"] # 0x33c5 (en: 'candelas', google translation) - - "㏆": [t: "庫侖/公斤"] # 0x33c6 (en: 'coulombs per kilogram', google translation) + - "㏅": [T: "燭光"] # 0x33c5 (en: 'candelas', google translation) + - "㏆": [T: "庫侖/公斤"] # 0x33c6 (en: 'coulombs per kilogram', google translation) - "㏇": [t: "cardiac output"] # 0x33c7 (en: 'cardiac output', google translation) - "㏈": [T: "分貝"] # 0x33c8 (en: 'decibels', google translation) - - "㏉": [t: "戈雷"] # 0x33c9 (en: 'grays', google translation) - - "㏊": [t: "公頃"] # 0x33ca (en: 'hectares', google translation) + - "㏉": [T: "戈雷"] # 0x33c9 (en: 'grays', google translation) + - "㏊": [T: "公頃"] # 0x33ca (en: 'hectares', google translation) - "㏋": [T: "馬力"] # 0x33cb (en: 'horsepower', google translation) - "㏌": [T: "英寸"] # 0x33cc (en: 'inches', google translation) - "㏍": [t: "kilokelvins"] # 0x33cd (google translation) - "㏎": [T: "公里"] # 0x33ce (en: 'kilometers', google translation) - - "㏏": [t: "節"] # 0x33cf (en: 'knots', google translation) + - "㏏": [T: "節"] # 0x33cf (en: 'knots', google translation) - "㏐": [T: "流明"] # 0x33d0 (en: 'lumens', google translation) - "㏑": [T: "自然對數"] # 0x33d1 (en: 'natural log', google translation) - "㏒": [T: "對數"] # 0x33d2 (en: 'logarithm', google translation) - - "㏓": [t: "勒克斯"] # 0x33d3 (en: 'lux', google translation) - - "㏔": [t: "毫邦"] # 0x33d4 (google translation) - - "㏕": [t: "密耳"] # 0x33d5 (en: 'mills', google translation) - - "㏖": [t: "莫耳"] # 0x33d6 (en: 'moles', google translation) + - "㏓": [T: "勒克斯"] # 0x33d3 (en: 'lux', google translation) + - "㏔": [T: "毫邦"] # 0x33d4 (google translation) + - "㏕": [T: "密耳"] # 0x33d5 (en: 'mills', google translation) + - "㏖": [T: "莫耳"] # 0x33d6 (en: 'moles', google translation) - "㏗": [T: "pH"] # 0x33d7 (google translation) - "㏘": [t: "picometers"] # 0x33d8 (en: 'picometers', google translation) - "㏙": [T: "PPM"] # 0x33d9 (en: 'parts per million', google translation) - - "㏚": [t: "拍侖琴"] # 0x33da (google translation) - - "㏛": [t: "立弳"] # 0x33db (en: 'steradians', google translation) - - "㏜": [t: "西弗"] # 0x33dc (google translation) - - "㏝": [t: "韋伯"] # 0x33dd (en: 'webers', google translation) + - "㏚": [T: "拍侖琴"] # 0x33da (google translation) + - "㏛": [T: "立弳"] # 0x33db (en: 'steradians', google translation) + - "㏜": [T: "西弗"] # 0x33dc (google translation) + - "㏝": [T: "韋伯"] # 0x33dd (en: 'webers', google translation) - "㏞": [T: "伏特/公尺"] # 0x33de (en: 'volts per meter', google translation) - "㏟": [T: "安培/公尺"] # 0x33df (en: 'amps per meter', google translation) - "㏿": [T: "加侖"] # 0x33ff (en: 'gallons', google translation) @@ -3036,7 +3098,6 @@ - " ": [t: ""] # 0x205f - "": [t: ""] # 0xef04 - "": [t: ""] # 0xef05 - - " ": [t: ""] # 0x2003 - "": [t: ""] # 0xef06 - "": [t: ""] # 0xef07 - "": [t: ""] # 0xef08 @@ -3073,57 +3134,57 @@ - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝕬-𝖅": # 0x1D56C - 0x1D585 - - T: "fraktur 粗體" # (google translation) - - SPELL: "translate('.', '𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "fraktur" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf040 - 0xf059 - - T: "fraktur 粗體" # (google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "fraktur" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - T: "fraktur 粗體" # (google translation) - - SPELL: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + - t: "fraktur" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf05a - 0xf073 - - T: "fraktur 粗體" # (google translation) - - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - t: "fraktur" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" # double struck (blackboard bold) chars in math alphabetic block and also MathType private use area # Some of these are reserved because they were used in Plane 0 -- that shouldn't be an issue other than causing the other chars to not display - "𝔸-𝕐": # 0x1d504 - 0x1d51d ('z' version is reserved) - - test: - if: "$Verbosity!='Terse'" - then: [T: "空心"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '𝔸𝔹𝔺𝔻𝔼𝔽𝔾𝔿𝕀𝕁𝕂𝕃𝕄𝕅𝕆𝕇𝕈𝕉𝕊𝕋𝕌𝕍𝕎𝕏𝕐', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "雙線" + - spell: "translate('.', '𝔸𝔹𝔺𝔻𝔼𝔽𝔾𝔿𝕀𝕁𝕂𝕃𝕄𝕅𝕆𝕇𝕈𝕉𝕊𝕋𝕌𝕍𝕎𝕏𝕐', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf080 - 0xf098 - - test: - if: "$Verbosity!='Terse'" - then: [T: "空心"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "雙線" + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝕒-𝕫": # 0x1d552 - 0x1d56b - - test: - if: "$Verbosity!='Terse'" - then: [T: "空心"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫', 'abcdefghijklmnopqrstuvwxyz')" + - t: "雙線" + - spell: "translate('.', '𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf09a - 0xf0b3 - - test: - if: "$Verbosity!='Terse'" - then: [T: "空心"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - t: "雙線" + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - test: - if: "$Verbosity!='Terse'" - then: [T: "空心"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + - t: "雙線" + - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - "-": # 0xf0c0 - 0xf0c9 - - test: - if: "$Verbosity!='Terse'" - then: [T: "空心"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '', '0123456789')" + - t: "雙線" + - spell: "translate('.', '', '0123456789')" - - "": [T: "空心nabla"] # 0xf0ca (en: 'double struck nabla', google translation) - - "": [T: "空心歐拉常數"] # 0xf0cb (en: 'double struck euler constant', google translation) + - "": [T: "雙線nabla"] # 0xf0ca (en: 'double struck nabla', google translation) + - "": [T: "雙線歐拉常數"] # 0xf0cb (en: 'double struck euler constant', google translation) # script chars in math alphabetic block and also MathType private use area - "𝒜-𝒵": # 0x1d49c - 0x1d4b5 @@ -3143,18 +3204,30 @@ # bold script chars in math alphabetic block and also MathType private use area - "𝓐-𝓩": # 0x1d4d0 - 0x1d4e9 - - T: "粗草體" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "粗草體"] + else: [T: "草體"] - SPELL: "translate('.', '𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf140 - 0xf159 - - T: "粗草體" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "粗草體"] + else: [T: "草體"] - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝓪-𝔃": # 0x1d4ea - 0x1d503 - - T: "粗草體" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "粗草體"] + else: [T: "草體"] - SPELL: "translate('.', '𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf15a - 0xf173 - - T: "粗草體" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "粗草體"] + else: [T: "草體"] - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf180 - 0xf199 @@ -3217,35 +3290,39 @@ # MathType only has a few of the cap Greek letters in PUA - "": # 0xf201 - 0xf209 - - test: - if: "$Verbosity!='Terse'" - then: [T: "空心"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '', 'ΔΨΛΠΣΘΓΩΥ')" + - t: "雙線" + - spell: "translate('.', '', 'ΔΨΛΠΣΘΓΩΥ')" - "-": # 0xf220 - 0xf236 - - test: - if: "$Verbosity!='Terse'" - then: [T: "空心"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - t: "雙線" + - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - - "": [T: "空心final sigma"] # 0xf237 (en: 'double struck final sigma', google translation) - - "": [T: "空心rho"] # 0xf250 (en: 'double struck rho', google translation) - - "": [T: "空心phi"] # 0xf251 (en: 'double struck phi', google translation) + - "": [T: "雙線final sigma"] # 0xf237 (en: 'double struck final sigma', google translation) + - "": [T: "雙線rho"] # 0xf250 (en: 'double struck rho', google translation) + - "": [T: "雙線phi"] # 0xf251 (en: 'double struck phi', google translation) - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf260 - 0xf279 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf27a - 0xf293 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝐴-𝑍": # 0x1d434 - 0x1d44d - SPELL: "translate('.', '𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" @@ -3261,23 +3338,31 @@ - "𝑨-𝒁": # 0x1d468 - 0x1d481 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf2c8 - 0xf2e1 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝒂-𝒛": # 0x1d482 - 0x1d49b # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf2e2 - 0xf2fb # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝖠-𝖹": # 0x1d5a0 - 0x1d5b9 - SPELL: "translate('.', '𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨𝖩𝖪𝖫𝖬𝖭𝖮𝖯𝖰𝖱𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" @@ -3292,20 +3377,28 @@ - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf334 - 0xf34d - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝗮-𝘇": # 0x1d5ee - 0x1d607 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf34e - 0xf367 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝘈-𝘡": # 0x1d608 - 0x1d621 # - t: "斜體" - SPELL: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" @@ -3323,23 +3416,31 @@ - "𝘼-𝙕": # 0x1d63c - 0x1d655 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf39c - 0xf3b5 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝙖-𝙯": # 0x1d656 - 0x1d66f # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf3b6 - 0xf3cf # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝙰-𝚉": # 0x1d670 - 0x1d689 - SPELL: "translate('.', '𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" @@ -3358,31 +3459,43 @@ - "𝚥": [T: "無點j"] # 0x1d6a5 (en: 'dotless j', google translation) - "𝚨-𝛀": # 0x1d6a8 - 0x1d6c0 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝚨𝚩𝚪𝚫𝚬𝚭𝚮𝚯𝚰𝚱𝚲𝚳𝚴𝚵𝚶𝚷𝚸𝚹𝚺𝚻𝚼𝚽𝚾𝚿𝛀', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝚨𝚩𝚪𝚫𝚬𝚭𝚮𝚯𝚰𝚱𝚲𝚳𝚴𝚵𝚶𝚷𝚸𝚹𝚺𝚻𝚼𝚽𝚾𝚿𝛀', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "-": # 0xf408 - 0xf420 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "-": # 0xf422 - 0xf43a - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "": [T: "粗體nabla"] # 0xf421 (en: 'bold nabla', google translation) - "𝛁": [T: "粗體nabla"] # 0x1d6c1 (en: 'bold nabla', google translation) - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂εθκφρπ')" - "": # 0xF43C - 0xF441 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', '∂εθκφρπ')" - "𝛢-𝛺": # 0x1d6e2 - 0x1d6fa # - t: "斜體" @@ -3413,176 +3526,166 @@ - "𝜜-𝜴": # 0x1d71c - 0x1d734 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝜜𝜝𝜞𝜟𝜠𝜡𝜢𝜣𝜤𝜥𝜦𝜧𝜨𝜩𝜪𝜫𝜬𝜭𝜮𝜯𝜰𝜱𝜲𝜳𝜴', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝜜𝜝𝜞𝜟𝜠𝜡𝜢𝜣𝜤𝜥𝜦𝜧𝜨𝜩𝜪𝜫𝜬𝜭𝜮𝜯𝜰𝜱𝜲𝜳𝜴', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "-": # 0xf47c - 0xf494 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "𝜶-𝝎": # 0x1d736 - 0x1d74e # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝜶𝜷𝜸𝜹𝜺𝜻𝜼𝜽𝜾𝜿𝝀𝝁𝝂𝝃𝝄𝝅𝝆𝝇𝝈𝝉𝝊𝝋𝝌𝝍𝝎', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝜶𝜷𝜸𝜹𝜺𝜻𝜼𝜽𝜾𝜿𝝀𝝁𝝂𝝃𝝄𝝅𝝆𝝇𝝈𝝉𝝊𝝋𝝌𝝍𝝎', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "-": # 0xf496 - 0xf4ae # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂εθκφρπ')" - "": # 0xf422 - 0xf43a # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', '∂εθκφρπ')" - "𝜵": [T: "粗斜體nabla"] # 0x1d735 (en: 'bold italic nabla', google translation) - "": [T: "粗斜體nabla"] # 0xf495 (en: 'bold italic nabla', google translation) - "𝝖-𝝮": # 0x1d756 - 0x1d76e - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝝖𝝗𝝘𝝙𝝚𝝛𝝜𝝝𝝞𝝟𝝠𝝡𝝢𝝣𝝤𝝥𝝦𝝧𝝨𝝩𝝪𝝫𝝬𝝭𝝮', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝝖𝝗𝝘𝝙𝝚𝝛𝝜𝝝𝝞𝝟𝝠𝝡𝝢𝝣𝝤𝝥𝝦𝝧𝝨𝝩𝝪𝝫𝝬𝝭𝝮', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "-": # 0xf4b6 - 0xf4ce - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "𝝰-𝞈": # 0x1d770 - 0x1d788 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝝰𝝱𝝲𝝳𝝴𝝵𝝶𝝷𝝸𝝹𝝺𝝻𝝼𝝽𝝾𝝿𝞀𝞁𝞂𝞃𝞄𝞅𝞆𝞇𝞈', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝝰𝝱𝝲𝝳𝝴𝝵𝝶𝝷𝝸𝝹𝝺𝝻𝝼𝝽𝝾𝝿𝞀𝞁𝞂𝞃𝞄𝞅𝞆𝞇𝞈', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "-": # 0xf4d0 - 0xf4e8 - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂εθκφρπ')" - "": # 0xf4e9 - 0xf4ef - - T: "粗體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', '∂εθκφρπ')" - "": [T: "粗體nabla"] # 0xf4cf (en: 'bold nabla', google translation) - "𝝯": [T: "粗體nabla"] # 0x1d76f (en: 'bold nabla', google translation) - "𝞐-𝞨": # 0x1d790 - 0x1d7a8 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝞐𝞑𝞒𝞓𝞔𝞕𝞖𝞗𝞘𝞙𝞚𝞛𝞜𝞝𝞞𝞟𝞠𝞡𝞢𝞣𝞤𝞥𝞦𝞧𝞨', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝞐𝞑𝞒𝞓𝞔𝞕𝞖𝞗𝞘𝞙𝞚𝞛𝞜𝞝𝞞𝞟𝞠𝞡𝞢𝞣𝞤𝞥𝞦𝞧𝞨', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "-": # 0xf4f0 - 0xf508 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "𝞪-𝟂": # 0x1d7aa - 0x1d7c2 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝞪𝞫𝞬𝞭𝞮𝞯𝞰𝞱𝞲𝞳𝞴𝞵𝞶𝞷𝞸𝞹𝞺𝞻𝞼𝞽𝞾𝞿𝟀𝟁𝟂', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝞪𝞫𝞬𝞭𝞮𝞯𝞰𝞱𝞲𝞳𝞴𝞵𝞶𝞷𝞸𝞹𝞺𝞻𝞼𝞽𝞾𝞿𝟀𝟁𝟂', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "-": # 0xf50a - 0xf522 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂εθκφρπ')" - "": # 0xf523 - 0xf529 # - t: "bold italic" - - T: "粗斜體" # (en: 'bold', google translation) - - SPELL: "translate('.', '', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [t: "粗斜體"] + - spell: "translate('.', '', '∂εθκφρπ')" - "": [T: "粗體nabla"] # 0xf509 (en: 'bold nabla', google translation) - "𝞩": [T: "粗體nabla"] # 0x1d7a9 (en: 'bold nabla', google translation) - - "": [T: "粗體0"] # 0xf52e (en: 'bold zero', google translation) - - "𝟎": [T: "粗體0"] # 0x1d7ce (en: 'bold zero', google translation) - - "": [T: "粗體1"] # 0xf52f (en: 'bold one', google translation) - - "𝟏": [T: "粗體1"] # 0x1d7cf (en: 'bold one', google translation) - - "": [T: "粗體2"] # 0xf530 (en: 'bold two', google translation) - - "𝟐": [T: "粗體2"] # 0x1d7d0 (en: 'bold two', google translation) - - "": [T: "粗體3"] # 0xf531 (en: 'bold three', google translation) - - "𝟑": [T: "粗體3"] # 0x1d7d1 (en: 'bold three', google translation) - - "": [T: "粗體4"] # 0xf532 (en: 'bold four', google translation) - - "𝟒": [T: "粗體4"] # 0x1d7d2 (en: 'bold four', google translation) - - "": [T: "粗體5"] # 0xf533 (en: 'bold five', google translation) - - "𝟓": [T: "粗體5"] # 0x1d7d3 (en: 'bold five', google translation) - - "": [T: "粗體6"] # 0xf534 (en: 'bold six', google translation) - - "𝟔": [T: "粗體6"] # 0x1d7d4 (en: 'bold six', google translation) - - "": [T: "粗體7"] # 0xf535 (en: 'bold seven', google translation) - - "𝟕": [T: "粗體7"] # 0x1d7d5 (en: 'bold seven', google translation) - - "": [T: "粗體8"] # 0xf536 (en: 'bold eight', google translation) - - "𝟖": [T: "粗體8"] # 0x1d7d6 (en: 'bold eight', google translation) - - "": [T: "粗體9"] # 0xf537 (en: 'bold nine', google translation) - - "𝟗": [T: "粗體9"] # 0x1d7d7 (en: 'bold nine', google translation) - - "": [T: "零"] # 0xf542 (en: 'zero', google translation) - - "𝟢": [T: "零"] # 0x1d7e2 (en: 'zero', google translation) - - "": [T: "一"] # 0xf543 (en: 'one', google translation) - - "𝟣": [T: "一"] # 0x1d7e3 (en: 'one', google translation) - - "": [T: "二"] # 0xf544 (en: 'two', google translation) - - "𝟤": [T: "二"] # 0x1d7e4 (en: 'two', google translation) - - "": [T: "三"] # 0xf545 (en: 'three', google translation) - - "𝟥": [T: "三"] # 0x1d7e5 (en: 'three', google translation) - - "": [T: "四"] # 0xf546 (en: 'four', google translation) - - "𝟦": [T: "四"] # 0x1d7e6 (en: 'four', google translation) - - "": [T: "五"] # 0xf547 (en: 'five', google translation) - - "𝟧": [T: "五"] # 0x1d7e7 (en: 'five', google translation) - - "": [T: "六"] # 0xf548 (en: 'six', google translation) - - "𝟨": [T: "六"] # 0x1d7e8 (en: 'six', google translation) - - "": [T: "七"] # 0xf549 (en: 'seven', google translation) - - "𝟩": [T: "七"] # 0x1d7e9 (en: 'seven', google translation) - - "": [T: "八"] # 0xf54a (en: 'eight', google translation) - - "𝟪": [T: "八"] # 0x1d7ea (en: 'eight', google translation) - - "": [T: "九"] # 0xf54b (en: 'nine', google translation) - - "𝟫": [T: "九"] # 0x1d7eb (en: 'nine', google translation) - - "": [T: "粗體零"] # 0xf54c (en: 'bold zero', google translation) - - "𝟬": [T: "粗體零"] # 0x1d7ec (en: 'bold zero', google translation) - - "": [T: "粗體1"] # 0xf54d (en: 'bold one', google translation) - - "𝟭": [T: "粗體1"] # 0x1d7ed (en: 'bold one', google translation) - - "": [T: "粗體2"] # 0xf54e (en: 'bold two', google translation) - - "𝟮": [T: "粗體2"] # 0x1d7ee (en: 'bold two', google translation) - - "": [T: "粗體3"] # 0xf54f (en: 'bold three', google translation) - - "𝟯": [T: "粗體3"] # 0x1d7ef (en: 'bold three', google translation) - - "": [T: "粗體4"] # 0xf550 (en: 'bold four', google translation) - - "𝟰": [T: "粗體4"] # 0x1d7f0 (en: 'bold four', google translation) - - "": [T: "粗體5"] # 0xf551 (en: 'bold five', google translation) - - "𝟱": [T: "粗體5"] # 0x1d7f1 (en: 'bold five', google translation) - - "": [T: "粗體6"] # 0xf552 (en: 'bold six', google translation) - - "𝟲": [T: "粗體6"] # 0x1d7f2 (en: 'bold six', google translation) - - "": [T: "粗體7"] # 0xf553 (en: 'bold seven', google translation) - - "𝟳": [T: "粗體7"] # 0x1d7f3 (en: 'bold seven', google translation) - - "": [T: "粗體8"] # 0xf554 (en: 'bold eight', google translation) - - "𝟴": [T: "粗體8"] # 0x1d7f4 (en: 'bold eight', google translation) - - "": [T: "粗體9"] # 0xf555 (en: 'bold nine', google translation) - - "𝟵": [T: "粗體9"] # 0x1d7f5 (en: 'bold nine', google translation) - - "": [T: "零"] # 0xf556 (en: 'zero', google translation) - - "𝟶": [T: "零"] # 0x1d7f6 (en: 'zero', google translation) - - "": [T: "一"] # 0xf557 (en: 'one', google translation) - - "𝟷": [T: "一"] # 0x1d7f7 (en: 'one', google translation) - - "": [T: "二"] # 0xf558 (en: 'two', google translation) - - "𝟸": [T: "二"] # 0x1d7f8 (en: 'two', google translation) - - "": [T: "三"] # 0xf559 (en: 'three', google translation) - - "𝟹": [T: "三"] # 0x1d7f9 (en: 'three', google translation) - - "": [T: "四"] # 0xf55a (en: 'four', google translation) - - "𝟺": [T: "四"] # 0x1d7fa (en: 'four', google translation) - - "": [T: "五"] # 0xf55b (en: 'five', google translation) - - "𝟻": [T: "五"] # 0x1d7fb (en: 'five', google translation) - - "": [T: "六"] # 0xf55c (en: 'six', google translation) - - "𝟼": [T: "六"] # 0x1d7fc (en: 'six', google translation) - - "": [T: "七"] # 0xf55d (en: 'seven', google translation) - - "𝟽": [T: "七"] # 0x1d7fd (en: 'seven', google translation) - - "": [T: "八"] # 0xf55e (en: 'eight', google translation) - - "𝟾": [T: "八"] # 0x1d7fe (en: 'eight', google translation) - - "": [T: "九"] # 0xf55f (en: 'nine', google translation) - - "𝟿": [T: "九"] # 0x1d7ff (en: 'nine', google translation) + - "-": # 0xf52e - 0xf537 (old MathType) + - test: + if: "not($IgnoreBold)" + then: [t: "bold"] + - spell: "translate('.', '', '0123456789')" + + - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + + - "-": # 0xf52e - 0xf537 (old MathType) + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '', '0123456789')" + + - "𝟬-𝟵": # 0x1D7EC - 0x1D7F5 + - test: + if: "not($IgnoreBold)" + then: [t: "粗體"] + - spell: "translate('.', '𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵', '0123456789')" + + - "-": # 0xf556 - 0xf55f (old MathType) + - spell: "translate('.', '', '0123456789')" + + - "𝟢-𝟫": # 0x1d7e2 - 0x1d7eb + - spell: "translate('.', '𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫', '0123456789')" + + + - "𝟶-𝟿": # 0x1d7f6 - 0x1d7ff + - spell: "translate('.', '𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿', '0123456789')" + - "": [T: "未知字元"] # 0xf700 (en: 'unknown character', google translation) - "": [t: "右下三角形"] # 0xf726 (en: 'lower right and lower left triangles', google translation) - "": [t: "水平省略於擴展器"] # 0xf72d (en: 'horizontal ellipsis extender', google translation) @@ -3621,6 +3724,7 @@ - "ffl": [T: "ffl"] # 0xfb04 (google translation) - "ſt": [T: "英尺"] # 0xfb05 (en: 'ft', google translation) - "st": [t: "st"] # 0xfb06 (en: 'st', google translation) + - "﬩": [t: "hebrew letter alternative plus"] # 0xfb29 - "︠": [t: "結紮剩下半點"] # 0xfe20 (en: 'ligature left half embellishment', google translation) - "︡": [t: "綁紮右半點綴"] # 0xfe21 (en: 'ligature right half embellishment', google translation) - "︢": [t: "雙tilde留下一半點綴"] # 0xfe22 (en: 'double tilde left half embellishment', google translation) @@ -3634,6 +3738,62 @@ - "︸": [T: "下大括"] # 0xfe38 (en: 'under brace', google translation) - "︿": [T: "上角括"] # 0xfe3f (en: 'over angle bracket', google translation) - "﹀": [T: "下角括"] # 0xfe40 (en: 'under angle bracket', google translation) - - "﹨": [T: "整數除以"] # 0xfe68 (en: 'integer divide', google translation) + - "﹡": [t: "small asterisk"] # 0xfe61 + - "﹢": [t: "small plus"] # 0xfe62 + - "﹣": [t: "small minus"] # 0xfe63 + - "﹤": [t: "small less than"] # 0xfe64 + - "﹥": [t: "small greater than"] # 0xfe65 + - "﹦": [t: "small equals"] # 0xfe66 + - "+": [t: "fullwidth plus sign"] # 0xff0b + - "<": [t: "less than"] # 0xff1c + - "=": [t: "equals"] # 0xff1d + - ">": [t: "greater than"] # 0xff1e + - "\": [t: "backslash"] # 0xff3c + - "^": [t: "hat"] # 0xff3e + - "|": # 0xff5c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "$SpeechStyle != 'ClearSpeak'" + then_test: + if: "$DefaultToGiven" + then: [T: "給定"] + else: [T: "豎線"] + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "豎線"] + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "滿足"] + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [T: "給定"] + - else: [T: "整除"] + - "~": [t: "tilde"] # 0xff5e + - "¬": [t: "not"] # 0xffe2 + - "←": [t: "left arrow"] # 0xffe9 + - "↑": [t: "up arrow"] # 0xffea + - "→": [t: "right arrow"] # 0xffeb + - "↓": [t: "down arrow"] # 0xffec - "": [T: "未知或缺失物件"] # 0xfffc (en: 'unknown or missing object', google translation) - "�": [T: "未知或缺失字元"] # 0xfffd (en: 'unknown or missing character', google translation) + - "🣑": [t: "is in equilibrium with"] # 0x1F8D1 + - "🣒": [t: "is in equilibrium biased to the right with"] # 0x1F8D2 + - "🣓": [t: "is in equilibrium biased to the left with"] # 0x1F8D3 + +# MathJax v4 has adopted these PUA values for some partial chem bonds that aren't in Unicode + - "\uE410": [t: "partial bond "] # 0xe410 + - "\uE411": [t: "double partial bond "] # 0xe411 + - "\uE412": [t: "triple partial bond "] # 0xe412 + +# MathJax v4 also adopted these PUA values for some arrows thar are in Unicode +# Hopefully these will be exported properly in future versions of MathJax + - "\uE428": [spell: "'⟵'"] # 0xe428 defer to def of arrow + - "\uE429": [spell: "'⟶'"] # 0xe429 defer to def of arrow + - "\uE42A": [spell: "'⟷'"] # 0xe42a defer to def of arrow + - "\uE408": [spell: "'🣑'"] # 0xe408 defer to def of arrow + - "\uE409": [spell: "'🣒'"] # 0xe409 defer to def of arrow + - "\uE40A": [spell: "'🣓'"] # 0xe40a defer to def of arrow + - "\uE42B": [spell: "'⇄'"] # 0xe42b defer to def of arrow + - "\uE42C": [spell: "'←'"] # 0xe42c defer to def of arrow + - "\uE42D": [spell: "'→'"] # 0xe42d defer to def of arrow + - "\uE42E": [spell: "'⇄'"] # 0xe42e defer to def of arrow diff --git a/Rules/Languages/zh/tw/unicode.yaml b/Rules/Languages/zh/tw/unicode.yaml index 4d10dd75..6d774192 100644 --- a/Rules/Languages/zh/tw/unicode.yaml +++ b/Rules/Languages/zh/tw/unicode.yaml @@ -62,6 +62,8 @@ - "0-9": [T: "."] # (en: '.', google translation) + - " ": [t: " "] # 0x20 + - "!": # 0x21 - test: if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" @@ -74,7 +76,7 @@ - "\"": [T: "引號"] # 0x22 (en: 'quotation mark', google translation) - "#": [T: "數字"] # 0x23 (en: 'number', google translation) - "$": [T: "美元"] # 0x24 (en: 'dollars', google translation) - - "%": [T: "百分"] # 0x25 (en: 'percent', google translation) + - "%": [T: "百分比"] # 0x25 (en: 'percent', google translation) - "&": [T: "ampersand"] # 0x26 (en: 'ampersand', google translation) - "'": [T: "單引號"] # 0x27 (en: 'apostrophe') - "(": # 0x28 @@ -111,7 +113,11 @@ - "( following-sibling::*[1][text()!= '…'] and preceding-sibling::*[1][text()!='…'] ) or " # except if expression starts with '…' - "../*[1][.='…'] " - then: [T: "逗號"] # (en: 'comma', google translation) + then: + - T: "逗號" # (en: 'comma', google translation) + - test: + if: "$Verbosity != Terse" + then: [] # pause: short # else silent - "-": [T: "減"] # 0x2d (en: 'minus') @@ -120,7 +126,12 @@ if: "parent::*[1][self::m:mn]" then: [T: "點"] # (en: 'point', google translation) else: [T: "點"] # (en: 'dot', google translation) - - "/": [T: "除以"] # 0x2f (en: 'divided by') + - "/": + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [t: "slash"] # 0x2f + else: [T: "除以"] # 0x2f + - ":": [T: "冒號"] # 0x3a (en: 'colon') - ";": [T: "分號"] # 0x3b (en: 'semicolon', google translation) - "<": # 0x3c @@ -140,7 +151,7 @@ then: [T: ""] # (en: 'is', google translation) - T: "大於" # (en: 'greater than') - "?": [T: "問號"] # 0x3f (en: 'question mark', google translation) - - "@": [T: "在標誌"] # 0x40 (en: 'at sign', google translation) + - "@": [T: "小老鼠"] # 0x40 (en: 'at sign', google translation) - "[": # 0x5b - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' @@ -152,7 +163,11 @@ if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' then: [T: "右中括"] # (en: 'close bracket', google translation) else: [T: "右中括"] # (en: 'right bracket') - - "^": [T: "hat"] # 0x5e (en: 'hat', google translation) + - "^": + - test: + if: "parent::m:modified-variable or parent::m:mover" + then: [t: "hat"] + else: [t: "caret"] - "_": [T: "under bar"] # 0x5f (en: 'under bar', google translation) - "`": [T: "grave"] # 0x60 (en: 'grave', google translation) - "{": # 0x7b @@ -166,16 +181,18 @@ variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) replace: - test: - - if: "$SpeechStyle != 'ClearSpeak'" + - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "豎線"] + - else_if: "$SpeechStyle != 'ClearSpeak'" then_test: - if: "$DefaultToGiven" then: [T: "給定"] # (en: 'given', google translation) - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" then: [T: "整除"] # (en: 'divides') - else: [T: "垂線"] # (en: 'vertical line', google translation) + else: [T: "豎線"] # (en: 'vertical line', google translation) - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" - then: [T: "垂線"] # (en: 'vertical line', google translation + then: [T: "豎線"] # (en: 'vertical line', google translation - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" then: [T: "滿足"] # (en: 'such that', google translation) - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" @@ -191,7 +208,8 @@ - "~": [T: "tilde"] # 0x7e (en: 'tilde', google translation) - " ": # 0xa0 - test: - if: "@data-empty-in-2D and ../../../../*[name(.)!='equations']" + # could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution? + if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" then: [T: "無"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) else: [T: ""] @@ -201,17 +219,23 @@ - "´": [T: "acute"] # 0xb4 (en: 'acute', google translation) - "·": # 0xB7 - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" then: [T: "乘"] # (en: 'times', google translation) else: [T: "dot"] # (en: 'dot') - - "×": # 0xd7 + - "×": # 0xd7 - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" - then: [T: "乘"] # (en: 'times', google translation) + if: "$SpeechStyle = 'ClearSpeak'" + then_test: + - if: "$ClearSpeak_MultSymbolX = 'Auto'" + then: [T: "乘"] + - else_if: "$ClearSpeak_MultSymbolX = 'By'" + then: [T: "乘"] + else: [t: "cross"] else_test: - if: $ClearSpeak_MultSymbolX = 'By' - then: [T: "乘"] # (en: 'by', google translation) - else: [T: "乘"] # (en: 'cross') + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [t: "cross"] + else: [T: "乘"] + - "÷": [T: "除以"] # 0xf7 (en: 'divided by') - "̀": [t: "grave accent embellishment"] # 0x300 (en: 'grave accent embellishment', google translation) - "́": [t: "acute accent embellishment"] # 0x301 (en: 'acute accent embellishment', google translation) @@ -276,7 +300,7 @@ - "–": [T: "en dash"] # 0x2013 (google translation) - "—": [T: "em dash"] # 0x2014 (google translation) - "―": [T: "單槓"] # 0x2015 (en: 'horizontal bar', google translation) - - "‖": [T: "雙垂直線"] # 0x2016 (en: 'double vertical line', google translation) + - "‖": [T: "雙豎線"] # 0x2016 (en: 'double vertical line', google translation) - "…": # 0x2026 test: if: @@ -290,7 +314,19 @@ then: [T: "等等"] # (en: 'and so on', google translation) else: [T: "等等"] # (en: 'and so on up to', google translation) - - "⁡": [T: ""] # (en: 'of', google translation) + - "⁡": # 0x2061 + - test: + # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode + if: "not( + ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and + preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', + IsInDefinition(., 'ClearSpeakTrigFunctionNames'), + IsInDefinition(., 'TrigFunctionNames') )] + ) or + preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or + (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) + )" + then: [t: ""] - "⁢": [t: ""] # 0x2062 - "⁣": [t: ""] # 0x2063 - "⁤": [T: "又"] # 0x2064 (en: 'and', google translation)(3 又 1/2) @@ -346,7 +382,11 @@ - "∈": # 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "屬於"] # (en: 'an element of', google translation) + then: + - test: + if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" + then: [t: ""] + - T: "屬於" # (en: 'an element of', google translation) # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option else_test: if: "../../self::m:set or ../../../self::m:set" # inside a set @@ -370,7 +410,11 @@ # rule is identical to 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" - then: [t: "不屬於"] # (en: 'is not an element of', google translation) + then: + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] + - T: "不屬於" # (en: 'is not an element of', google translation) # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option else_test: if: "../../self::m:set or ../../../self::m:set" # inside a set @@ -393,7 +437,11 @@ - "∊": # 0x220a - test: if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "屬於"] # (en: 'is an element of', google translation) + then: + - test: + if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" + then: [t: ""] + - T: "屬於" # (en: 'is an element of', google translation) # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option else_test: if: "../../self::m:set or ../../../self::m:set" # inside a set @@ -437,10 +485,14 @@ - "∣": [T: "整除"] # 0x2223 (en: 'divides') - "∤": [T: "不整除"] # 0x2224 (en: 'does not divide') - "∥": # 0x2225 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "平行" # (en: 'parallel to') + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "雙豎線"] + else: + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] + - T: "平行" - "∦": # 0x2226 - test: if: "$Verbosity!='Terse'" @@ -451,7 +503,7 @@ - "∩": [T: "交集"] # 0x2229 (en: 'intersection') - "∪": [T: "聯集"] # 0x222a (en: 'union') - "∫": [T: "積分"] # 0x222b (en: 'integral') - - "∬": [T: "雙重積分"] # 0x222c (en: 'double integral') + - "∬": [T: "二重積分"] # 0x222c (en: 'double integral') - "∭": [T: "三重積分"] # 0x222d (en: 'triple integral') - "∮": [T: "輪廓積分"] # 0x222e (en: 'contour integral') - "∶": # 0x2236 @@ -459,8 +511,8 @@ if: "$Verbosity!='Terse'" then: [T: ""] # (en: 'is', google translation) - T: "比" # (en: 'to') - - "∷": [T: "當成"] # 0x2237 (en: 'as') - - "∼": [T: "波浪符"] # 0x223c (en: 'varies with') + - "∷": [T: "如同"] # 0x2237 (en: 'as') + - "∼": [T: "相似"] # 0x223c (en: 'varies with') - "∽": [T: "反波浪符"] # 0x223d (en: 'reversed tilde') - "∾": # 0x223e - test: diff --git a/tests/Languages/zh/tw.rs b/tests/Languages/zh/tw.rs index 0a8d393e..f7ce2da1 100644 --- a/tests/Languages/zh/tw.rs +++ b/tests/Languages/zh/tw.rs @@ -23,6 +23,7 @@ mod SimpleSpeak { mod geometry; mod linear_algebra; mod multiline; + mod subscripts; } mod shared; mod chemistry; diff --git a/tests/Languages/zh/tw/SimpleSpeak/functions.rs b/tests/Languages/zh/tw/SimpleSpeak/functions.rs index c90deb6f..232e0f94 100644 --- a/tests/Languages/zh/tw/SimpleSpeak/functions.rs +++ b/tests/Languages/zh/tw/SimpleSpeak/functions.rs @@ -102,7 +102,7 @@ fn normal_log() -> Result<()> { #[test] fn simple_log_with_base() -> Result<()> { let expr = " logbx "; - test("zh-tw", "SimpleSpeak", expr, "log 底 b, x")?; + test("zh-tw", "SimpleSpeak", expr, "log 底數 b, x")?; return Ok(()); } @@ -110,7 +110,7 @@ fn simple_log_with_base() -> Result<()> { #[test] fn normal_log_with_base() -> Result<()> { let expr = "logb(x+y)"; - test("zh-tw", "SimpleSpeak", expr, "log 底 b; 左小括 x 加 y 右小括")?; + test("zh-tw", "SimpleSpeak", expr, "log 底數 b; 左小括 x 加 y 右小括")?; return Ok(()); } @@ -149,6 +149,22 @@ fn simple_ln_terse() -> Result<()> { } +#[test] +fn other_names() -> Result<()> { + let expr = " Covx "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "Cov x")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Medium")], + expr, "covariance x")?; + let expr = " exp(x) "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "exp x")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Medium")], + expr, "exponential x")?; + return Ok(()); + +} + #[test] fn explicit_function_call_with_parens() -> Result<()> { let expr = "t(x)"; @@ -225,7 +241,7 @@ fn no_times_sqrt() -> Result<()> { ab "; test("zh-tw", "SimpleSpeak", expr, - "根號 a, 根號 b; 等於, 根號 a b 結束根號")?; + "根號 a, 乘 根號 b; 等於, 根號 a b 結束根號")?; return Ok(()); } @@ -254,7 +270,7 @@ fn no_times_sqrt() -> Result<()> { xy ) "; - test("zh-tw", "SimpleSpeak", expr, "b x y")?; + test("zh-tw", "SimpleSpeak", expr, "b, 左小括 x y 右小括")?; return Ok(()); } diff --git a/tests/Languages/zh/tw/SimpleSpeak/linear_algebra.rs b/tests/Languages/zh/tw/SimpleSpeak/linear_algebra.rs index e71da357..184febe4 100644 --- a/tests/Languages/zh/tw/SimpleSpeak/linear_algebra.rs +++ b/tests/Languages/zh/tw/SimpleSpeak/linear_algebra.rs @@ -4,7 +4,7 @@ use anyhow::Result; #[test] fn transpose() -> Result<()> { let expr = " MT "; - test("zh-tw", "SimpleSpeak", expr, "大寫 m 的 轉置")?; + test("zh-tw", "SimpleSpeak", expr, "大寫 m transpose")?; return Ok(()); } @@ -12,7 +12,7 @@ fn transpose() -> Result<()> { #[test] fn trace() -> Result<()> { let expr = " TrM "; - test("zh-tw", "SimpleSpeak", expr, "大寫 m 的 跡")?; + test("zh-tw", "SimpleSpeak", expr, "trace 大寫 m")?; return Ok(()); } @@ -20,7 +20,7 @@ fn trace() -> Result<()> { #[test] fn dimension() -> Result<()> { let expr = " DimM "; - test("zh-tw", "SimpleSpeak", expr, "大寫 m 的 維數")?; + test("zh-tw", "SimpleSpeak", expr, "dimension 大寫 m")?; return Ok(()); } @@ -28,7 +28,7 @@ fn dimension() -> Result<()> { #[test] fn homomorphism() -> Result<()> { let expr = " Hom(M) "; - test("zh-tw", "SimpleSpeak", expr, "大寫 m 的 同態")?; + test("zh-tw", "SimpleSpeak", expr, "homomorphism 大寫 m")?; return Ok(()); } @@ -36,7 +36,7 @@ fn homomorphism() -> Result<()> { #[test] fn kernel() -> Result<()> { let expr = " ker(L) "; - test("zh-tw", "SimpleSpeak", expr, "大寫 l 的 核")?; + test("zh-tw", "SimpleSpeak", expr, "kernel 大寫 l")?; return Ok(()); } @@ -51,7 +51,24 @@ fn norm() -> Result<()> { "; - test("zh-tw", "SimpleSpeak", expr, "f 的 範數")?; + test("zh-tw", "SimpleSpeak", expr, "norm f")?; + return Ok(()); + +} + +#[test] +fn norm_non_simple() -> Result<()> { + let expr = " + + + x + + + y + + + +"; + test("zh-tw", "SimpleSpeak", expr, "norm x 加 y 結束 norm")?; return Ok(()); } @@ -69,7 +86,25 @@ fn norm_subscripted() -> Result<()> { "; - test("zh-tw", "SimpleSpeak", expr, "f 的 p 範數")?; + test("zh-tw", "SimpleSpeak", expr, "p norm f")?; + return Ok(()); + +} +#[test] +fn not_gradient() -> Result<()> { + // the nabla is at the end, so it can't be gradient because it doesn't operate on anything + let expr = r#" + ( + b + + + + + ) + a + +"#; + test("zh-tw", "SimpleSpeak", expr, "左小括 b 乘 nahblah, 右小括; 乘 a")?; return Ok(()); } \ No newline at end of file diff --git a/tests/Languages/zh/tw/SimpleSpeak/mfrac.rs b/tests/Languages/zh/tw/SimpleSpeak/mfrac.rs index d82ce0a1..0c79365d 100644 --- a/tests/Languages/zh/tw/SimpleSpeak/mfrac.rs +++ b/tests/Languages/zh/tw/SimpleSpeak/mfrac.rs @@ -151,6 +151,71 @@ fn denominator_simple_fraction() -> Result<()> { } +#[test] +fn frac_with_units() -> Result<()> { + let expr = " + + + 62 + + mi + hr + + + "; + test("zh-tw", "SimpleSpeak", expr, "62 英里 每 小時")?; + return Ok(()); + +} + +#[test] +fn singular_frac_with_units() -> Result<()> { + let expr = " + + + 1 + + gal + mi + + + "; + test("zh-tw", "SimpleSpeak", expr, "1 加侖 每 英里")?; + return Ok(()); + +} + +#[test] +fn number_in_numerator_with_units() -> Result<()> { + let expr = " + + + + 3 + gal + + mi + + "; + test("zh-tw", "SimpleSpeak", expr, "3 加侖 每 英里")?; + return Ok(()); + +} + +#[test] +fn units_with_powers() -> Result<()> { + let expr = " + + + 3 m + s2 + + "; + test("zh-tw", "SimpleSpeak", expr, "3 米 每 秒 平方")?; + return Ok(()); + +} + #[test] fn mixed_number() -> Result<()> { @@ -232,7 +297,7 @@ fn nested_simple_fractions() -> Result<()> { "; - test("zh-tw", "SimpleSpeak", expr, "分數 分數 3 分之 2 結束分數; 分之, 分數 2 分之 1 結束分數; 結束分數")?; + test("zh-tw", "SimpleSpeak", expr, "分數 3 分之 2, 分之, 2 分之 1 結束分數")?; return Ok(()); } @@ -249,3 +314,41 @@ fn binomial() -> Result<()> { return Ok(()); } +#[test] +fn binomial_non_simple_top() -> Result<()> { + let expr = " + 2 + ( + n+7 3 + ) + "; + test("zh-tw", "SimpleSpeak", expr, "2 乘 n 加 7 選 3")?; + return Ok(()); + +} + +#[test] +fn binomial_non_simple_bottom() -> Result<()> { + let expr = " + 2 + ( + 7 k+3 + ) + "; + test("zh-tw", "SimpleSpeak", expr, "2 乘 7 選 k 加 3")?; + return Ok(()); + +} + +#[test] +fn binomial_non_simple_top_and_bottom() -> Result<()> { + let expr = " + 2 + ( + n+7 k+3 + ) + "; + test("zh-tw", "SimpleSpeak", expr, "2 乘, n 加 7 選 k 加 3")?; + return Ok(()); + +} diff --git a/tests/Languages/zh/tw/SimpleSpeak/subscripts.rs b/tests/Languages/zh/tw/SimpleSpeak/subscripts.rs new file mode 100644 index 00000000..325542e2 --- /dev/null +++ b/tests/Languages/zh/tw/SimpleSpeak/subscripts.rs @@ -0,0 +1,64 @@ +use crate::common::*; +use anyhow::Result; + +#[test] +fn msub_simple() -> Result<()> { + let expr = " x 1 "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 1")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Medium")], expr, "x 下標 1")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x 下標 1")?; + return Ok(()); + + } + +#[test] +fn msub_not_simple() -> Result<()> { + let expr = " x 1.2 "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 下標 1.2")?; + return Ok(()); + + } + +#[test] +fn msubsup_not_simple() -> Result<()> { + let expr = " x 1.2 3 "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 下標 1.2, 立方")?; + return Ok(()); + + } + +#[test] +fn msub_simple_mi() -> Result<()> { + let expr = " x i "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 下標 i")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x 下標 i")?; + return Ok(()); + +} + +#[test] +fn msub_simple_number_follows() -> Result<()> { + let expr = " x 1 102 "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 1, 10 平方")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x 下標 1, 10 平方")?; + return Ok(()); + +} + +#[test] +fn msub_simple_non_number_follows() -> Result<()> { + let expr = " x 1 2 "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 1, 平方")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x 下標 1, 平方")?; + return Ok(()); + +} + +#[test] +fn msubsup_simple() -> Result<()> { + let expr = " x 1 x,2 "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 1, x 平方")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x 下標 1, x 平方")?; + return Ok(()); + +} \ No newline at end of file diff --git a/tests/Languages/zh/tw/alphabets.rs b/tests/Languages/zh/tw/alphabets.rs index ee32a809..b0342cb8 100644 --- a/tests/Languages/zh/tw/alphabets.rs +++ b/tests/Languages/zh/tw/alphabets.rs @@ -9,7 +9,7 @@ fn special_alphabet_chars() -> Result<()> { let expr = " ,"; test("zh-tw", "SimpleSpeak", expr, "fraktur 大寫 h 逗號 fraktur 大寫 c")?; let expr = " ,"; - test("zh-tw", "SimpleSpeak", expr, "空心 大寫 h 逗號 空心 大寫 pi")?; + test("zh-tw", "SimpleSpeak", expr, "雙線 大寫 h 逗號 雙線 大寫 pi")?; let expr = " ,"; test("zh-tw", "SimpleSpeak", expr, "草體 大寫 i 逗號 草體 大寫 m")?; return Ok(()); @@ -24,7 +24,7 @@ fn greek() -> Result<()> { test("zh-tw", "SimpleSpeak", expr, "alpha 逗號 omega")?; // MathType private space versions let expr = " ,"; - test("zh-tw", "SimpleSpeak", expr, "空心 大寫 delta 逗號 空心 大寫 upsilon")?; + test("zh-tw", "SimpleSpeak", expr, "雙線 大寫 delta 逗號 雙線 大寫 upsilon")?; let expr = " α,ω"; test("zh-tw", "SimpleSpeak", expr, "alpha 逗號 omega")?; return Ok(()); @@ -51,6 +51,8 @@ fn parenthesized() -> Result<()> { fn circled() -> Result<()> { let expr = " ,"; test("zh-tw", "SimpleSpeak", expr, "圈圈 大寫 a 逗號 圈圈 大寫 z")?; + let expr = " 🅐,🅩"; + test("zh-tw", "SimpleSpeak", expr, "黑圈圈 大寫 a 逗號 黑圈圈 大寫 z")?; let expr = " ,"; test("zh-tw", "SimpleSpeak", expr, "圈圈 a 逗號 圈圈 z")?; return Ok(()); @@ -90,18 +92,18 @@ fn bold_fraktur() -> Result<()> { #[test] fn double_struck() -> Result<()> { let expr = " 𝔸,𝕐"; - test("zh-tw", "SimpleSpeak", expr, "空心 大寫 a 逗號 空心 大寫 y")?; + test("zh-tw", "SimpleSpeak", expr, "雙線 大寫 a 逗號 雙線 大寫 y")?; let expr = " 𝕒,𝕫"; - test("zh-tw", "SimpleSpeak", expr, "空心 a 逗號 空心 z")?; + test("zh-tw", "SimpleSpeak", expr, "雙線 a 逗號 雙線 z")?; let expr = " 𝟘,𝟡"; - test("zh-tw", "SimpleSpeak", expr, "空心 0 逗號 空心 9")?; + test("zh-tw", "SimpleSpeak", expr, "雙線 0 逗號 雙線 9")?; // MathType private space versions let expr = " ,"; - test("zh-tw", "SimpleSpeak", expr, "空心 大寫 a 逗號 空心 大寫 y")?; + test("zh-tw", "SimpleSpeak", expr, "雙線 大寫 a 逗號 雙線 大寫 y")?; let expr = " ,"; - test("zh-tw", "SimpleSpeak", expr, "空心 a 逗號 空心 z")?; + test("zh-tw", "SimpleSpeak", expr, "雙線 a 逗號 雙線 z")?; let expr = " ,"; - test("zh-tw", "SimpleSpeak", expr, "空心 0 逗號 空心 9")?; + test("zh-tw", "SimpleSpeak", expr, "雙線 0 逗號 雙線 9")?; return Ok(()); } @@ -389,10 +391,19 @@ fn turned() -> Result<()> { } +#[test] +fn unicode_typo_regressions() -> Result<()> { + test("zh-tw", "SimpleSpeak", "", "上標1")?; + test("zh-tw", "SimpleSpeak", "", "conjunction")?; + Ok(()) +} + #[test] fn enclosed_numbers() -> Result<()> { let expr = " ,"; test("zh-tw", "SimpleSpeak", expr, "圈圈 1 逗號 圈圈 9")?; + let expr = " ,"; + test("zh-tw", "SimpleSpeak", expr, "黑圈圈1 逗號 圈圈50")?; let expr = " ,"; test("zh-tw", "SimpleSpeak", expr, "括號圍繞 1 逗號 括號圍繞 9")?; let expr = " ,"; diff --git a/tests/Languages/zh/tw/chemistry.rs b/tests/Languages/zh/tw/chemistry.rs index b9c9ea43..a29faf78 100644 --- a/tests/Languages/zh/tw/chemistry.rs +++ b/tests/Languages/zh/tw/chemistry.rs @@ -690,3 +690,80 @@ fn mhchem_roman_in_superscript() -> Result<()> { } +#[test] +fn dropped_msubsup_bug_358() -> Result<()> { + let expr = r#" + + + 2 + + + SO + + 2 + + + + + + + + + O + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + SO + + 3 + + + + + + + + "#; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "2, 大寫 s, 大寫 o, 2; 加; 大寫 o, 2 左右平衡 2, 大寫 s, 大寫 o, 3")?; + return Ok(()); + +} + + diff --git a/tests/Languages/zh/tw/intent.rs b/tests/Languages/zh/tw/intent.rs index 6df39ff4..de629338 100644 --- a/tests/Languages/zh/tw/intent.rs +++ b/tests/Languages/zh/tw/intent.rs @@ -4,6 +4,98 @@ use crate::common::*; use anyhow::Result; +#[test] +fn silent_intent() -> Result<()> { + let expr = " 2 x "; + test("zh-tw", "SimpleSpeak", expr, "2 x")?; + test("zh-tw", "LiteralSpeak", expr, "2 x")?; + return Ok(()); + +} + +#[test] +fn prefix_intent() -> Result<()> { + let expr = r#" x T "#; + test("zh-tw", "SimpleSpeak", expr, "testing x")?; + return Ok(()); + +} + +#[test] +fn postfix_intent() -> Result<()> { + let expr = r#" x T "#; + test("zh-tw", "SimpleSpeak", expr, "x testing")?; + return Ok(()); + +} + +#[test] +fn infix_intent() -> Result<()> { + let expr = r#" + x + y + z + "#; + test("zh-tw", "SimpleSpeak", expr, "x testing y testing z testing 2")?; + return Ok(()); + +} + +#[test] +fn infix_intent_no_args() -> Result<()> { + // this is illegal intent, so it is just an mrow with one child + let expr = r#" + x + "#; + test("zh-tw", "SimpleSpeak", expr, "x")?; + return Ok(()); + +} + +#[test] +fn infix_intent_one_arg() -> Result<()> { + let expr = r#" + x + "#; + // Note: we say the intent name because there are infix plus/minus with a single arg due to continued rows or combined columns + test("zh-tw", "SimpleSpeak", expr, "testing x")?; + return Ok(()); + +} + +#[test] +fn function_intent() -> Result<()> { + let expr = r#" + x + y + z + "#; + test("zh-tw", "SimpleSpeak", expr, "testing x 逗號 y 逗號 z 逗號 2")?; + return Ok(()); + +} + +#[test] +fn function_no_args_intent() -> Result<()> { + // this is illegal intent, so it is just an mrow with one child + let expr = r#" + x + "#; + test("zh-tw", "SimpleSpeak", expr, "x")?; + return Ok(()); + +} + +#[test] +fn function_one_arg_intent() -> Result<()> { + let expr = r#" + x + "#; + test("zh-tw", "SimpleSpeak", expr, "testing x")?; + return Ok(()); + +} + #[test] fn silent_intent_mi() -> Result<()> { let expr = " 2 x"; @@ -38,6 +130,7 @@ fn silent_intent_underscore() -> Result<()> { #[test] fn intent_prob_x() -> Result<()> { + //init_logger(); let expr = " x diff --git a/tests/Languages/zh/tw/mtable.rs b/tests/Languages/zh/tw/mtable.rs index abc649f6..8145ab10 100644 --- a/tests/Languages/zh/tw/mtable.rs +++ b/tests/Languages/zh/tw/mtable.rs @@ -226,6 +226,43 @@ fn matrix_2x3() -> Result<()> { return Ok(()); } +#[test] +fn augmented_matrix_2x3() -> Result<()> { + let expr = " + + + [ + + + + 3 + + + 1 + + + 4 + + + + + 0 + + + 2 + + + 6 + + + + ] + + "; + test("zh-tw", "SimpleSpeak", expr, "2 乘 3 增廣矩陣; 列 1; 3, 1, 4; 列 2; 0, 2, 6")?; + Ok(()) +} + #[test] fn matrix_2x3_labeled() -> Result<()> { @@ -555,4 +592,154 @@ let expr = " return Ok(()); } + // Test preferences + +#[test] +fn augmented_matrix_3x4_end_matrix() -> Result<()> { +let expr = " + + [ + + + 1 + 2 + -1 + 3 + + + -3 + 3 + -1 + 2 + + + 2 + 3 + 2 + -1 + + + ] + +"; + test("zh-tw", "SimpleSpeak", + expr, "3 乘 4 增廣矩陣; 列 1; 行 1; 1, 行 2; 2, 行 3; 負 1, 行 4; 3; \ + 列 2; 行 1; 負 3, 行 2; 3, 行 3; 負 1, 行 4; 2; \ + 列 3; 行 1; 2, 行 2; 3, 行 3; 2, 行 4; 負 1")?; + Ok(()) + } + + + + + + + + +#[test] +fn matrix_times() -> Result<()> { + let expr = " + 1234 + abcd + "; + test("zh-tw", "SimpleSpeak", expr, + "2 乘 2 矩陣; 列 1; 1, 2; 列 2; 3, 4; 乘, 2 乘 2 矩陣; 列 1; a, b; 列 2; c, d")?; + return Ok(()); + } + + + +#[test] +fn zero_matrix() -> Result<()> { + let expr = " + [ + + 00 + 00 + + ] + "; + test("zh-tw", "SimpleSpeak", expr, + "2 乘 2 零矩陣")?; + return Ok(()); + } + +#[test] +fn identity_matrix() -> Result<()> { + let expr = " + ( + + 100 + 010 + 001 + + ) + "; + test("zh-tw", "SimpleSpeak", expr, + "3 乘 3 單位矩陣")?; + return Ok(()); + } + +#[test] +fn identity_matrix_false_positive_negative_one() -> Result<()> { + let expr = " + [ + + 10 + 0-1 + + ] + "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "2 乘 2 對角矩陣; 行 1; 1; 行 2; 負 1")?; + Ok(()) +} + +#[test] +fn identity_matrix_false_positive_zero_diagonal() -> Result<()> { + let expr = " + [ + + 10 + 00 + + ] + "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "2 乘 2 對角矩陣; 行 1; 1")?; + Ok(()) +} + +#[test] +fn diagonal_matrix() -> Result<()> { + let expr = " + ( + + 200 + 010 + 00x2 + + ) + "; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "3 乘 3 對角矩陣; 行 1; 2; 行 2; 1; 行 3; x 平方")?; + // test_prefs("en", "SimpleSpeak", vec![("Verbosity", "Verbose")], + // expr, "the 3 by 3 diagonal matrix; row 1, column 1, 2; row 2, column 2, 1; row 3, column 3, x squared"); + return Ok(()); + } + +#[test] +fn single_line_with_label() -> Result<()> { + let expr = r#" + + + (2) + 𝑏 = 2 + + + "#; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "1 方程, 帶有標籤 2; b 等於 2")?; + return Ok(()); + } diff --git a/tests/Languages/zh/tw/shared.rs b/tests/Languages/zh/tw/shared.rs index 612d30db..3d947468 100644 --- a/tests/Languages/zh/tw/shared.rs +++ b/tests/Languages/zh/tw/shared.rs @@ -11,6 +11,7 @@ fn modified_vars() -> Result<()> { c ̆ b ̌ c ` + + r ˇ + x . y ˙ z ¨ @@ -20,7 +21,7 @@ fn modified_vars() -> Result<()> { t "; test("zh-tw", "SimpleSpeak", expr, - "a grave, b tilde, c breve, b check, c grave; 加; \ + "a grave, b tilde, c breve, b check, c grave; 加 r check 加; \ x 點, y dot, z double dot, u triple dot, v quadruple dot; 加 x hat, 加 向量 t")?; return Ok(()); @@ -70,6 +71,22 @@ fn binomial_mmultiscripts() -> Result<()> { } +#[test] +fn binomial_mmultiscripts_other() -> Result<()> { + let expr = "Cmn"; + test("zh-tw", "SimpleSpeak", expr, "n 選 m")?; + return Ok(()); + +} + +#[test] +fn binomial_subscript() -> Result<()> { // C_{n,k} + let expr = "Cn,m"; + test("zh-tw", "SimpleSpeak", expr, "n 選 m")?; + return Ok(()); + +} + #[test] fn permutation_mmultiscripts() -> Result<()> { @@ -151,7 +168,7 @@ fn simple_msubsup() -> Result<()> { "; - test("zh-tw", "SimpleSpeak", expr, "x 下標 k 的 i 次方")?; + test("zh-tw", "SimpleSpeak", expr, "x 下標 k, 的 i 次方")?; return Ok(()); } @@ -182,11 +199,13 @@ fn presentation_mathml_in_semantics() -> Result<()> { "; - test("zh-tw", "SimpleSpeak", expr, "x 下標 k 的 i 次方")?; + test("zh-tw", "SimpleSpeak", expr, "x 下標 k, 的 i 次方")?; return Ok(()); } + + #[test] fn ignore_period() -> Result<()> { // from https://en.wikipedia.org/wiki/Probability @@ -323,6 +342,35 @@ return Ok(()); } +#[test] +fn bug_199_2pi() -> Result<()> { + let expr = " + + [ + + 0 + + , + + 2 + π + + ) + + "; + test("zh-tw", "SimpleSpeak",expr, "閉開區間 0 逗號 2 pi")?; + return Ok(()); + +} + +#[test] +fn caret_and_hat() -> Result<()> { + let expr = "x^2+y^"; + test("zh-tw", "SimpleSpeak",expr, "x caret 2 加 y hat")?; + return Ok(()); + +} + #[test] fn mn_with_space() -> Result<()> { let expr = "1 234 567"; @@ -330,3 +378,185 @@ fn mn_with_space() -> Result<()> { return Ok(()); } + +#[test] +fn ignore_bold() -> Result<()> { + let expr = r#" + x + = + 2 + + 𝒔𝒊𝒏 + + t + + - + 1 + "#; + test_prefs("zh-tw", "SimpleSpeak", vec![("IgnoreBold", "false")], + expr, "粗斜體 x 等於, 2 sine 粗斜體 t, 減 1")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("IgnoreBold", "true")], + expr, "x 等於, 2 sine t, 減 1")?; + return Ok(()); + +} + +#[test] +fn mn_with_block_and_decimal_separators() -> Result<()> { + let expr = "1,234.56"; // may want to change this for another language + test_prefs("zh-tw", "SimpleSpeak", vec![("DecimalSeparators", "."), ("BlockSeparators", " ,")], expr, "1234.56")?; + return Ok(()); + +} + +#[test] +fn divergence() -> Result<()> { + let expr = "·F"; // may want to change this for another language + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "div 大寫 f")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "divergence 大寫 f")?; + return Ok(()); + +} + +#[test] +fn curl() -> Result<()> { + let expr = "×F"; + // may want to change this for another language + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "curl 大寫 f")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "curl 大寫 f")?; + return Ok(()); + +} + +#[test] +fn gradient() -> Result<()> { + let expr = "F"; + // may want to change this for another language + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "del 大寫 f")?; + test_prefs("zh-tw", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "gradient 大寫 f")?; + return Ok(()); + +} + +//#[test] +//fn literal_speak_perpendicular() -> Result<()> { +// let expr = r#" +// +// +// A +// +// +// +// +// B +// +// +// +// "#; +// test("zh-tw", "LiteralSpeak", expr, "大寫 a 右箭頭, 垂直於, 大寫 b 右箭頭")?; +// return Ok(()); +// +//} + +#[test] +fn literal_speak_chars() -> Result<()> { + let expr = r#" + + + x×y + · + z/2 + + + ab + + + x! + + + "#; + test("zh-tw", "LiteralSpeak", expr, "豎線; x cross, y 乘 z slash 2; 加 a; 雙豎線, b 加 x 階乘; 豎線")?; + return Ok(()); + +} + +#[test] +fn literal_speak_with_name() -> Result<()> { + let expr = r#" + + f + + + ( + + x + ! + + ) + + + "#; + test("zh-tw", "LiteralSpeak", expr, "forced f, 左小括 x 階乘 右小括")?; + return Ok(()); + +} + +#[test] +fn literal_speak_with_property() -> Result<()> { + let expr = r#" + + f + + + ( + + x + ! + + ) + + + "#; + test("zh-tw", "LiteralSpeak", expr, "f, 左小括 x 階乘 右小括")?; + return Ok(()); + +} + +//#[test] +//fn literal_intent_property() -> Result<()> { +// let expr = r#" +// +// +// A +// +// +// +// +// B +// +// +// +// "#; +// test("zh-tw", "SimpleSpeak", expr, "大寫 a 右箭頭, 垂直於, 大寫 b 右箭頭")?; +// return Ok(()); +// +//} + +#[test] +fn literal_intent_property_with_name() -> Result<()> { + let expr = r#" + + f + + + ( + + x + ! + + ) + + + "#; + test("zh-tw", "SimpleSpeak", expr, "forced f, 左小括 x 階乘 右小括")?; + return Ok(()); + +} diff --git a/tests/Languages/zh/tw/units.rs b/tests/Languages/zh/tw/units.rs index 4fb1f1b4..3f81662c 100644 --- a/tests/Languages/zh/tw/units.rs +++ b/tests/Languages/zh/tw/units.rs @@ -525,3 +525,17 @@ fn test_mtext_inference() -> Result<()> { return Ok(()); } + #[test] + fn infer_unit() -> Result<()> { + let expr = r#" + 3m, + 1km, + 3m, + 310F, + mmin + "#; + test("zh-tw", "SimpleSpeak", expr, + "3 米 逗號 1 千-米, 逗號 3 米 逗號 10 分之 3 法拉, 逗號, m 下標 min 結束下標")?; + return Ok(()); + + }