You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在非小数的.?!后添加换行?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代码修复方案

问题分析

原代码有两个核心问题:

  1. 未排除小数中的点,会错误替换数字间的小数点;
  2. 使用\\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}

修复说明

  1. 排除小数:通过[^%d]匹配标点前的非数字字符,确保小数的点不会被替换;
  2. 解决警告:用\\par代替\\newline,让标点后直接开启新段落,同时添加\raggedright允许左对齐,避免LaTeX强制撑满行宽导致的警告;
  3. 覆盖场景:补充了开头标点的处理逻辑,适配更多文本情况。

内容的提问来源于stack exchange,提问作者Julie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:47:32