我希望鼓励 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}