From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- support/emacs-modes/u8tex.el | 536 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 536 insertions(+) create mode 100644 support/emacs-modes/u8tex.el (limited to 'support/emacs-modes/u8tex.el') diff --git a/support/emacs-modes/u8tex.el b/support/emacs-modes/u8tex.el new file mode 100644 index 0000000000..878336c4d9 --- /dev/null +++ b/support/emacs-modes/u8tex.el @@ -0,0 +1,536 @@ +;;; quail/u8tex.el -- Quail package to input in -*- coding: utf-8 -*- + +;; Copyright (C) 2000 Sergei Pokrovsky +;; Time-stamp: <2000-12-08 19:00:30 pok>, v. 1.2 + +;; Keywords: mule, multilingual, unicode, input method, TeX + +;; Based on definitions stolen from "unicode-input.el" by +;; Florian Weimer . + +;; The latest version is to be found at CTAN/support/emacs-modes/u8tex.el; +;; e.g. . + +;; This file is not a part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: +;; +;; This file is intended for use with Markus Kuhn's Unicode fonts, +;; see , and the +;; Otfried Cheong's extension of Mule-UCS, available at +;; . + +;; The idea is to provide a routine way to input the many TeX +;; characters (and some more) using the familiar TeX notation. Surely +;; it is not convenient for typing a French or German text, for which +;; there are special packages; but I prefer to use it for a mixed +;; text, where some accented characters from various languages occur +;; sporadically, and it is better to type a longer key sequence +;; /"Arger for Ärger rather than suffer from unexpected äny" when +;; typing "any" (as it is usual with the shorter `"Arger' manner, or +;; with o'clock becoming oćlock etc). + +;; I've taken some liberties with the TeX notation: +;; 1. Backslash is replaced with solidus in its escape function. The +;; reason is obvious: TeX users heavily use backspace for many other +;; purposes as well. +;; 2. The prefix "text" is systematically dropped; just /euro rather +;; than /texteuro, /perthousand rather than \textperthousand. +;; 3. No internal spaces, e.g. /cC rather than {/c C} or /c{C}. +;; 4. /! and /? are used instead of !` and ?` -- like in EuroTeX, +;; just to reduce the number of escape characters. +;; 5. /3/4 etc is used instead of \textthreequarters. +;; 6. If HTML offers a ahorter Latin-1 name, it is preferred: +;; /reg rather than \textregistered, /nbsp rather than \nobreakspace, +;; /copy rather than \copyright etc. (Such abbreviations are marked +;; with "HTML" in a comment field.) + +;; Installation: + +;; Save this file as quail/u8tex.el (the "quail" may be your +;; emacs/20.*/leim/quail or a directory on your load-path), byte +;; compile it and put a record like this: +;; +;; (register-input-method +;; "u8tex" "utf-8" 'quail-use-package +;; "τεχ" "Unicode input using (Euro)TeX names" +;; "quail/u8tex") +;; +;; into emacs/20.*/leim/leim-list.el (probably there exists a more +;; civilized way to extend leim-list?). Then (after reloading Mule) +;; you can switch to u8tex in the usual way (`C-x C-m C-\ u8tex'; the +;; first u... is sufficient for completion in my environment). + +;;; Changes in v. 1.2: +;; 1. Documentation (reference to Otfried's package). +;; 2. Some HTML abbreviations are adopted (/copy, /reg etc). +;; 3. Errors corrected: /permil +;; 4. More amssymb characters. + +;;; Code: + +(require 'quail) + +(quail-define-package + "u8tex" "utf-8" "τεχ" t + "Input Unicode characters using (Euro)TeX names. +Use solidus (/) instead of backslash as Mule escape. + + effect | prefix | examples + ------------+--------+------------------- + acute | /' | /'a → á /'{} → ́ + grave | /` | /`a → à /`{} → ̀ + circumflex | /^ | /^a → â /^{} → ̂ + diæresis | /\" | /\"a → ä /\"{} → ̈ + dot above | /. | /.z → ż /.I → İ + macron | /= | /=a → ā /=e → ē /=H → Ħ + breve, háček| /u /v | /ua → ă /vc → č + cedilla | /c | /cc → ç /cs → ş + ogonek | /k | /ka → ą /kE → Ę + +// → /; /lq → ‘; /glqq → „; /S → §; /AE → Æ; /DH → Ð; x^2 → x²; /div → ÷ etc. + +" nil t nil nil nil nil nil nil nil nil t) + +(quail-define-rules + + ("/`A" ?À) ("/`a" ?à) + ("/`E" ?È) ("/`e" ?è) + ("/`I" ?Ì) ("/`i" ?ì) + ("/`O" ?Ò) ("/`o" ?ò) + ("/`U" ?Ù) ("/`u" ?ù) + + ("/'A" ?Á) ("/'a" ?á) + ("/'C" ?Ć) ("/'c" ?ć) + ("/'E" ?É) ("/'e" ?é) + ("/'I" ?Í) ("/'i" ?í) + ("/'N" ?Ń) ("/'n" ?ń) + ("/'L" ?Ĺ) ("/'l" ?ĺ) + ("/'O" ?Ó) ("/'o" ?ó) + ("/'R" ?Ŕ) ("/'r" ?ŕ) + ("/'S" ?Ś) ("/'s" ?ś) + ("/'U" ?Ú) ("/'u" ?ú) + ("/'Y" ?Ý) ("/'y" ?ý) + ("/'Z" ?Ź) ("/'z" ?ź) + + ("/^A" ?Â) ("/^a" ?â) + ("/^C" ?Ĉ) ("/^c" ?ĉ) + ("/^E" ?Ê) ("/^e" ?ê) + ("/^G" ?Ĝ) ("/^g" ?ĝ) + ("/^H" ?Ĥ) ("/^h" ?ĥ) + ("/^I" ?Î) ("/^i" ?î) + ("/^J" ?Ĵ) ("/^j" ?ĵ) + ("/^O" ?Ô) ("/^o" ?ô) + ("/^S" ?Ŝ) ("/^s" ?ŝ) + ("/^U" ?Û) ("/^u" ?û) + ("/^W" ?Ŵ) ("/^w" ?ŵ) + ("/^Y" ?Ŷ) ("/^y" ?ŷ) + + ("/~A" ?Ã) ("/~a" ?ã) + ("/~I" ?Ĩ) ("/~i" ?ĩ) + ("/~N" ?Ñ) ("/~n" ?ñ) + ("/~I" ?Ĩ) ("/~i" ?ĩ) + ("/~O" ?Õ) ("/~o" ?õ) + ("/~U" ?Ũ) ("/~u" ?ũ) + + ("/rU" ?Ů) ("/ru" ?ů) ; \r[ing] like en EuroTeX + + ("/\"A" ?Ä) ("/\"a" ?ä) + ("/\"E" ?Ë) ("/\"e" ?ë) + ("/\"I" ?Ï) ("/\"i" ?ï) + ("/\"O" ?Ö) ("/\"o" ?ö) + ("/\"U" ?Ü) ("/\"u" ?ü) + ("/\"Y" ?Ÿ) ("/\"y" ?ÿ) + + ("/cC" ?Ç) ("/cc" ?ç) + ("/cG" ?Ģ) ("/cg" ?ģ) ; actually it must be comma + ("/cN" ?Ņ) ("/cn" ?ņ) + ("/cS" ?Ş) ("/cs" ?ş) + ("/cT" ?Ţ) ("/ct" ?ţ) ; actually it must be comma + + ("/=A" ?Ā) ("/=a" ?ā) + ("/=E" ?Ē) ("/=e" ?ē) + ("/=I" ?Ī) ("/=i" ?ī) + ("/=O" ?Ō) ("/=o" ?ō) + ("/=U" ?Ū) ("/=u" ?ū) + ("/=H" ?Ħ) ("/=h" ?ħ) ; abuse + ("/=T" ?Ŧ) ("/=t" ?ŧ) ; abuse + + ("/uA" ?Ă) ("/ua" ?ă) + ("/uE" ?Ĕ) ("/ue" ?ĕ) + ("/uG" ?Ğ) ("/ug" ?ğ) + ("/uI" ?Ĭ) ("/ui" ?ĭ) + ("/uO" ?Ŏ) ("/uo" ?ŏ) + ("/uU" ?Ŭ) ("/uu" ?ŭ) + + ("/vC" ?Č) ("/vc" ?č) + ("/vD" ?Ď) ("/vd" ?ď) + ("/vE" ?Ě) ("/ve" ?ě) + ("/vL" ?Ľ) ("/vl" ?ľ) + ("/vN" ?Ň) ("/vn" ?ň) + ("/vR" ?Ř) ("/vr" ?ř) + ("/vS" ?Š) ("/vs" ?š) + ("/vT" ?Ť) ("/vt" ?ť) + ("/vZ" ?Ž) ("/vz" ?ž) + + ("/.A" ?Ȧ) ("/.a" ?ȧ) + ("/.C" ?Ċ) ("/.c" ?ċ) + ("/.E" ?Ė) ("/.e" ?ė) + ("/.G" ?Ġ) ("/.g" ?ġ) + ("/.I" ?İ) ("/i" ?ı) ; also \imath + ("/.O" ?Ȯ) ("/.o" ?ȯ) + ("/.Z" ?Ż) ("/.z" ?ż) + + ("/HO" ?Ő) ("/Ho" ?ő) + ("/HU" ?Ű) ("/Hu" ?ű) + + ("/kA" ?Ą) ("/ka" ?ą) + ("/kE" ?Ę) ("/ke" ?ę) + ("/kI" ?Į) ("/ki" ?į) + ("/kU" ?Ų) ("/ku" ?ų) + + ("/AA" ?Å) ("/aa" ?å) + ("/AE" ?Æ) ("/ae" ?æ) + ("/DH" ?Ð) ("/dh" ?ð) + ("/DJ" ?Đ) ("/dj" ?đ) + ("/Y" ?IJ) ("/y" ?ij) ; Dutch ij + ("/L" ?Ł) ("/l" ?ł) + ("/Lp" ?Ŀ) ("/lp" ?ŀ) ; Catalan l dot, as in paraŀlel + ("/NG" ?Ŋ) ("/ng" ?ŋ) + ("/O" ?Ø) ("/o" ?ø) + ("/OE" ?Œ) ("/oe" ?œ) + ("/longs" ?ſ) + ("/ss" ?ß) + ("/st" ?ſt) ; or ?st + ("/TH" ?Þ) ("/th" ?þ) + + ;; Lowercase Greek letters + ;; (the missing caps like \Alpha come first) + + ("/Alpha" ?Α) ("/alpha" ?α) + ("/Beta" ?Β) ("/beta" ?β) + ("/gamma" ?γ) ("/Gamma" ?Γ) + ("/delta" ?δ) ("/Delta" ?Δ) + ("/Epsilon" ?Ε) ("/epsilon" ?ε) + ("/Zeta" ?Ζ) ("/zeta" ?ζ) + ("/Eta" ?Η) ("/eta" ?η) + ("/theta" ?θ) ("/vartheta" ?ϑ) ("/Theta" ?Θ) + ("/Iota" ?Ι) ("/iota" ?ι) + ("/Kappa" ?Κ) ("/kappa" ?κ) + ("/lambda" ?λ) ("/Lambda" ?Λ) + ("/Mu" ?Μ) ("/mu" ?μ) + ("/Nu" ?Ν) ("/nu" ?ν) + ("/Omicron" ?Ο) ("/omicron" ?ο) + ("/xi" ?ξ) ("/Xi" ?Ξ) + ("/pi" ?π) ("/varpi" ?ϖ) ("/Pi" ?Π) + ("/Rho" ?Ρ) ("/rho" ?ρ) ("/varrho" ?ϱ) + ("/sigma" ?σ) ("/varsigma" ?ς) ("/Sigma" ?Σ) + ("/Tau" ?Τ) ("/tau" ?τ) + ("/upsilon" ?υ) ("/Upsilon" ?Υ) + ("/phi" ?ϕ) ("/varphi" ?φ) ("/Phi" ?Φ) + ("/Chi" ?Χ) ("/chi" ?χ) + ("/psi" ?ψ) ("/Psi" ?Ψ) + ("/omega" ?ω) ("/Omega" ?Ω) + + ;; Miscellaneous symbols + + ("/aleph" ?ℵ) ("/beth" ?ℶ) ("/gimel" ?ℷ) ("/daleth" ?ℸ) + ("/hbar" ?ℏ) + ("/imath" ?ı) + ("/ell" ?ℓ) + ("/wp" ?℘) + ("/Re" ?ℜ) ("/Im" ?ℑ) + ("/partial" ?∂) + ("/infty" ?∞) + ("/prime" ?′) + ("/emptyset" ?∅) + ("/nabla" ?∇) + ("/surd" ?√) + ("/top" ?⊤) + ("/bot" ?⊥) + ("/|" ?∥) + ("/angle" ?∠) + ("/triangle" ?△) + ("/backslash" ?\\) + ("//" ?/) ; special !! + ("/forall" ?∀) ("/exists" ?∃) + ("/neg" ?¬) + ("/flat" ?♭) ("/natural" ?♮) ("/sharp" ?♯) + ("/clubsuit" ?♣) ("/diamondsuit" ?♢) + ("/heartsuit" ?♡) ("/spadesuit" ?♠) + ("/mho" ?℧) ("/complement" ?∁) ("/lozenge" ?◊) ; amssymb + ("/square" ?□) ("/blacksquare" ?■) ; amssymb + ("/barwedge" ?⊼) ("/veebar" ?⊻) ; amssymb + + ;; “Large” operators + + ("/sum" ?∑) + ("/prod" ?∏) + ("/coprod" ?∐) + ("/int" ?∫) + ("/oint" ?∮) + ("/bigcap" ?⋂) + ("/bigcup" ?⋃) + ("/bigvee" ?⋁) + ("/bigwedge" ?⋀) + + ;; Binary operations + + ("/pm" ?±) ("/mp" ?∓) + ("/setminus" ?∖) + ("/cdot" ?⋅) ("/times" ?×) + ("/ast" ?∗) ("/star" ?⋆) + ("/diamond" ?⋄) + ("/circ" ?∘) + ("/bullet" ?∙) + ("/div" ?÷) + ("/cap" ?∩) ("/cup" ?∪) + ("/uplus" ?⊎) + ("/sqcap" ?⊓) ("/sqcup" ?⊔) + ("/triangleleft" ?◁) + ("/triangleright" ?▷) + ("/wr" ?≀) + ("/bigcirc" ?◯) + ("/bigtriangleup" ?△) ("/bigtriangledown" ?▽) + ("/vee" ?∨) ("/wedge" ?∧) + ("/oplus" ?⊕) ("/ominus" ?⊖) + ("/otimes" ?⊗) ("/oslash" ?⊘) + ("/odot" ?⊙) + ("/dagger" ?†) ("/ddagger" ?‡) + ("/amalg" ?∐) + + ;; Relations + + ("/leq" ?≤) + ("/prec" ?≺) ("/preceq" ?≼) + ("/ll" ?≪) + ("/subset" ?⊂) ("/subseteq" ?⊆) + ("/sqsubseteq" ?⊑) + ("/in" ?∈) + ("/vdash" ?⊢) + ("/smile" ?⌣) + ("/frown" ?⌢) + ("/geq" ?≥) + ("/succ" ?≻) ("/succeq" ?≽) + ("/gg" ?≫) + ("/supset" ?⊃) ("/supseteq" ?⊇) + ("/sqsupseteq" ?⊒) + ("/ni" ?∋) + ("/dashv" ?⊣) + ("/mid" ?∣) + ("/parallel" ?∥) + ("/equiv" ?≡) + ("/sim" ?∼) ("/simeq" ?≃) + ("/asymp" ?≍) + ("/approx" ?≈) + ("/cong" ?≅) + ("/bowtie" ?⋈) + ("/propto" ?∝) + ("/models" ?⊨) + ("/doteq" ?≐) + ("/perp" ?⊥) + + ;; Negated relations + + ("/not<" ?≮) + ("/not/leq" ?≰) + ("/not/prec" ?⊀) ("/not/preceq" ?⋠) + ("/not/subset" ?⊄) ("/not/subseteq" ?⊈) + ("/not/sqsubseteq" ?⋢) + ("/not>" ?≯) + ("/not/geq" ?≱) + ("/not/succ" ?⊁) ("/not/succeq" ?⋡) + ("/not/supset" ?⊅) ("/not/supseteq" ?⊉) + ("/not/sqsupseteq" ?⋣) + ("/not=" ?≠) + ("/not/equiv" ?≢) + ("/not/sim" ?≁) ("/not/simeq" ?≄) + ("/not/approx" ?≉) + ("/not/cong" ?≇) + ("/not/asymp" ?≭) + + ;; Arrows + + ("/leftarrow" ?←) ("/Leftarrow" ?⇐) + ("/rightarrow" ?→) ("/Rightarrow" ?⇒) + ("/leftrightarrow" ?↔) ("/Leftrightarrow" ?⇔) + ("/mapsto" ?↦) + ("/hookleftarrow" ?↩) + ("/leftharpoonup" ?↼) + ("/leftharpoondown" ?↽) + ("/rightleftharpoons" ?⇌) + ("/hookrightarrow" ?↪) + ("/rightharpoonup" ?⇀) + ("/rightharpoondown" ?⇁) + ("/searrow" ?↘) + ("/swarrow" ?↙) + ("/nwarrow" ?↖) + ("/uparrow" ?↑) ("/Uparrow" ?⇑) + ("/downarrow" ?↓) ("/Downarrow" ?⇓) + ("/updownarrow" ?↕) ("/Updownarrow" ?⇕) + ("/nearrow" ?↗) + + ;; Openings ;; Closings + + ("/lfloor" ?⌊) ("/rfloor" ?⌋) + ("/langle" ?〈) ("/rangle" ?〉) + ("/lceil" ?⌈) ("/rceil" ?⌉) + + ;; Alternate names + + ("/ne" ?≠) ("/neq" ?≠) + ("/le" ?≤) ("/ge" ?≥) + ("/to" ?→) + ("/gets" ?←) + ("/owns" ?∋) + ("/land" ?∧) + ("/lor" ?∨) + ("/lnot" ?¬) + ("/vert" ?∣) + ("/Vert" ?∥) + + ;; Non-math symbols + + ("/S" ?§) ("/P" ?¶) + ("/dag" ?†) ("/ddag" ?‡) + ("/brokenbar" ?¦) + ("/brvbar" ?¦) ; like in HTML + ("/reg" ?®) ; like in HTML, unlike TeX's /registered + ("/trade" ?™) ; like in HTML + ("/frownie" ?☹) + ("/smiley" ?☺) + ("/blacksmiley" ?☻) + + ;; Typographic symbols and ligatures + + ("''" ?”) ("``" ?“) + ("/lq" ?‘) ("/rq" ?’) + ("/flqq" ?«) ("/frqq" ?») ; French double quotes + ("/flq" ?‹) ("/frq" ?›) ; French double quotes + ("/glqq" ?„) ("/grqq" ?‟) ; German double quotes + ("/glq" ?‚) ("/grq" ?‛) ; German single quotes + ("/dots" ?…) + ("/-" ?‐) ; 2010 (HYPHEN) + ("/--" ?–) ; 2013 (EN DASH) + ("/---" ?—) ; 2014 (EM DASH) + ("/minus" ?−) ; 2212 (MINUS SIGN) + ("/nbsp" ? ) ; A0 (NO-BREAK SPACE), like in HTML +; ("/thinspace" ? ) +; ("/," ? ) + ("/ff" ?ff) + ("/fi" ?fi) + ("/fl" ?fl) + ("/ffi" ?ffi) + ("/ffl" ?ffl) + ("/!" ?¡) ("/?" ?¿); as in EuroTeX + ("/copy" ?©) ; like in HTML, unlike TeX's \copyright + ("/permil" ?‰) ; HTML (= PER MILLE SIGN) and wasysym + ("/perthousand" ?‰); \textperthousand + ("/micro" ?µ) ; different from GREEK SMALL LETTER /mu + ("/deg" ?°) ; like in HTML, unlike TeX's \textdegree + ("/1/4" ?¼) ; \textonequarter + ("/1/2" ?½) ; \textonehalf + ("/3/4" ?¾) ; \textthreequarters + + ;; Combining characters + + ("/'{}" ?́) + ("/`{}" ?̀) + ("/^{}" ?̂) + ("/\"{}" ?̈) + ("/~{}" ?̃) + ("/={}" ?¯) ; or else COMBINING MACRON = ("/={}" ?̄) ? + ("/.{}" ?̇) + ("/u{}" ?̆) + ("/v{}" ?̌) + ("/H{}" ?̋) + ("/t{}" ?͡) + ("/c{}" ?̧) + ("/d{}" ?̣) + ("/b{}" ?̱) + + ;; Subscripts + + ("_0" ?₀) ("_1" ?₁) ("_2" ?₂) ("_3" ?₃) ("_4" ?₄) + ("_5" ?₅) ("_6" ?₆) ("_7" ?₇) ("_8" ?₈) ("_9" ?₉) + ("_+" ?₊) ("_-" ?₋) ("_=" ?₌) + ("_(" ?₍) ("_)" ?₎) + + + ;; Superscripts + + ("^0" ?⁰) ("^1" ?¹) ("^2" ?²) ("^3" ?³) ("^4" ?⁴) + ("^5" ?⁵) ("^6" ?⁶) ("^7" ?⁷) ("^8" ?⁸) ("^9" ?⁹) + ("^+" ?⁺) ("^-" ?⁻) ("^=" ?⁼) + ("^(" ?⁽) ("^)" ?⁾) + ("^a" ?ª) ("^n" ?ⁿ) ("^o" ?º) + + ;; Currency signs + + ("/cent" ?¢) ; after HTML and wasy + ("/pound" ?£) ; after HTML + ("/curren" ?¤) ; like in HTML, cf \textcurrency + ("/euro" ?€) ; \texteuro + ("/yen" ?¥) ; \textyen + + ;; \mathbb + + ("/bbC" ?ℂ) ("/bbH" ?ℍ) ("/bbN" ?ℕ) ("/bbP" ?ℙ) + ("/bbQ" ?ℚ) ("/bbR" ?ℝ) ("/bbZ" ?ℤ) + +;; IPA (there is a dedicated MULE method!) + + ("/turna" ?ɐ) + ("/scripta" ?ɑ) + ("/turnscripta" ?ɒ) + ("/turnv" ?ʌ) + ("/dezh" ?ʤ) + ("/schwa" ?ə) ("/inve" ?ə) + ("/schwahook" ?ɚ) + ("/scriptg" ?ɡ) + ("/turnh" ?ɥ) + ("/openo" ?ɔ) + ("/scr" ?ʀ) + ("/invscr" ?ʁ) + ("/tesh" ?ʧ) + ("/upsilon" ?ʊ) + ("/turnw" ?ʍ) + ("/turny" ?ʎ) + ("/esh" ?ʃ) + ("/ezh" ?ʒ) + ("/long" ?ː) + ("/stress" ?ˈ) ; primary stress + ("/secstress" ?ˌ) ; secondary stress + +; Ancient Cyrillic (after x2enc): + + ("/FITA" ?Ѳ) ("/fita" ?ѳ) + ("/YAT" ?Ѣ) ("/yat" ?ѣ) + ("/BYUS" ?Ѫ) ("/byus" ?ѫ) + ("/LYUS" ?Ѧ) ("/lyus" ?ѧ) + ("/CYREPS" ?Є) ("/cyreps" ?є) + ("/IE" ?Ѥ) ("/ie" ?ѥ) + ("/`I" ?Ѝ) ("/`i" ?ѝ) + ("/OT" ?Ѿ) ("/ot" ?ѿ) + ("/UK" ?Ѹ) ("/uk" ?ѹ) + ("/IZH" ?Ѵ) ("/izh" ?ѵ) + ("/\"IZH" ?Ѷ) ("/\"izh" ?ѷ) + +) + +;;; u8tex.el ends here -- cgit v1.2.3