在 LuaTeX 中,是否可以替换输入缓冲区中的文本,但仅限于数学模式内?

在 LuaTeX 中,是否可以替换输入缓冲区中的文本,但仅限于数学模式内?

我正在尝试创建一个 Lua 脚本,让我->用以下代码替换方程式中的所有实例\rightarrow的所有 实例。我发现这个答案这表明黑客攻击涉及 process_input_buffer 回调:

-- replacearrow.lua
callback.register('process_input_buffer', function(line)
    return line:gsub('%-%>', '\\rightarrow')
end)
% mydocument.tex
\directlua{ dofile('replacearrow.lua')}
Hello $A -> B$ World

我现在遇到的问题是,像这样从输入缓冲区批量替换文本会破坏一堆包。我设法通过仅替换美元符号之间的文本来稍微限制损害:

-- replacearrow.lua
callback.register('process_input_buffer', function(line)
    return line:gsub('%$(.-)%$', function(mathstr)
        mathstr = mathstr:gsubgsub('%-%>', '\\rightarrow')
        return '$'..mathstr..'$'
    end)
end)

有没有办法让它也适用于没有美元符号定义的数学环境,例如\[\begin{math}

也许更精确的方法是使用除 process_input_buffer 之外的其他回调,但我不知道是否存在可以执行我想要的回调。


顺便说一句,我知道语义->包,这就是一开始就被使用的东西。问题是,现在我转换为 luatex 后,该包与 发生冲突unicode-math,并且出现了一些“扩展 mathchar 错误用作 mathchar”。此时,我决定使用 Lua 进行一些预处理,最终可能比语义包正在执行的宏魔法更干净。

答案1

最后我决定按照 David Carlisle 的建议直接输入 unicode 字符来解决我的问题。这样可以避免破解 Latex 解析器,并且我的文本文件中的公式更易读。

最大的障碍是弄清楚如何在 Linux 上输入 Unicode 字符,而无需更改我使用的文本编辑器。最后,我决定编辑我的 .XCompose 文件。它是用于描述如何将键序列转换为字符的文件(例如,像'+ e=这样的内容é。现在我的 .XCompose 有一堆我设置的规则,如下所示:

<Multi_key> <a> <a> : "α" U03B1 # Lower alpha
<Multi_key> <b> <b> : "β" U03B2 # Lower beta
<Multi_key> <g> <g> : "γ" U03B3 # Lower gamma
<Multi_key> <d> <d> : "δ" U03B4 # Lower delta
<Multi_key> <e> <e> : "ε" U03B5 # Lower epsilon
# and much more... took a long time to type everything.
# and also lots of copy pasting from KCharSelect...

但它一开始并不是完美无缺的:

  • <Multi_key>是“撰写键”,默认情况下它没有映射到任何东西。我必须进入键盘设置来为其分配一些东西。我选择了AltGr

  • 默认情况下,GTK 应用程序会忽略设置 i .XCompose。我必须通过导出环境变量来更改“IM_MODULE”.profile

    export GTK_IM_MODULE="uim"
    

    我必须安装uim才能让一切正常工作。我还尝试了 xim、scim 和 ibus,但似乎都不起作用。YMMV。顺便说一句,我建议在 xterm 上进行测试,以查明问题出在 XCompose 还是其他配置上。

  • 您不能让一个序列组合成为另一个序列组合的前缀。我谨慎地选择序列组合以避免冲突。一个常见的技巧是<space>在序列的末尾添加一个,因为我的组合<space>中间都没有一个。

  • “不允许使用前缀”冲突包括系统中预定义的组合。大多数 XCompose 教程都建议添加一条include "%L"指令来从您的语言环境导入撰写设置,但我没有这样做,因为这会破坏我的一些组合。但出于某种原因,这不是问题,我仍然可以根据需要输入“é”。我猜 uim 在这里发挥了某种魔力。

  • 不同按键的键符可以在 上找到/usr/include/X11/keysymdef.h。需要注意的一点是“死键”~有自己的键符。如果您的键盘配置为使用死键(如我的),那么您的 XCompose 规则需要使用<dead_tilde>而不是<ascii_tilde>

相关内容