我想编写一个带有触发器的宏#[a-z]
,该宏根据触发器中的字符写出相应的希腊字母。也就是说,触发器#a
应该产生\alpha
,触发器#b
应该在编辑器中给出\beta
,等等。
问题在于触发器在编写后立即被删除,因此脚本不知道是否使用了a
、b
或其他字母。当然,我可以为每个希腊字母编写特定的宏,但这会轻易耗尽 40 个宏的限制(如果还使用大写字母)。我知道我可以将宏放在前十个宏下并使用快捷键Shift+F1或类似的东西,但这不太直观。
有人知道访问触发字母的方法吗?
编辑:我现在使用一种变通方法。如果将触发器和字母的顺序颠倒过来,问题就会消失。#a
触发器现在通用为 ,而不是 。#
书写a#
将删除#
并保留 ,a
然后可以在脚本中使用它将其转换为\alpha
。但是,这有点限制了我的打字风格,所以我仍然想知道问题的答案。
答案1
有一个全局变量triggerMatches
。它是匹配你定义为触发器的正则表达式的结果。
triggerMatches
是一个数组。它的第零个组件是与完整正则表达式的匹配。以下元素是与组的匹配(如果已定义组)。
例子:
触发器:#([az])
键入:#a
triggerMatches[0] == '#a'
triggerMatches[1] == 'a'
答案2
我想我可能会将经过测试的脚本包含在内,以便其他人可能会觉得它有用。我决定使用,triggerMatches[0]
以便脚本也适用于未分组的触发器:
%SCRIPT
var strTrigger = 'abg';
var greek = new Array();
greek[0] = 'alpha';
greek[1] = 'beta';
greek[2] = 'gamma';
idx = triggerMatches[0];
var pos = strTrigger.search(idx.slice(idx.length-1,idx.length));
if (pos != -1) {
editor.write('\\ensuremath{\\'+greek[pos]+'}')};
当然,数组和字符串可以扩展以包含其他希腊字母。
答案3
这是我根据 Wolf 的回答得出的完整希腊宏。
触发器:`([Az])
%SCRIPT
var strTrigger = 'abgdezhqiklmnyprstfxwoABGDQLYWO';
var greek = new Array();
greek[0] = 'alpha';greek[1] = 'beta';greek[2] = 'gamma';
greek[3] = 'delta';greek[4] = 'varepsilon';greek[5] = 'zeta';
greek[6] = 'eta';greek[7] = 'theta';greek[8] = 'iota';
greek[9] = 'varkappa';greek[10] = 'lambda';greek[11] = 'mu';
greek[12] = 'nu';greek[13] = 'xi';greek[14] = 'pi';
greek[15] = 'rho';greek[16] = 'sigma';greek[17] = 'tau';
greek[18] = 'phi';greek[19] = 'chi';greek[20] = 'psi';
greek[21] = 'omega';greek[22] = 'Alpha';greek[23] = 'Beta';
greek[24] = 'Gamma';greek[25] = 'Delta';greek[26] = 'Theta';
greek[27] = 'Lambda';greek[28] = 'Xi';greek[29] = 'Psi';
greek[30] = 'Omega';
idx = triggerMatches[0];
var pos = strTrigger.search(idx.slice(idx.length-1,idx.length));
if (pos != -1) {
editor.write('\\'+greek[pos])};