如何通过 LuaLaTeX 回调插入 LaTeX 命令?

如何通过 LuaLaTeX 回调插入 LaTeX 命令?

我希望鼓励 LaTeX 在句末的下列标点符号之一后换行或换页:“。”;“!”和“?”。

我想设置 -50 的惩罚以稍微鼓励在句末换行,并设置 -200 的惩罚以鼓励在句末多一些分页,因为我认为这会让读者更加不安。

我想创建一个命令来根据您处于水平模式还是垂直模式来应用适当的惩罚,然后使用 lualatex 的功能并使用其callback在每个相关标点符号后插入此命令。

我的问题是如何插入此命令。我可以插入惩罚,但只能插入一个值,并且不区分水平模式下的惩罚(-50)和垂直模式下的惩罚(-200)。

您知道如何通过 LuaLaTeX 回调插入 LaTeX 命令吗?

(我试过了node.insert_after(head, head, tex.sprint("\test")),但是没用)

以下是 MWE:

\documentclass{article}

\usepackage{luacode, lipsum}

\newcommand{\test}{%
    \ifvmode%
        \penalty -200
    \else%
        \penalty -50
    \fi%
    \space%
}

\begin{luacode}
local GLYPH = node.id("glyph") -- print('GLYPH value: ', GLYPH)
local GLUE = node.id("glue") -- print('GLUE value: ', GLUE)

local end_sentence_spacing = function (head)
    while head do
        if (head.id == GLYPH) then
            if head.prev then
                if unicode.utf8.match(unicode.utf8.char(head.char), "[.!?]") then
                    if (head.next.id == GLUE) then
                        local p = node.new("penalty")
                        p.penalty = -50
                        node.insert_after(head, head, p)
                    end
                end
            end
        end
        head = head.next
    end
    return true
end

function end_sentence_spacing_enable ()
    luatexbase.add_to_callback("pre_shaping_filter", end_sentence_spacing, "endofsentencespacing")
end
\end{luacode}

\long\def\EndSentenceSpacingEnable{\directlua{end_sentence_spacing_enable()}}

\begin{document}

\lipsum[1-5]
\clearpage\EndSentenceSpacingEnable{}
\lipsum[1-5]

\end{document}

相关内容