在文档中的每个句点后添加换行符

在文档中的每个句点后添加换行符

有没有办法让每个句点(点)都像 \newline 命令一样?

现在我能想到的唯一方法就是编写 shell 脚本来帮我做这件事。

答案1

我假设您\newline不仅希望在.(“句号”、“句号”)字符后插入,还希望在问号和感叹号后插入——但不要在十进制数字(例如 )3.14159或字符串(例如 )内插入tex.stackexchange.com。换句话说,\newline只有当 后跟空格或 出现在输入行的最末尾时才应插入.?!。如果您希望覆盖此设置,例如,将其保留C. Ph. E. Bach在一行中,则必须将名称输入为C.\ Ph.\ E.\ Bach或(如果您希望防止换行符)为C.~Ph.~E.~Bach

如果我的工作假设是正确的,并且您可以自由使用 LuaLaTeX,那么以下解决方案可能会让您感兴趣。请注意,我没有声称其稳健性。事实上,该解决方案可能根本不稳健。

在此处输入图片描述

\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function dot2newline ( s )
   s = s:gsub ( "([%.%?!])%s+" , "%1\\newline " ) 
   s = s:gsub ( "([%.%?!])$"   , "%1\\newline " )
   return s
end
\end{luacode}
\AtBeginDocument{\directlua{ luatexbase.add_to_callback (
   "process_input_buffer" , dot2newline , "dot2newline" )}}
 
\begin{document}
\setlength\parindent{0pt} % just for this example

Hello. Hello? Hello! $0.0<1.0$.  3.14159. \texttt{tex.stackexchange.com}. 
... ...
Hi!
Where?
C.\ Ph.\ E.\ Bach
\end{document}

答案2

如 Mico 的回答所示,输入文件中的文本替换应该可以很好地满足此用例,但需要 LuaTeX。您也可以仅使用 TeX 宏来实现类似的效果,但是,如果宏依赖于标点符号的类别代码为 12(如 TikZ),则这将失败。

\documentclass{article}

\makeatletter

\protected\def\mynewline#1{%
    \def\@@mynewline{\@mynewline{#1}}%
    \futurelet\next\@@mynewline
}
\def\@mynewline#1{%
    \char`#1
    \TextOrMath{%
        \ifx\next\@sptoken
            \expandafter\newline
        \fi
    }{}%
}

\makeatother

{\catcode`\.=\active\gdef.{\mynewline{.}}
 \catcode`\?=\active\gdef?{\mynewline{?}}
 \catcode`\!=\active\gdef!{\mynewline{!}}}
\AtBeginDocument{
    \catcode`\.=\active
    \catcode`\?=\active
    \catcode`\!=\active
}

\begin{document}
\setlength\parindent{0pt} % just for this example

Hello. Hello? Hello! $0.0<1.0$.  3.14159. \texttt{tex.stackexchange.com}. 
... ...
Hi!
Where?
C.\ Ph.\ E.\ Bach
\end{document}

相关内容