如何在非小数的.?!后添加换行?LaTeX代码报错求助
一、Python简便实现方法
用正则表达式可精准匹配需要换行的标点(.?!),同时排除小数中的点,几行代码就能实现复制粘贴式文本处理:
import re def add_newline_after_punctuation(text): # 正则规则:匹配 .?!,但排除前后都是数字的小数点 pattern = r'(?<!\d)([.!?])(?!\d)\s*' # 替换为「标点+换行」 return re.sub(pattern, r'\1\n', text) # 示例使用 input_text = """Hello. Hello? Hello! 0.0<1.0. 3.14159. tex.stackexchange.com. ... ... Hi! Where? C. Ph. E. Bach""" output_text = add_newline_after_punctuation(input_text) print(output_text)
运行后输出:
Hello. Hello? Hello! 0.0<1.0. 3.14159. tex.stackexchange.com. ... ... Hi! Where? C. Ph. E. Bach
二、LaTeX代码修复方案
问题分析
原代码有两个核心问题:
- 未排除小数中的点,会错误替换数字间的小数点;
- 使用
\\newline强制换行但不结束段落,导致LaTeX无法自动调整行宽,触发Underfull \hbox警告(行内容不足,撑不满指定宽度)。
修复后的代码
\documentclass{article} \usepackage{luacode} \begin{luacode} function dot2newline ( s ) -- 匹配「非数字+标点+空格」,替换为「非数字+标点+新段落」 s = s:gsub("([^%d])([%.%?!])%s+", "%1%2\\par ") -- 匹配行尾的「非数字+标点」,替换为「非数字+标点+新段落」 s = s:gsub("([^%d])([%.%?!])$", "%1%2\\par ") -- 匹配开头的「标点+空格」,替换为「标点+新段落」 s = s:gsub("^([%.%?!])%s+", "%1\\par ") return s end \end{luacode} \AtBeginDocument{\directlua{ luatexbase.add_to_callback ( "process_input_buffer" , dot2newline , "dot2newline" )}} \begin{document} \setlength\parindent{0pt} \raggedright % 允许左对齐,避免Underfull \hbox警告 Hello. Hello? Hello! $0.0<1.0$. 3.14159. \texttt{tex.stackexchange.com}. ... ... Hi! Where? C.\ Ph.\ E.\ Bach \end{document}
修复说明
- 排除小数:通过
[^%d]匹配标点前的非数字字符,确保小数的点不会被替换; - 解决警告:用
\\par代替\\newline,让标点后直接开启新段落,同时添加\raggedright允许左对齐,避免LaTeX强制撑满行宽导致的警告; - 覆盖场景:补充了开头标点的处理逻辑,适配更多文本情况。
内容的提问来源于stack exchange,提问作者Julie
相关产品推荐
相关产品推荐

