让句子的第一个单词出现在下一行的开头,而不是出现在该行的末尾

让句子的第一个单词出现在下一行的开头,而不是出现在该行的末尾

我不希望一个句子在行末仅以一个单词开始,尤其是一个非常短的单词,如“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}

相关内容