rime中州韵小狼毫 LaTex输入法配置

教程目录:rime中州韵小狼毫须鼠管安装配置教程 保姆级教程 100+增强功能配置教程

本文的分享一种在rime中州韵小狼毫须鼠管输入法中配置LaTex输入方案的方法,并不完美,仅供参考。

先睹为快

LaTex输入方案可以快捷的在公式模式下输入一些基础的数学公式,选词快捷,录入体验优良。
20240113151824_rec_

latex.schema.yaml

latex.schema.yaml 是我们的输入方案的方案文档,我们在 用户文件夹 下创建一个 txt 文档,然后改名为 latex.schema.yaml,latex.schema.yaml文档内容如下👇:

switches:- name: ascii_mode			# 默认为中文输出模式reset: 0states: [ 中文, 西文 ]- name: full_shape			# 字符默认半角输出reset: 0states: [ 半角, 全角 ]- name: ascii_punct			# 默认使用英文标点reset: 1states: [ 。,, ., ]- name: debug					# 默认debug开关为关闭状态reset: 0states: [Off, 🐞]engine:processors:- ascii_composer- key_binder- speller- recognizer- punctuator- selector- navigator- express_editorsegmentors:- matcher- ascii_segmentor- abc_segmentor- punct_segmentor- fallback_segmentortranslators:- table_translator- punct_translatorfilters:- uniquifier
key_binder:import_preset: defaultspeller:auto_select: truedelimiter: " ;'"
recognizer:import_preset: defaultpatterns:email: "^[A-Za-z][-_.0-9A-Za-z]*@.*$"url: "^(www[.]|https?:|ftp[.:]|mailto:|file:).*$|^[a-z]+[.].+$"
schema:author:- "dyy <douyaoyuan@126.com>"description: "LaTex 公式输入"name: "LaTex"schema_id: latexversion: 0.2
speller:alphabet: "zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA_|\\/<>-+=^()[]{}<"	# 定义输入字符的识别格式delimiter: " "
translator:dictionary: latexspelling_hints: 9

在上述脚本配置中,我们的schema节点中配置了以下内容:

  • schema_idlatex;这个schema_id将会在下文的default.custom.yaml中用到
  • nameLaTex;这个name的值LaTex将会出现在方案选单

latex.custom.yaml

一如既往,方案名.custom.yaml是对应方案文档的补丁文档,这个latex.custom.yaml文档中配置了用户的个性化的配置项目,此处latex.custom.yaml文档的配置如下👇:

patch:translator/enable_user_dict: false				# false:自动造词及动态词频功能失效;true:启用自动造词和动态词频style/inline_preedit: false						# 是否在输入行内进行预测生成,true 表示不单独显示输入字符engine/translators/+:								# 增加以下翻译器- lua_translator@latex_translator- lua_translator@latexHelp_translatorpunctuator:import_preset: symbolshalf_shape:"-": "-""|": "|""^": "^""]": "]""[": "["")": ")""(": "(""<": "<"">": ">"custom_phrase:encode_commit_history: falsedisable_user_dict_for_patterns:#  - "^z.*$"									# 这是原始默认设置- "^[a-y]{1,3}$"								# 三码及以下不使用自动调频、不自动造词

在以上配置中,我们为latex输入方案指定了以下关键配置:

  • 翻译器lua_translator@latex_translator:这个latex_translator的脚本文档将在下文中介绍。
  • 翻译器lua_translator@latexHelp_translator:这个latexHelp_translator的脚本文档将在下文中介绍。

latex.dict.yaml

latex.dict.yamlLaTex输入方案的字典文档,在该文档中我们定义了一些词组和按键的映射关系,latex.dict.yaml文档中的内容如下👇:

# Rime dictionary
# mim: set ts=8 sw=8 noet:
# encoding: utf-8
#
# latex - Latex
#
# dyy <douyaoyuan@126.com>
#---
name: latex
version: "0.1"
sort: by_weight #defaut:使用字典文档顺序;by_weight:使用权重进行排序
use_preset_vocabulary: false
...
#关于词表定义及词序权重的说明
#词表定义格式如下:
#输出项	编码	权重
#关于权重,数字大者,其在候选框内出现的位置则靠前,如果没有指定权重值,则以词表定时次序排序#常用组合
$$\textcolor{blue}{解:}$$	qev
$$\textcolor{blue}{证:}$$	ygh

👆上述字典中的内容很少,关于latex输入方案中的候选词组,更多需要依靠lua_translator生成,这我们下文中会有介绍.

default.custom.yaml

上文中我们定义了新的输入方案 latex,我们需要在 default.custom.yaml 中的方案选单中配置该输入方案,以便我们可以选择使用latex输入方案。default.custom.yaml中的配置如下👇:

patch:ascii_composer/switch_key:Caps_Lock: commit_code  # 候选状态下,按 Caps_Lock 后编码上屏Control_L: noop  # 左 ctrl 键无使用效果Control_R: noop  # 右 ctrl 键无使用效果Eisu_toggle: clear  # 按 Esc 键,清除候选编码,退出候选框Shift_L: commit_code  # 候选状态下,按 左 Shift 后,编码上屏Shift_R: commit_code  # 候选状态下,按 右 Shift 后,编码上屏ascii_composer:good_old_caps_lock: true  # true 通过 caps lock 键切换入英文模式后,保持大写输入状态engine/filters:- simplifier  # 引入简体拼音输入法过滤器- uniquifier  # 过滤重复候选项,依赖 simplifierkey_binder/bindings:- {accept: semicolon, send: 2, when: has_menu}  # 使用 ; 键选择第 2 候选词- {accept: apostrophe, send: 3, when: has_menu}  # 使用 . 键选择第 3 候选词- {accept: bracketleft, send: Page_Up, when: paging}  # 使用 PageUp 键向上翻页- {accept: bracketright, send: Page_Down, when: has_menu}  # 使用 PageDown 键向下翻页menu/page_size: 10  # 存在候选词选项时,每一页显示的候选词数量,最大是 10recognizer/patterns/punct: "^/([0-9]0?|[A-Za-z]+)$"  # 标点符号识别模式schema_list:- {schema: wubi_pinyin}			# 五笔・拼音 输入方案- {schema: easy_en}				# 英文输入方案- {schema: latex}				# latex输入方案- {schema: pinyin}				# 拼音输入switcher:abbreviate_options: true  # 功能选项显示为简写模式caption: "〔方案选单〕"  # 选项菜单的名字fold_options: true  # 功能选项折叠显示hotkeys: [F8]  # 使用 F8 键调出 方案选单

👆以上配置中,请注音观察schema_list节点下第三个schema的内容。

rime.lua

pinyin 输入方案中我们使用到了lua_translatorlua_filter,我们在rime.lua中增加一个translator翻译器和一个filter滤镜,rime.lua中的配置如下👇:

help_translator = require("help")
inputShow_translator = require("inputShow")
inputShow_Filter = require("inputShow_Filter")
Upper_Filter = require("Upper_Filter")
dic_4w_Filter = require("dic_4w_Filter")
phraseReplace_Filter = require("phraseReplace_Filter")
pinyinAdding_Filter = require("pinyinAdding_Filter")
dateTime_Filter = require("dateTime_filter")
dynamicPhrase_Filter = require("dynamicPhrase_Filter")
phraseExt_Filter = require("phraseExt_Filter")
phraseComment_Filter = require("phraseComment_Filter")
pinyin_translator = require("pinyin_translator")
pinyin_Filter = require("pinyin_Filter")
latexHelp_translator = require("latexHelp_translator")
latex_translator = require("latex_translator")

👆以上lua脚本中,注意观察最后两行内容。

💣注意:
以上所述default.custom.yamllatex.custom.yamllatex.schema.yamllatex.dict.yamlrime.lua 五个文档,应该位于 用户文件夹 下,如下👇:
20240113153723

latex_translator.lua

latex_translator.lua 是一个lua脚本,脚本实现了rime引擎的lua_translator翻译器接口;latex_translator.lua脚本实现了用户输入编码向latex词组翻译的功能。latex_translator.lua脚本内容如下👇:

--lua语言中的注释用“--” 
--声明全局变量local colorName={"apricot","aquamarine","bittersweet","black","blue","bluegreen","blueviolet","brickred","brown","burntorange","cadetblue","carnationpink","cerulean","cornflowerblue","cyan","dandelion","darkorchid","emerald","forestgreen","fuchsia","goldenrod","gray","green","greenyellow","junglegreen","lavender","limegreen","magenta","mahogany","maroon","melon","midnightblue","mulberry","navyblue","olivegreen","orange","orangered","orchid","peach","periwinkle","pinegreen","plum","processblue","purple","rawsienna","red","redorange","redviolet","rhodamine","royalblue","royalpurple","rubinered","salmon","seagreen","sepia","skyblue","springgreen","tan","tealblue","thistle","turquoise","violet","violetred","white","wildstrawberry","yellow","yellowgreen","yelloworange"}local  xlNamesArry={{"alph","alpha","Alpha"},{"beta","beta","Beta"},{"delt","delta","Delta","varDelta"},{"epsi","varepsilon ","epsilon ","Epsilon"},{"gamm","gamma","varGamma","Gamma","digamma"},{"kapp","kappa","varkappa","Kappa"},{"iota","iota","Iota"},{"lamb","lambda","Lambda","varLambda"},{"omeg","omega","Omega","varOmega"},{"omic","omicron","Omicron"},{"upsi","upsilon","Upsilon","varUpsilon"},{"sigm","sigma","Sigma","varSigma","varsigma"},{"thet","theta","vartheta","Theta","varTheta"},{"zeta","zeta","Zeta"},{"chi","chi","Chi"},{"eta","eta","Eta"},{"phi","varphi","phi","Phi","varPhi"},{"psi","psi","Psi","varPsi"},{"rho","rho","varrho","Rho"},{"tau","tau","Tau"},{"mu","mu","Mu"},{"nu","nu","Nu"},{"pi","pi","Pi","varPi","varpi"},{"xi","xi","Xi","varXi"}}function translator(input, seg)--声名局部变量local debugFlg=falselocal returnFlg=falselocal matchFlg=falselocal patterns=""local pattern=""local subpattern=""local str=""local subStr_0=""local subStr_1=""local keyW=""local keyW_1=""local keyW_2=""local keyW_3=""local keyW_u=""local keyW_sub=""local varW=""local varW_1=""local varW_2=""local varW_3=""local pos=0--在候选词中使用 '\r' 或者 '\013' 可以输出换行效果--在候选词中使用 '\t' 或者 '\009' 可以输出水平制表符--如果候选词中出现 '\n' 或者 '\010' 输入法程序会卡死退出if input == "test" and debugFlg then--使用键值的方式,通过单引号表示这是一个字符,而不是 '\0' 转义yield(Candidate("latex", seg.start, seg._end,"第一行"..'\013'.."第二行"..'\013'.."第三行", " "))--使用字符的方式,以下两种均可yield(Candidate("latex", seg.start, seg._end,"第一行"..'\r'.."第二行"..'\r'.."第三行", " "))yield(Candidate("latex", seg.start, seg._end,"第一行\r第二行\r第三行", " "))matchFlg=truereturnFlg=trueelseif input == "help" then--help 作为特殊输入,不做latters翻译returnFlg=trueendif returnFlg thenreturn 0end--初始化标志位returnFlg=falsematchFlg = false--匹配颜色名称patterns={"clr[a-z]+"}for idx,pattern in ipairs(patterns) doif string.match(input,pattern)~=nil thenstr=string.match(input,"("..pattern..")")keyW=string.sub(str,1,3)varW=string.sub(str,4,string.len(str))if debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: ".. pattern..", "..str, " "))endmatchFlg=falsefor cidx,cname in ipairs(colorName) doif varW==cname then--命名完全相符的if matchFlg==false thenmatchFlg=trueendyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, cname, 1), " "))endendfor cidx,cname in ipairs(colorName) doif varW==string.sub(cname,1,string.len(varW)) then--命名在起始位置的if matchFlg==false thenmatchFlg=trueendyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, cname, 1), " "))endendfor cidx,cname in ipairs(colorName) doif string.find(cname,varW,2)~=nil then--命名在中间位置的if matchFlg==false thenmatchFlg=trueendyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, cname, 1), " "))endendif matchFlg thenreturnFlg=truebreakendendendif returnFlg thenreturn 0end--匹配带颜色的字符片段patterns={"tc[a-z]+","box[a-z]+"} for idx,pattern in ipairs(patterns) doif string.match(input,pattern)~=nil thenstr=string.match(input,"("..pattern..")")keyW=string.sub(str,1,2)if keyW=="tc" thenvarW=string.sub(str,3,string.len(str))elsekeyW=string.sub(str,1,3)varW=string.sub(str,4,string.len(str))endif debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: ".. pattern..", "..str, " "))endmatchFlg=falsefor cidx,cname in ipairs(colorName) doif varW==cname then--命名完全相符的if matchFlg==false thenmatchFlg=trueendif keyW=="tc" thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\textcolor{"..cname.."}{}", 1), " "))elseif keyW=="box" thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\fcolorbox{"..cname.."}{white}{}", 1), " "))endendendfor cidx,cname in ipairs(colorName) doif varW==string.sub(cname,1,string.len(varW)) then--命名在起始位置的if matchFlg==false thenmatchFlg=trueendif keyW=="tc" thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\textcolor{"..cname.."}{}", 1), " "))elseif keyW=="box" thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\fcolorbox{"..cname.."}{white}{}", 1), " "))endendendfor cidx,cname in ipairs(colorName) doif string.find(cname,varW,2)~=nil then--命名在中间位置的if matchFlg==false thenmatchFlg=trueendif keyW=="tc" thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\textcolor{"..cname.."}{}", 1), " "))elseif keyW=="box" thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\fcolorbox{"..cname.."}{white}{}", 1), " "))endendendif matchFlg thenreturnFlg=truebreakendendendif returnFlg thenreturn 0end--4字符关键字匹配 之 反三角函数匹配patterns={"asin","acos","acos","atan","acot"}for pidx,pattern in ipairs(patterns) doif(string.match(input,pattern)~=nil) thenif debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: 反三角函数匹配", " "))endif pattern=="acot" thenkeyW = "{\\rm arccot}"elseif pattern=="arccot" thenkeyW = "{\\rm arccot}"elsekeyW = "\\"..string.sub(pattern,1,1).."rc"..string.sub(pattern,2)endlocal thisPattern=""--匹配希腊字母参数for xlidx,xlNames in ipairs(xlNamesArry) dolocal nameKey=xlNames[1]--生成xl字符名称local names={}for k,v in ipairs(xlNames) doif k>1 thentable.insert(names,v)endendif(string.match(input,pattern..".+_")~=nil) then--匹配希腊字母带下标thisPattern=pattern..nameKey.."_"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) dofor i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{n}}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{0}}",1), " "))end--标记过程状态matchFlg=trueendelseif(string.match(input,pattern..".+^")~=nil) then--匹配希腊字母本身带上标thisPattern=pattern..nameKey.."^"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."^{n}}",1), " "))end--标记过程状态matchFlg=trueendelse--匹配希腊字母本身thisPattern=pattern..nameKeyif(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}{\\"..name.."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}{\\"..name.."}",1), " "))end--标记过程状态matchFlg=trueendendif matchFlg thenbreakendendif matchFlg thenbreakend--匹配正常字母参数thisPattern=pattern.."[a-zA-Z][_^]?"if(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(pattern)+1,string.len(pattern)+1)varW_1=string.sub(str,string.len(str))if varW_1=='_' then--匹配正常字母参数,带下标for i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{n}}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{0}}",1), " "))--标记过程状态matchFlg=trueelseif varW_1=='^' then--匹配正常字母参数,带上标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{n}}",1), " "))--标记过程状态matchFlg=trueelse--匹配正常字母参数,无上下标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}{"..varW.."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}{"..varW.."}",1), " "))--标记过程状态matchFlg=trueendendif matchFlg thenbreakend--匹配无参数thisPattern=patternif(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."()",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}()",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}()",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakendendendif returnFlg thenreturn 0end--3字符关键字匹配 之 反双曲函数匹配patterns={"ash","ach","ath"}for pidx,pattern in ipairs(patterns) doif(string.match(input,pattern)~=nil) thenif debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: 反双曲函数匹配", " "))endkeyW = "{\\rm "..string.sub(pattern,1,1)..'r'..string.sub(pattern,2).."}"local thisPattern=""--匹配希腊字母参数for xlidx,xlNames in ipairs(xlNamesArry) dolocal nameKey=xlNames[1]--生成xl字符名称local names={}for k,v in ipairs(xlNames) doif k>1 thentable.insert(names,v)endendif(string.match(input,pattern..".+_")~=nil) then--匹配希腊字母带下标thisPattern=pattern..nameKey.."_"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) dofor i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{n}}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{0}}",1), " "))end--标记过程状态matchFlg=trueendelseif(string.match(input,pattern..".+^")~=nil) then--匹配希腊字母本身带上标thisPattern=pattern..nameKey.."^"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."^{n}}",1), " "))end--标记过程状态matchFlg=trueendelse--匹配希腊字母本身thisPattern=pattern..nameKeyif(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}{\\"..name.."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}{\\"..name.."}",1), " "))end--标记过程状态matchFlg=trueendendif matchFlg thenbreakendendif matchFlg thenbreakend--匹配正常字母参数thisPattern=pattern.."[a-zA-Z][_^]?"if(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(pattern)+1,string.len(pattern)+1)varW_1=string.sub(str,string.len(str))if varW_1=='_' then--匹配正常字母参数,带下标for i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{n}}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{0}}",1), " "))--标记过程状态matchFlg=trueelseif varW_1=='^' then--匹配正常字母参数,带上标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{n}}",1), " "))--标记过程状态matchFlg=trueelse--匹配正常字母参数,不带上下标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}{"..varW.."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}{"..varW.."}",1), " "))--标记过程状态matchFlg=trueendendif matchFlg thenbreakend--匹配无参数thisPattern=patternif(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."()",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}()",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}()",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakendendendif returnFlg thenreturn 0end--5字符关键字匹配 之 双曲函数匹配patterns={"sech","csch","sh","ch","th","cth"}for pidx,pattern in ipairs(patterns) doif(string.match(input,pattern)~=nil) thenif debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: 双曲三角函数匹配", " "))endif pattern=="sech" thenkeyW = "{\\rm sech}"elseif pattern=="csch" thenkeyW = "{\\rm csch}"elseif pattern=="sinh" thenkeyW = "\\sh"elseif pattern=="cosh" thenkeyW = "\\ch"elseif pattern=="tanh" thenkeyW = "\\th"elseif pattern=="coth" thenkeyW = "\\cth"elsekeyW = "\\"..patternendlocal thisPattern=""--匹配希腊字母参数for xlidx,xlNames in ipairs(xlNamesArry) dolocal nameKey=xlNames[1]--生成xl字符名称local names={}for k,v in ipairs(xlNames) doif k>1 thentable.insert(names,v)endendif(string.match(input,pattern..".+_")~=nil) then--匹配希腊字母带下标thisPattern=pattern..nameKey.."_"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) dofor i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{n}}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{0}}",1), " "))end--标记过程状态matchFlg=trueendelseif(string.match(input,pattern..".+^")~=nil) then--匹配希腊字母本身带上标thisPattern=pattern..nameKey.."^"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."^{n}}",1), " "))end--标记过程状态matchFlg=trueendelse--匹配希腊字母本身thisPattern=pattern..nameKeyif(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}{\\"..name.."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}{\\"..name.."}",1), " "))end--标记过程状态matchFlg=trueendendif matchFlg thenbreakendendif matchFlg thenbreakend--匹配正常字母参数thisPattern=pattern.."[a-zA-Z][_^]?"if(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(pattern)+1,string.len(pattern)+1)varW_1=string.sub(str,string.len(str))if varW_1=='_' then--匹配正常字母参数,带下标for i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{n}}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{0}}",1), " "))--标记过程状态matchFlg=trueelseif varW_1=='^' then--匹配正常字母参数,带上标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{n}}",1), " "))--标记过程状态matchFlg=trueelse--匹配正常字母参数,不带上下标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}{"..varW.."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}{"..varW.."}",1), " "))--标记过程状态matchFlg=trueendendif matchFlg thenbreakend--匹配无参数thisPattern=patternif(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."()",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}()",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}()",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakendendendif returnFlg thenreturn 0end--4+字符关键字匹配 之 微商匹配patterns={"d[a-zA-Z]+d[a-zA-Z]+_?"}for pidx,pattern in ipairs(patterns) doif(string.match(input,pattern)~=nil) thenif debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: 微商匹配", " "))endlocal thisPattern=""--匹配希腊字母因变量for bidx,yNames in ipairs(xlNamesArry) dolocal yNameKey=yNames[1]if(string.match(input,"d"..yNameKey.."d[a-zA-Z]+_?")~=nil) then--生成xl字符名称local yNameNames={}for k,v in ipairs(yNames) doif k>1 thentable.insert(yNameNames,v)endend--匹配希腊字母自变量for xidx,xNames in ipairs(xlNamesArry) dolocal xNameKey=xNames[1]--生成xl字符名称local xNameNames={}for k,v in ipairs(xNames) doif k>1 thentable.insert(xNameNames,v)endend--带下标场景thisPattern="d"..yNameKey.."d"..xNameKey.."_"if(string.match(input,thisPattern)~=nil) then--dpsidphi_类的输入for fk,fn in ipairs(yNameNames) dofor xk,xn in ipairs(xNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d\\"..fn.."}{d\\"..xn.."}\\right|_{\\"..xn.."=0}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d^{"..tostring(i).."}\\"..fn.."}{d\\"..xn.."^{"..tostring(i).."}}\\right|_{\\"..xn.."=0}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d^{n}\\"..fn.."}{d\\"..xn.."^{n}}\\right|_{\\"..xn.."=0}",1), " "))endend--标记过程状态matchFlg=trueendif matchFlg thenbreakend--不带下标场景thisPattern="d"..yNameKey.."d"..xNameKeyif(string.match(input,thisPattern)~=nil) then--dpsidphi_类的输入for fk,fn in ipairs(yNameNames) dofor xk,xn in ipairs(xNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\frac{d\\"..fn.."}{d\\"..xn.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\frac{d^{"..tostring(i).."}\\"..fn.."}{d\\"..xn.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\frac{d^{n}\\"..fn.."}{d\\"..xn.."^{n}}",1), " "))endend--标记过程状态matchFlg=trueendif matchFlg thenbreakendendif matchFlg thenbreakend--匹配单字母自变量--带下标场景thisPattern="d"..yNameKey.."d[a-zA-Z]_"if(string.match(input,thisPattern)~=nil) then--dpsidx_类的输入str=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(str)-1,string.len(str)-1)for fk,fn in ipairs(yNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d\\"..fn.."}{d"..varW.."}\\right|_{"..varW.."=0}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d^{"..tostring(i).."}\\"..fn.."}{d"..varW.."^{"..tostring(i).."}}\\right|_{"..varW.."=0}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d^{n}\\"..fn.."}{d"..varW.."^{n}}\\right|_{"..varW.."=0}",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakend--不带下标场景thisPattern="d"..yNameKey.."d[a-zA-Z]"if(string.match(input,thisPattern)~=nil) then--dpsidx_类的输入str=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(str))for fk,fn in ipairs(yNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\cfrac{d\\"..fn.."}{d"..varW.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\cfrac{d^{"..tostring(i).."}\\"..fn.."}{d"..varW.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\cfrac{d^{n}\\"..fn.."}{d"..varW.."^{n}}",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakendendendif matchFlg thenreturnFlg=truebreakend--匹配单字母因变量,匹配希腊字母自变量for xidx,xNames in ipairs(xlNamesArry) dolocal xNameKey=xNames[1]--生成xl字符名称local xNameNames={}for k,v in ipairs(xNames) doif k>1 thentable.insert(xNameNames,v)endend--带下标场景thisPattern="d[a-zA-Z]d"..xNameKey.."_"if(string.match(input,thisPattern)~=nil) then--dpsidx_类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,2,2)for xk,xn in ipairs(xNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d"..varW_1.."}{d\\"..xn.."}\\right|_{\\"..xn.."=0}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d^{"..tostring(i).."}"..varW_1.."}{d\\"..xn.."^{"..tostring(i).."}}\\right|_{\\"..xn.."=0}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d^{n}"..varW_1.."}{d\\"..xn.."^{n}}\\right|_{\\"..xn.."=0}",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakend--不带下标场景thisPattern="d[a-zA-Z]d"..xNameKeyif(string.match(input,thisPattern)~=nil) then--dpsidx_类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,2,2)for xk,xn in ipairs(xNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\cfrac{d"..varW_1.."}{d\\"..xn.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\cfrac{d^{"..tostring(i).."}"..varW_1.."}{d\\"..xn.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\cfrac{d^{n}"..varW_1.."}{d\\"..xn.."^{n}}",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakendendif matchFlg thenreturnFlg=truebreakend--匹配单字母因变量,匹配单字母自变量,带下标场景thisPattern="d[a-zA-Z]d[a-zA-Z]_"if(string.match(input,thisPattern)~=nil) then--dydx_类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,2,2)varW_2=string.sub(str,4,4)yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d"..varW_1.."}{d"..varW_2.."}\\right|_{"..varW_2.."=0}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d^{"..tostring(i).."}"..varW_1.."}{d"..varW_2.."^{"..tostring(i).."}}\\right|_{"..varW_2.."=0}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\left.\\cfrac{d^{n}"..varW_1.."}{d"..varW_2.."^{n}}\\right|_{"..varW_2.."=0}",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakend--匹配单字母因变量,匹配单字母自变量,不带下标场景thisPattern="d[a-zA-Z]d[a-zA-Z]"if(string.match(input,thisPattern)~=nil) then--dydx类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,2,2)varW_2=string.sub(str,4,4)yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\cfrac{d"..varW_1.."}{d"..varW_2.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\cfrac{d^{"..tostring(i).."}"..varW_1.."}{d"..varW_2.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\cfrac{d^{n}"..varW_1.."}{d"..varW_2.."^{n}}",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakendendendif returnFlg thenreturn 0end--4字符关键字,latex专用组合patterns={"[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]"}for pos=1,string.len(input) domatchFlg=falsefor idx,pattern in ipairs(patterns) doif string.match(input,pattern,pos)~=nil thenstr=string.match(input,"("..pattern..")",pos)if pos==1 thensubStr_0=""elsesubStr_0=string.sub(input,1,pos-1)endsubStr_1=string.sub(input,pos,string.len(input))if debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: latex专用组合,4字符", " "))endif str=="alig" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{aligned}\r  \\end{aligned}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{equation}\\begin{aligned}\r    \\end{aligned}\\end{equation}", 1), " "))matchFlg=trueelseif str=="appr" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\approx ", 1), " "))matchFlg=trueelseif str=="arra" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{array}{rl} ab & c \\\\ b & cd \\end{array}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{array}{cc} ab & c \\\\ b & cd \\end{array}", 1), " "))matchFlg=trueelseif str=="beca" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\because ", 1), " "))matchFlg=trueelseif str=="canc" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\cancel{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\xcancel{}", 1), " "))matchFlg=trueelseif str=="case" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{cases}\r ?&=? \\\\ \r\\end{cases}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "x=\\begin{cases}\r ?=? &\\text{if} ? \\\\ \r\\end{cases}", 1), " "))matchFlg=trueelseif str=="disp" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\displaystyle", 1), " "))matchFlg=trueelseif str=="exis" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\exist ", 1), " "))matchFlg=trueelseif str=="fora" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\forall ", 1), " "))matchFlg=trueelseif str=="frac" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\frac{}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\cfrac{}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\dfrac{}{}", 1), " "))matchFlg=trueelseif str=="grou" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\overgroup{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\undergroup{}", 1), " "))matchFlg=trueelseif str=="idxx" thenfor i=1,10 doyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "式("..tostring(i)..")", 1), " "))endmatchFlg=trueelseif str=="infi" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\infin", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "-\\infin", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "+\\infin", 1), " "))matchFlg=trueelseif str=="line" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\overline{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\underline{}", 1), " "))matchFlg=trueelseif str=="matr" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{matrix}\r a & b \\\\\r c & d \r\\end{matrix}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{bmatrix}\r a & b \\\\\r c & d \r\\end{bmatrix}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{pmatrix}\r a & b \\\\\r c & d \r\\end{pmatrix}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{vmatrix}\r a & b \\\\\r c & d \r\\end{vmatrix}", 1), " "))matchFlg=trueelseif str=="nexi" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\nexists ", 1), " "))matchFlg=trueelseif str=="prod" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\prod_{}^{n}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\displaystyle\\prod_{}^{n}{}", 1), " "))matchFlg=trueelseif str=="suba" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{subarray}{c} ab \\\\ c \\end{subarray}", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\begin{subarray}{l} ab \\\\ c \\end{subarray}", 1), " "))matchFlg=trueelseif str=="subs" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\substack{ab\\\\c}", 1), " "))matchFlg=trueelseif str=="sout" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\sout{}", 1), " "))matchFlg=trueelseif str=="tria" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\triangleq ", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\vartriangle ", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\vartriangleleft ", 1), " "))yield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\vartriangleright ", 1), " "))matchFlg=trueelseif str=="ther" thenyield(Candidate("latex", seg.start, seg._end, subStr_0..string.gsub (subStr_1, pattern, "\\therefore ", 1), " "))matchFlg=trueendendif matchFlg thenbreakendendif matchFlg thenreturnFlg=truebreakendendif returnFlg thenreturn 0end--3+字符关键字匹配 之 log匹配patterns={"log[a-zA-Z]*_?"}for pidx,pattern in ipairs(patterns) doif(string.match(input,pattern)~=nil) thenif debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: log匹配", " "))endlocal thisPattern=""--匹配希腊字母底for bidx,bNames in ipairs(xlNamesArry) dolocal bNameKey=bNames[1]if(string.match(input,"log"..bNameKey.."[a-zA-Z]*_?")~=nil) then--生成xl字符名称local bNameNames={}for k,v in ipairs(bNames) doif k>1 thentable.insert(bNameNames,v)endend--匹配希腊字母自变量for xidx,xNames in ipairs(xlNamesArry) dolocal xNameKey=xNames[1]--生成xl字符名称local xNameNames={}for k,v in ipairs(xNames) doif k>1 thentable.insert(xNameNames,v)endend--带下标场景thisPattern="log"..bNameKey..xNameKey.."_"if(string.match(input,thisPattern)~=nil) then--logpsiphi_类的输入for bk,bn in ipairs(bNameNames) dofor xk,xn in ipairs(xNameNames) dofor i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}\\"..xn.."_{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}\\"..xn.."_{n}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}\\"..xn.."_{0}",1), " "))endend--标记过程状态matchFlg=trueendif matchFlg thenbreakend--带上标场景thisPattern="log"..bNameKey..xNameKey.."^"if(string.match(input,thisPattern)~=nil) then--logpsiphi^类的输入for bk,bn in ipairs(bNameNames) dofor xk,xn in ipairs(xNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}\\"..xn.." ",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}\\"..xn.."^{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}\\"..xn.."^{n}",1), " "))endend--标记过程状态matchFlg=trueendif matchFlg thenbreakend--不带上下标场景thisPattern="log"..bNameKey..xNameKeyif(string.match(input,thisPattern)~=nil) then--logpsiphi类的输入for bk,bn in ipairs(bNameNames) dofor xk,xn in ipairs(xNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}\\"..xn.." ",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}^{"..tostring(i).."}\\"..xn.." ",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}^{n}\\"..xn.." ",1), " "))endend--标记过程状态matchFlg=trueendif matchFlg thenbreakendendif matchFlg thenbreakend--匹配单字母自变量,带下标场景thisPattern="log"..bNameKey.."[a-zA-Z]_"if(string.match(input,thisPattern)~=nil) then--logpsia_类的输入str=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(str)-1,string.len(str)-1)for bk,bn in ipairs(bNameNames) dofor i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}"..varW.."_{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}"..varW.."_{n}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}"..varW.."_{0}",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakend--匹配单字母自变量,带上标场景thisPattern="log"..bNameKey.."[a-zA-Z]^"if(string.match(input,thisPattern)~=nil) then--logpsia^类的输入str=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(str)-1,string.len(str)-1)for bk,bn in ipairs(bNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}"..varW.." ",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}"..varW.."^{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}"..varW.."^{n}",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakend--匹配单字母自变量,不带上下标场景thisPattern="log"..bNameKey.."[a-zA-Z]"if(string.match(input,thisPattern)~=nil) then--logpsia类的输入str=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(str),string.len(str))for bk,bn in ipairs(bNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}"..varW.." ",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}^{"..tostring(i).."}"..varW.." ",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}^{n}"..varW.." ",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakend--匹配单字母自变量,不带参数场景thisPattern="log"..bNameKeyif(string.match(input,thisPattern)~=nil) then--logpsi类的输入for bk,bn in ipairs(bNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}()",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}^{"..tostring(i).."}()",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{\\"..bn.."}^{n}()",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakendendendif matchFlg thenreturnFlg=truebreakend--匹配单字母底,匹配希腊字母自变量for xidx,xNames in ipairs(xlNamesArry) dolocal xNameKey=xNames[1]--生成xl字符名称local xNameNames={}for k,v in ipairs(xNames) doif k>1 thentable.insert(xNameNames,v)endend--带下标场景thisPattern="log[a-zA-Z]"..xNameKey.."_"if(string.match(input,thisPattern)~=nil) then--logapsi_类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,4,4)for xk,xn in ipairs(xNameNames) dofor i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}\\"..xn.."_{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}\\"..xn.."_{n}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}\\"..xn.."_{0}",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakend--带上标场景thisPattern="log[a-zA-Z]"..xNameKey.."^"if(string.match(input,thisPattern)~=nil) then--logapsi^类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,4,4)for xk,xn in ipairs(xNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}\\"..xn.." ",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}\\"..xn.."^{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}\\"..xn.."^{n}",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakend--不带上下标场景thisPattern="log[a-zA-Z]"..xNameKeyif(string.match(input,thisPattern)~=nil) then--logapsi类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,4,4)for xk,xn in ipairs(xNameNames) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}\\"..xn.." ",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}^{"..tostring(i).."}\\"..xn.." ",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}^{n}\\"..xn.." ",1), " "))end--标记过程状态matchFlg=trueendif matchFlg thenbreakendendif matchFlg thenreturnFlg=truebreakend--匹配单字底,匹配单字母自变量,带下标场景thisPattern="log[a-zA-Z][a-zA-Z]_"if(string.match(input,thisPattern)~=nil) then--logab_类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,4,4)varW_2=string.sub(str,5,5)for i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}"..varW_2.."_{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}"..varW_2.."_{n}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}"..varW_2.."_{0}",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakend--匹配单字底,匹配单字母自变量,带上标场景thisPattern="log[a-zA-Z][a-zA-Z]^"if(string.match(input,thisPattern)~=nil) then--logab_类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,4,4)varW_2=string.sub(str,5,5)yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}"..varW_2.." ",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}"..varW_2.."^{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}"..varW_2.."^{n}",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakend--匹配单字底,匹配单字母自变量,不带上下标场景thisPattern="log[a-zA-Z][a-zA-Z]"if(string.match(input,thisPattern)~=nil) then--logab_类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,4,4)varW_2=string.sub(str,5,5)yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}"..varW_2.." ",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}^{"..tostring(i).."}"..varW_2.." ",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}^{n}"..varW_2.." ",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakend--匹配单字母自变量,不带参数场景thisPattern="log[a-zA-Z]"if(string.match(input,thisPattern)~=nil) then--loga类的输入str=string.match(input,"("..thisPattern..")")varW_1=string.sub(str,4,4)yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}()",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}^{"..tostring(i).."}()",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{"..varW_1.."}^{n}()",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakend--匹配无底无参数场景thisPattern="log"if(string.match(input,thisPattern)~=nil) then--log类的输入yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{?}()",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{?}^{"..tostring(i).."}()",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\log_{?}^{n}()",1), " "))--标记过程状态matchFlg=trueendreturnFlg = matchFlgif returnFlg thenbreakendendendif returnFlg thenreturn 0end--3+字符关键字patterns={"lim[a-zA-Z]+"}for idx,pattern in ipairs(patterns) doif string.match(input,pattern)~=nil thenstr=string.match(input,"("..pattern..")")keyW=string.sub(str,1,3)varW=string.sub(str,4,4)if debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: ".. pattern..", "..str, " "))endif keyW=="lim" thenlocal thisPattern=""--匹配希腊字母参数for xlidx,xlNames in ipairs(xlNamesArry) dolocal nameKey=xlNames[1]--生成xl字符名称local names={}for k,v in ipairs(xlNames) doif k>1 thentable.insert(names,v)endendif(string.match(input,pattern..".+_")~=nil) then--匹配希腊字母带下标thisPattern=keyW..nameKey.."_"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."\\to0}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."_{"..tostring(i).."}".."\\to0}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."_{n}\\to0}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."\\to\\infin}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."_{"..tostring(i).."}".."\\to\\infin}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."_{n}\\to\\infin}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."\\to-\\infin}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."_{"..tostring(i).."}".."\\to-\\infin}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."_{n}\\to-\\infin}{}", 1), " "))end--标记过程状态matchFlg=trueendelseif(string.match(input,pattern..".+^")~=nil) then--匹配希腊字母本身带上标thisPattern=keyW..nameKey.."^"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."\\to0}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."^{"..tostring(i).."}".."\\to0}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."^{n}\\to0}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."\\to\\infin}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."^{"..tostring(i).."}".."\\to\\infin}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."^{n}\\to\\infin}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."\\to-\\infin}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."^{"..tostring(i).."}".."\\to-\\infin}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."^{n}\\to-\\infin}{}", 1), " "))end--标记过程状态matchFlg=trueendelse--匹配希腊字母本身thisPattern=keyW..nameKeyif(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."\\to0}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."\\to\\infin}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{\\"..name.."\\to-\\infin}{}", 1), " "))end--标记过程状态matchFlg=trueendendif matchFlg thenbreakendendif matchFlg thenbreakend--匹配正常字母参数thisPattern=keyW.."[a-zA-Z][_^]?"if(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(keyW)+1,string.len(keyW)+1)varW_1=string.sub(str,string.len(str))if varW_1=='_' then--匹配正常字母参数,带下标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."\\to0}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."_{"..tostring(i).."}".."\\to0}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."_{n}\\to0}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."\\to\\infin}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."_{"..tostring(i).."}".."\\to\\infin}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."_{n}\\to\\infin}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."\\to-\\infin}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."_{"..tostring(i).."}".."\\to-\\infin}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."_{n}\\to-\\infin}{}", 1), " "))--标记过程状态matchFlg=trueelseif varW_1=='^' then--匹配正常字母参数,带上标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."\\to0}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."^{"..tostring(i).."}".."\\to0}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."^{n}\\to0}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."\\to\\infin}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."^{"..tostring(i).."}".."\\to\\infin}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."^{n}\\to\\infin}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."\\to-\\infin}{}", 1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."^{"..tostring(i).."}".."\\to-\\infin}{}", 1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."^{n}\\to-\\infin}{}", 1), " "))--标记过程状态matchFlg=trueelse--匹配正常字母参数,不带上下标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."\\to0}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."\\to\\infin}{}", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, "\\displaystyle\\"..keyW.."_{"..varW.."\\to-\\infin}{}", 1), " "))--标记过程状态matchFlg=trueendendif matchFlg thenbreakendendreturnFlg=matchFlgif returnFlg thenbreakendendendif returnFlg thenreturn 0end--3+字符关键字,匹配点patterns={"dot[-\\_]?"}for idx,pattern in ipairs(patterns) doif string.match(input,pattern)~=nil thenstr=string.match(input,"("..pattern..")")if string.len(str)==4 thenvarW=string.sub(str,4,4)elsevarW=""endif debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: ".. pattern..", "..str, " "))endmatchFlg=falseif varW=='-' thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\cdots ", 1), " "))matchFlg=trueelseif varW=='_' thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\ldots ", 1), " "))matchFlg=trueelseif varW=='|' thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\vdots ", 1), " "))matchFlg=trueelseif varW=='\\' thenyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\ddots ", 1), " "))matchFlg=trueelseyield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\sdot ", 1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, pattern, "\\dots ", 1), " "))matchFlg=trueendif matchFlg thenreturnFlg=truebreakendendendif returnFlg thenreturn 0end--3+字符关键字匹配 之 三角函数匹配patterns={"sin","cos","tan","cot","sec","csc"}for pidx,pattern in ipairs(patterns) doif(string.match(input,pattern)~=nil) thenif debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: 三角函数匹配", " "))endkeyW="\\"..patternlocal thisPattern=""--匹配希腊字母参数for xlidx,xlNames in ipairs(xlNamesArry) dolocal nameKey=xlNames[1]--生成xl字符名称local names={}for k,v in ipairs(xlNames) doif k>1 thentable.insert(names,v)endendif(string.match(input,pattern..".+_")~=nil) then--匹配希腊字母带下标thisPattern=pattern..nameKey.."_"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) dofor i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{n}}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{0}}",1), " "))end--标记过程状态matchFlg=trueendelseif(string.match(input,pattern..".+^")~=nil) then--匹配希腊字母本身带上标thisPattern=pattern..nameKey.."^"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."^{n}}",1), " "))end--标记过程状态matchFlg=trueendelse--匹配希腊字母本身thisPattern=pattern..nameKeyif(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}{\\"..name.."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}{\\"..name.."}",1), " "))end--标记过程状态matchFlg=trueendendif matchFlg thenbreakendendif matchFlg thenbreakend--匹配正常字母参数thisPattern=pattern.."[a-zA-Z][_^]?"if(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(pattern)+1,string.len(pattern)+1)varW_1=string.sub(str,string.len(str))if varW_1=='_' then--匹配正常字母参数,带下标for i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{n}}",1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{0}}",1), " "))--标记过程状态matchFlg=trueelseif varW_1=='^' then--匹配正常字母参数,带上标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{"..tostring(i).."}}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{n}}",1), " "))--标记过程状态matchFlg=trueelse--匹配正常字母参数,不带上下标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}{"..varW.."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}{"..varW.."}",1), " "))--标记过程状态matchFlg=trueendendif matchFlg thenbreakend--匹配无参数thisPattern=patternif(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."()",1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{"..tostring(i).."}()",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."^{n}()",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakendendendif returnFlg thenreturn 0end--3+字符关键字匹配 之 abs操作符匹配patterns={"abs"}for pidx,pattern in ipairs(patterns) doif(string.match(input,pattern)~=nil) thenif debugFlg thenyield(Candidate("latex", seg.start, seg._end,"latexLetters: abs 操作符匹配", " "))endkeyW="\\left|"keyWEnd="\\right|"local thisPattern=""--匹配希腊字母参数for xlidx,xlNames in ipairs(xlNamesArry) dolocal nameKey=xlNames[1]--生成xl字符名称local names={}for k,v in ipairs(xlNames) doif k>1 thentable.insert(names,v)endendif(string.match(input,pattern..".+_")~=nil) then--匹配希腊字母带下标thisPattern=pattern..nameKey.."_"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) dofor i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{"..tostring(i).."}}"..keyWEnd,1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{n}}"..keyWEnd,1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."_{0}}"..keyWEnd,1), " "))end--标记过程状态matchFlg=trueendelseif(string.match(input,pattern..".+^")~=nil) then--匹配希腊字母本身带上标thisPattern=pattern..nameKey.."^"if(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}"..keyWEnd,1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}"..keyWEnd.."^{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}"..keyWEnd.."^{n}",1), " "))end--标记过程状态matchFlg=trueendelse--匹配希腊字母本身thisPattern=pattern..nameKeyif(string.match(input,thisPattern)~=nil) then--生成候选词for k,name in ipairs(names) doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}"..keyWEnd,1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}"..keyWEnd.."^{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{\\"..name.."}"..keyWEnd.."^{n}",1), " "))end--标记过程状态matchFlg=trueendendif matchFlg thenbreakendendif matchFlg thenbreakend--匹配正常字母参数thisPattern=pattern.."[a-zA-Z][_^]?"if(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")varW=string.sub(str,string.len(pattern)+1,string.len(pattern)+1)varW_1=string.sub(str,string.len(str))if varW_1=='_' then--匹配正常字母参数,带下标for i=1,8 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{"..tostring(i).."}}"..keyWEnd,1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{n}}"..keyWEnd,1), " "))yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."_{0}}"..keyWEnd,1), " "))--标记过程状态matchFlg=trueelseif varW_1=='^' then--匹配正常字母参数,带上标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}"..keyWEnd,1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{"..tostring(i).."}}"..keyWEnd,1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."^{n}}"..keyWEnd,1), " "))--标记过程状态matchFlg=trueelse--匹配正常字母参数,不带上下标yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}"..keyWEnd,1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}"..keyWEnd.."^{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{"..varW.."}"..keyWEnd.."^{n}",1), " "))--标记过程状态matchFlg=trueendendif matchFlg thenbreakend--匹配无参数thisPattern=patternif(string.match(input,thisPattern)~=nil) thenstr=string.match(input,"("..thisPattern..")")yield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{?}"..keyWEnd,1), " "))for i=2,9 doyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{?}"..keyWEnd.."^{"..tostring(i).."}",1), " "))endyield(Candidate("latex", seg.start, seg._end, string.gsub (input, thisPattern, keyW.."{?}"..keyWEnd.."^{n}",1), " "))--标记过程状态matchFlg=trueendif matchFlg thenreturnFlg=truebreakendendendif returnFlg thenreturn 0end...由于博文限制字符数量,无法粘贴完整代码,请下载脚本文档或者在gitHug中查阅

以上 latex_translator.lua 脚本比较长,但这也仅实现了小部分的latex功能,后续慢慢再完善。

latexHelp_translator.lua

latexHelp_translator.lua是一个lua脚本定义的lua_translator翻译器。latexHelp_translator.lua所实现的功能比较简单,即在用户输入 help 字符时,将与latex输入方案有关的提示信息以候选词组的方式展示出来。latexHelp_translator.lua脚本的内容如下👇:

--lua语言中的注释用“--” 
function translator(input, seg)if (input == "help") thenyield(Candidate("help", seg.start, seg._end, "三角函数-->sin|cos|tan|cot|sec|csc", " "))yield(Candidate("help", seg.start, seg._end, "反三角函数-->asin|acos|atan|acot", " "))yield(Candidate("help", seg.start, seg._end, "双曲函数-->sh|ch|th|cth|sech|csch", " "))yield(Candidate("help", seg.start, seg._end, "反双曲函数-->ash|ach|ath", " "))yield(Candidate("help", seg.start, seg._end, "微分-->d?d?_", " "))yield(Candidate("help", seg.start, seg._end, "积分-->intc|int", " "))yield(Candidate("help", seg.start, seg._end, "对数-->log|lg|ln", " "))yield(Candidate("help", seg.start, seg._end, "极限-->lim", " "))yield(Candidate("help", seg.start, seg._end, "开方-->sqr", " "))yield(Candidate("help", seg.start, seg._end, "上标-->?^", " "))yield(Candidate("help", seg.start, seg._end, "下标-->?_", " "))yield(Candidate("help", seg.start, seg._end, "线-->bar", " "))yield(Candidate("help", seg.start, seg._end, "点-->dot", " "))yield(Candidate("help", seg.start, seg._end, "临域-->mr", " "))yield(Candidate("help", seg.start, seg._end, "R-->?n?", " "))yield(Candidate("help", seg.start, seg._end, "颜色名称-->clr", " "))yield(Candidate("help", seg.start, seg._end, "颜色文本-->tc|box", " "))yield(Candidate("help", seg.start, seg._end, "特殊字符4-->alig|appr|arra|beca|canc|case|disp|doll|exis|fora|frac|grou|idxx|infi|line|matr|nexi|prod|suba|subs|sout|tria|ther", " "))yield(Candidate("help", seg.start, seg._end, "特殊字符3-->big|gox|cap|cup|idx|max|min|neq|not|set|sim|sum|tau", " "))yield(Candidate("help", seg.start, seg._end, "特殊字符2-->in|mp|ni|to|gt|ge|lt|le|", " "))yield(Candidate("help", seg.start, seg._end, "希腊字符-->alph|beta|其它名称", " "))--yield(Candidate("help", seg.start, seg._end, "-->", " "))end
endreturn translator

💣注意:
👆上述latex_translator.lualatexHelp_translator.lua两个脚本文档,均应该位于 用户文件夹下的lua文件夹内,如下👇:
20240113155248

配置文档

👆以上所述配置文档,你可以在 rime中州韵小狼毫须鼠管输入法 LaTex输入方案配置包.zip 下载取用。

如果你可以访问gitHub,你也可以在 dyyRime 中找到完全版本的配置包。

效果欣赏

当你完成了以上的所有设置时,你需要重新部署你的rime,然后通过F4/F8调出方案选单,你应该可以看到LaTex输入方案,如下👇:
20240113160253
选择LaTex输入方案后,就可以愉快的开始体验LaTex输入公式了。

小结

本文分享了一中在rime中州韵小狼毫须鼠管输入法中配置LaTex输入方案的方法,从而实现了LaTex公式的快速录入,当前LaTex仅支持部分基础的公式录入,更多功能正在完善中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/239591.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#编程-使用事件

使用事件 事件是一个动作或发生的事情,例如:鼠标点击、按键、鼠标移动或系统产生的通知。应用程序可以在事件发生的时候做出响应。通知的一个示例是中断。事件是对象发生的消息以表示事件的发生。事件是进程内通信的有效方法。它们对对象时有用的,因为它们标识了单个状态改…

C#--核心

CSharp核心知识点学习 学习内容有&#xff1a; 绪论&#xff1a;面向对象的概念 Lesson1&#xff1a;类和对象 练习&#xff1a; Lesson2&#xff1a;封装--成员变量和访问修饰符 练习: Lesson3:封装--成员方法 Lesson4&#xff1a;封装--构造函数和析构函数 知识点四 垃圾回收…

OpenCV——图像按位运算

目录 一、算法概述1、逻辑运算2、函数解析3、用途 二、代码实现三、结果展示 OpenCV——图像按位运算由CSDN点云侠原创&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 一、算法概述 1、逻辑运算 OpenCV4 针对两个图像之…

查看服务器的yum 源

1、cd /etc/yum.repos.d 2、编辑 CentOS-Stream-Sources.repo 3、 查看里面的yum源地址 4、更新yum源&#xff0c;执行下面指令 yum clean all # 清除系统所有的yum缓存 yum makeacache # 生成新的yum缓存 yum repolist

SQL-用户管理与用户权限

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

Qt/QML编程之路:Grid、GridLayout、GridView、Repeater(33)

GRID网格用处非常大,不仅在excel中,在GUI中,也是非常重要的一种控件。 Grid 网格是一种以网格形式定位其子项的类型。网格创建一个足够大的单元格网格,以容纳其所有子项,并将这些项从左到右、从上到下放置在单元格中。每个项目都位于其单元格的左上角,位置为(0,0)。…

Ubuntu共享文件到win

Ubuntu共享文件到win 1、安装samba sudo apt-get install samba samba-common2、创建一个共享文件夹&#xff0c;并设置777权限 mkdir /home/qyh/share sudo chmod 777 /home/qyh/share我的用户名&#xff1a;qyh。 3、添加用户及密码 sudo smbpasswd -a qyh4、修改配置文…

Android WiFi Service启动-Android13

Android WiFi Service启动 - Android13 1、SystemServer中入口2、WifiService启动2.1 关键类概要2.2 启动时序图 Android WiFi基础概览 AOSP > 文档 > 心主题 > WiFi概览 1、SystemServer中入口 编译生成对应的jar包&#xff1a;"/apex/com.android.wifi/javalib…

【C++】“Hello World!“

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 ​ 2024.1.14 纪念一下自己编写的第一个C程序 #include<iostream>int main() {/*我的第一个C程序*/std::cout << "Hello world!:>" <<std::endl;ret…

蓝桥杯备赛 | 洛谷做题打卡day3

蓝桥杯备赛 | 洛谷做题打卡day3 sort函数真的很厉害&#xff01; 文章目录 蓝桥杯备赛 | 洛谷做题打卡day3sort函数真的很厉害&#xff01;【深基9.例1】选举学生会题目描述输入格式输出格式样例 #1样例输入 #1 样例输出 #1 我的一些话 【深基9.例1】选举学生会 题目描述 学校…

腾讯云主机价格表和优惠活动汇总(2024年更新)

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

Javaweb之SpringBootWeb案例新增部门的详细解析

2.3 删除部门 查询部门的功能我们搞定了&#xff0c;下面我们开始完成删除部门的功能开发。 2.3.1 需求 点击部门列表后面操作栏的 "删除" 按钮&#xff0c;就可以删除该部门信息。 此时&#xff0c;前端只需要给服务端传递一个ID参数就可以了。 我们从接口文档中也…

致远OA getAjaxDataServlet XXE漏洞复现(QVD-2023-30027)

0x01 产品简介 致远互联-OA 是数字化构建企业数字化协同运营中台,面向企业各种业务场景提供一站式大数据分析解决方案的协同办公软件。 0x02 漏洞概述 致远互联-OA getAjaxDataServlet 接口处存在XML实体注入漏洞,未经身份认证的攻击者可以利用此漏洞读取系统内部敏感文件…

EasyExcel简单实例

EasyExcel简单实例 准备工作场景一&#xff1a;读取 Student 表需求1&#xff1a;简单读取需求2&#xff1a;读取到异常信息时不中断需求3&#xff1a;读取所有的sheet工作表需求4&#xff1a;读取指定的sheet工作表需求5&#xff1a;从指定的行开始读取 场景二&#xff1a;写入…

vue3中ref和reactive联系与区别以及如何选择

vue3中ref和reactive区别与联系 区别 1、ref既可定义基本数据类型&#xff0c;也可以定义引用数据类型&#xff0c;reactive只能定义应用数据类型 2、ref在js中取响应值需要使用 .value&#xff0c;而reactive则直接取用既可 3、ref定义的对象通过.value重新分配新对象时依旧…

Web3去中心化存储:重新定义云服务

随着Web3技术的崭露头角&#xff0c;去中心化存储正在成为数字时代云服务的全新范式。传统的云服务依赖于中心化的数据存储架构&#xff0c;而Web3的去中心化存储则为用户带来了更安全、更隐私、更可靠的数据管理方式&#xff0c;重新定义了云服务的未来。 1.摒弃中心化的弊端 …

如何在 openKylin 上安装 ONLYOFFICE 文档?

文章作者&#xff1a;ajun ONLYOFFICE 文档是一款全面的在线办公工具&#xff0c;提供了文本文档、电子表格和演示文稿的查看和编辑功能。它高度兼容微软 Office 格式&#xff0c;包括 .docx、.xlsx 和 .pptx 等文件格式&#xff0c;并支持实时协作编辑&#xff0c;使团队成员能…

边缘计算AI智能分析网关V4算力分析及应用场景

一、硬件介绍 智能分析网关V4是TSINGSEE青犀视频推出的一款高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;硬件采用BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz。硬件内置近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、…

SQL:一行中存在任一指标就显示出来

当想要统计的两个指标不在一张表中时&#xff0c;需要做关联。但很多情况下&#xff0c;也没有办法保证其中一张表的维度是全的&#xff0c;用left join或right join可能会导致数据丢失。所以借助full join处理。 1&#xff09;如&#xff0c;将下面的数据处理成表格中的效果&…

基于springboot生鲜交易系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…