我不希望一个句子在行末仅以一个单词开始,尤其是一个非常短的单词,如“It”,“As”,“The”等。它会打断阅读流程并且看起来很丑陋。
编辑:阅读了一些评论后,我添加了一个在 MS Word 中的示例,只是为了澄清: (引自维基百科)
有没有办法让整个文档自动完成这一操作?我写了一篇 100 页的论文,如果有其他方法,我宁愿不为每个案例手动操作。
我知道这是应该避免的,但我甚至在所有的科学论文中都发现了这种情况,比如下面我随机展示的这篇论文。段落末尾显然还有空间,所以“In”可以很容易地放在下一行。(不是要贬低这篇论文,我甚至还没读过它!)
编辑:如果这个概念对你来说是新的,我不想让你对自己的写作风格感到不自信!这可能只是我个人的审美偏好。另外请注意,我首先学会了避免这种写作方式,用的是德语,而不是英语。
谢谢你!
答案1
您提到您不使用 LuaLaTeX。希望以下答案对愿意并能够使用 LuaLaTeX 的其他读者仍然有用。
解决方案设置了一个 Lua 函数,禁止在 1 个、2 个或 3 个字母的单词后立即换行,这些单词 (a) 跟在标点符号后面,并且 (b) 以大写字母开头。以下是几个示例:A、I;Am、As、At、Be、By、Do、He、In、Of、Or、Us、We;And、Are、For、Her、His、She、Now、The。Lua 函数分配给 LuaTeX 的process_input_buffer
回调;因此它在处理的早期阶段运行,前TeX 的常规处理开始启动。
如果文本出现在逐字类环境中,例如verbatim
(由 LaTeX 内核提供)、Verbatim
(来自fancyvrb
包)和lstlisting
(来自listings
包),则会暂停该函数的运行。
% !TEX TS-program = lualatex
\documentclass[12pt]{article}
%% Lua-side code
\usepackage{luacode}
\begin{luacode}
in_verbatim = false
function short_words ( s )
if string.find ( s , "\\begin{[vV]erbatim}" ) or string.find ( s, "\\begin{lstlisting}" ) then
in_verbatim = true
elseif string.find ( s , "\\end{[vV]erbatim}" ) or string.find ( s , "\\end{lstlisting}" )then
in_verbatim = false
elseif in_verbatim == false then
s = string.gsub ( s, "(%p)%s+(%u%l?%l?)%s+" , "%1 %2~" )
end
return s
end
\end{luacode}
%% TeX-side code
\AtBeginDocument{\luadirect{luatexbase.add_to_callback (
"process_input_buffer", short_words , "short_words" )}}
% just for this example
\usepackage[textwidth=0.1mm]{geometry}
\setlength\parindent{0pt}
\begin{document}
off. The next
truth? In that case
off. This fact
\begin{verbatim}
truth? In that case
\end{verbatim}
truth? In that case
\end{document}
附录:如果文档不包含任何逐字逐句的环境,则luacode
环境的内容可能会大大简化:
\begin{luacode}
function short_words ( s )
return ( string.gsub ( s, "(%p)%s+(%u%l?%l?)%s+" , "%1 %2~" ) )
end
\end{luacode}