有没有办法让每个句点(点)都像 \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}