如何自动删除标点符号前的空格并添加标点符号后的内容?

如何自动删除标点符号前的空格并添加标点符号后的内容?

有时当我写一些文字时,我会错误地在点/逗号前加空格,或者忘记在点/逗号后加空格。我希望 LaTeX 删除点前的所有空格并在标点后添加空格。

例如:

“这是一些文本。这是一些文本”

应该

“这是一些文字。这是一些文字”

“这是一些文字。这是一些文字”

应该

“这是一些文字。这是一些文字”

我来自欧洲。

答案1

好的,我们来试试懒散的诡计。

原料

对于我们的下一个技巧,我们需要:

  1. Sublime Text 2安装了编辑器(不用担心是多平台的),
  2. 针对此编辑器的包名为LaTeX 工具 依次安装
  3. 包控制(可以简化其他软件包的安装的插件或软件包)。

准备

按照每种情况的说明完成所有安装后,您就可以将其用作Sublime Text 2LaTeX 编辑器。为了方便起见,我建议使用名为莫诺凯·布莱特(但您可以尝试并使用您最喜欢的)。

使用 Sublime Text 2打开单个.tex文件或加载整个项目的目录(根据您的喜好)。打开文件后,可以轻松搜索和替换所需内容。让我们测试一下:

  1. Ctrl + F
  2. 屏幕底部将出现一个包含以下选项的栏(从左到右):

    • 常用表达 (Alt+R
    • 区分大小写 (Alt+C
    • 整个单词 ( Alt+W)
    • 反转方向
    • 在选择中
    • 精彩比赛

还有一个文件,您可以在其中输入要搜索的内容。在我们的例子中,.它表示一个带空格的点。在这里,您可以使用您喜欢的编辑器来完成我建议的操作。但是 Sublime Text 2(如果您使用 AucTeX,也许可以使用 emacs)有一个非常有趣的功能,在我看来,它值得用于此任务。

好吧,从上面的列表中,我建议启用以下选项:

  • 正则表达式(对于这个任务很有用),
  • ...整个单词(如果有,请避免通过示例进行选择\ldots),
  • 反转方向(查看直到文档末尾并返回到开头,如果您开始查找一半)并突出显示匹配项(选择 Monokai bright 而不是 Monokai 的原因)。

现在按下[Esc]激活选项。按 出现次数搜索.,并用鼠标光标仔细选择 之前的空格和点。最后的技巧是制作多项选择从选定的效果中,按下现在Ctrl+D按住的键。

如果选择得当,那么你可以同时突出问题,甚至更好,你将会在检测到的每一个事件中看到实时光标

这很重要,因为它可以让你同时编辑所有事件,并通过一次性删除多余的空格来更正所有内容(使用左右方向的箭头键将光标移动到选择的开始或结束。在这种情况下使用左箭头键并按[Del])。

虽然不是完全自动的,也不是脚本,但是运行得很好。

评论

虽然有程序和插件可以翻译我还没有使用过任何将文档从 Word 复制到 LaTeX 或从 LaTeX 复制到 Word 的工具(几乎所有工具都有许可证,必须付费)。之前,我直接从 Word 复制文本并粘贴到 Sublime Text 2 中,在那里进行格式化。有时我更喜欢在 AbiWord 中打开并使用附带的插件导出到 LaTeX。但这个插件几乎是实验性的,会生成大量不必要的代码,并且某些标签(如层次结构标签)(\part\chapter\section等)放置位置不佳。为了纠正这些不平衡,请使用刚才解释过的技巧,这些技巧可以让我相对轻松地调试代码。

我希望这个冗长而详细的解释能够对你有所帮助。

答案2

我不知道原始海报是否还在,但这对某些人来说可能会有用。

请谨慎使用。

虽然我尝试处理控制序列或数字值内的分隔符排除,但您仍然可能偶尔需要在需要时手动禁用规则集。(请参阅提供的\AutospaceOn/\AutospaceOff开关。当然,您可以创建更细粒度的规则逐条切换。)

还,文档结束时,自动空格模式不得处于开启状态,以免你收到package logreq 错误:确保\AutospaceOff在文档末尾使用。

注意:这与以下内容相冲突pgfutil:如果您曾在其中使用,tikz例如postaction,请务必事先Autospace通过禁用它\AutospaceOff,然后通过重新激活它\AutospaceOn

% !TEX TS-program = lualatex

\documentclass{article}

\usepackage{luacode}


\begin{luacode*}
    
function comma_space(s)
s = string.gsub(s, "[%s~]*,", ",")
s = string.gsub(s, ",(%a)", function(x)
if x == "\\footnote" or x == "\\footnotemark" then
return "," .. x
else
return ", " .. x
end
end)
return s
end

function period_space(s)
s = string.gsub(s, "(%.)[%s~]*(%D)", function(x, y)
if x == "\\footnote" or x == "\\footnotemark" or string.match(y, "%d") then
return x .. y
else
return x .. " " .. y
end
end)
return s
end

function colon_space(s)
s = string.gsub(s, "[%s~]*:", ":")
s = string.gsub(s, ":(%a)", function(x)
if x == "\\footnote" or x == "\\footnotemark" then
return ":" .. x
else
return ": " .. x
end
end)
return s
end

function semicolon_space(s)
s = string.gsub(s, "[%s~]*;", ";")
s = string.gsub(s, ";(%a)", function(x)
if x == "\\footnote" or x == "\\footnotemark" then
return ";" .. x
else
return "; " .. x
end
end)
return s
end

function quote_space(s)
s = string.gsub(s, "\"[%s~]+", "``")
s = string.gsub(s, "[%s~]+\"", "''")
s = string.gsub(s, "«([^%s~])", "«\\,%1")
s = string.gsub(s, "([^%s~])»", "%1\\,»")
return s
end

function autospace(line)
if string.sub(line, 1, 1) == "\\" then
local command = string.match(line, "\\(%w+)")
if string.sub(command, 1, 4) == "text" then
line = string.gsub(line, "(%s*)(%b{})", function(space, arg)
return space .. autospace(arg)
end)
end
else
line = comma_space(line)
line = period_space(line)
line = colon_space(line)
line = semicolon_space(line)
line = string.gsub(line, "[%s~]+(%p)", "%1")
line = quote_space(line)  
end
return line
end

\end{luacode*}


\newcommand{\AutospaceOn}{
    \directlua{luatexbase.add_to_callback("process_input_buffer", autospace, "autospace")}
}

\newcommand{\AutospaceOff}{
    \directlua{luatexbase.remove_from_callback("process_input_buffer", "autospace")}
}

% You may create more refined toggles, e.g. \AutoCommaspaceOn by adding specific functions such as comma_space instead of the global autospace function.    


\begin{document}
    
    
    \AutospaceOn
    
    \textit{"   This is a test,no space before the comma but space after .No space before the period but space after .And this is a test :no space before the colon but space after .And this is a test ; no space before the semicolon but should be after the semicolon .This is a test «for French quotes» .   "}
    
    
    \vspace{2.99ex} % As you can see, no undesirable space is added after the decimal point.
    
    \textbf{"   This is a test,no space before the comma but space after .No space before the period but space after .And this is a test :no space before the colon but space after .And this is a test ;\footnote{test} no space before the semicolon but should be after the semicolon .This is a test «for French quotes» .   "}
    
    \vspace{2.99ex} % As you can see, no undesirable space is added after the decimal point.
    
        This is a test,~no space added before a tilde;~no space:~no space.~No space.
    
    \vspace{2.99ex} % As you can see, no undesirable space is added after the decimal point.
    
    No space between punctuation and a footnote mark,\footnote{test} no space;\footnote{test} no space:\footnote{test} no space\footnote{test}.
    
    \vspace{2.99ex} % As you can see, no undesirable space is added after the decimal point.
    
    \AutospaceOff
    
    "   This is a test ,no space before the comma but space after .No space before the period but space after .\footnote{essai} And this is a test :\footnote{essai} no space before the colon but space after .And this is a test ;\footnote{essai} no space before the semicolon but should be after the semicolon .This is a test «for French quotes» .   " 
    
    
\end{document}


在此处输入图片描述

编辑

现在,如果您想避免footnote标记前出现不必要的自动空格,并添加对波浪号和文本格式化命令的支持,则应按以下方式修改代码。

% !TEX TS-program = lualatex

\documentclass{article}

\usepackage{luacode}


\begin{luacode*}
    
function comma_space(s)
s = string.gsub(s, "[%s~]*,", ",")
s = string.gsub(s, ",(%a)", function(x)
if x == "\\footnote" or x == "\\footnotemark" then
return "," .. x
else
return ", " .. x
end
end)
return s
end

function period_space(s)
s = string.gsub(s, "(%.)[%s~]*(%D)", function(x, y)
if x == "\\footnote" or x == "\\footnotemark" or string.match(y, "%d") then
return x .. y
else
return x .. " " .. y
end
end)
return s
end

function colon_space(s)
s = string.gsub(s, "[%s~]*:", ":")
s = string.gsub(s, ":(%a)", function(x)
if x == "\\footnote" or x == "\\footnotemark" then
return ":" .. x
else
return ": " .. x
end
end)
return s
end

function semicolon_space(s)
s = string.gsub(s, "[%s~]*;", ";")
s = string.gsub(s, ";(%a)", function(x)
if x == "\\footnote" or x == "\\footnotemark" then
return ";" .. x
else
return "; " .. x
end
end)
return s
end

function quote_space(s)
s = string.gsub(s, "\"[%s~]+", "``")
s = string.gsub(s, "[%s~]+\"", "''")
s = string.gsub(s, "«([^%s~])", "«\\,%1")
s = string.gsub(s, "([^%s~])»", "%1\\,»")
return s
end

function autospace(line)
if string.sub(line, 1, 1) == "\\" then
local command = string.match(line, "\\(%w+)")
if string.sub(command, 1, 4) == "text" then
line = string.gsub(line, "(%s*)(%b{})", function(space, arg)
return space .. autospace(arg)
end)
end
else
line = comma_space(line)
line = period_space(line)
line = colon_space(line)
line = semicolon_space(line)
line = string.gsub(line, "[%s~]+(%p)", "%1")
line = quote_space(line)  
end
return line
end

\end{luacode*}

\newcommand{\AutospaceOn}{
    \directlua{luatexbase.add_to_callback("process_input_buffer", autospace, "autospace")}
}

\newcommand{\AutospaceOff}{
    \directlua{luatexbase.remove_from_callback("process_input_buffer", "autospace")}
}

% You may create more refined toggles, e.g. \AutoCommaspaceOn by adding specific functions such as comma_space instead of the global autospace function.    


\begin{document}
    
    
    \AutospaceOn
    
\textit{"   This is a test ,no space before the comma but space after .No space before the period but space after .\footnote{test} And this is a test :\footnote{test} no space before the colon but space after .And this is a test ;\footnote{test} no space before the semicolon but should be after the semicolon .This is a test «for French quotes» .   "}

    \vspace{2.99ex} % As you can see, no undesirable space is added after the decimal point.

\textbf{"   This is a test ,no space before the comma but space after .No space before the period but space after .\footnote{test} And this is a test :\footnote{test} no space before the colon but space after .And this is a test ;\footnote{test} no space before the semicolon but should be after the semicolon .This is a test «for French quotes» .   "}
    
    \vspace{2.99ex} % As you can see, no undesirable space is added after the decimal point.
    
    \AutospaceOff
    
"   This is a test ,no space before the comma but space after .\footnote{essai}No space before the period but space after .\footnote{essai} And this is a test :\footnote{essai} no space before the colon but space after .And this is a test ;\footnote{essai} no space before the semicolon but should be after the semicolon .This is a test «for French quotes» .   " 
    
    
\end{document}

在此处输入图片描述

答案3

我们 vim 用户不能让 sublime text 用户独享所有的乐趣。

设置 vim 相当容易,这样无论何时您输入.或,,它都会自动吞噬其之前的所有空格,并在之后自动插入一个空格。

inoremap <silent> . <Esc>v^:s/\s*$//<CR>:nohls<CR>`>a.<Space>
inoremap <silent> , <Esc>v^:s/\s*$//<CR>:nohls<CR>`>a,<Space>

如果您只想将其应用于 .tex 文件,则将其放入~/.vim/ftplugin/tex/tex.vim(或~/.config/nvim/ftplugin/tex/tex.vim用于 neovim)。如果您希望将其应用于所有文档,则将其放入~/.vimrc(或~/.config/nvim/init.vim用于 neovim)。

如果您需要在小数、网址等前面添加空格或删除后面的空格,您仍然可以在之后执行此操作。

唯一的缺点是,如果您输入了句号或逗号,但实际上记得在后面添加一个空格,那么您最终会得到两个空格。您可以通过<Space>仔细检查它是否跟在后面.,在跟在后面时禁用它来防止这种情况:

function SpaceOrNoSpace()
    let c=col('.')
    if (c==1) || (c==2)
        return ' '
    endif
    let p=strpart(getline('.'),c-3,2)
    if (p=='. ') || (p==', ')
        return ''
    endif
    return ' '
endfunction

inoremap <expr> <Space> SpaceOrNoSpace() 

当然,如果您有需要修复的已写文档,则可以轻松搜索和之前的所有空格,.或之后的非空格,然后修复它们:

要删除前面的空格:

:%s/ \([.,]\)/\1/gc

在其后添加空格:

:%s/\([.,]\)\(\S\)/\1 \2/gc

c最后的 表示您必须确认每一个;如果您不想确认它们,请省略c。)

我无法想象自己实际上会这样做,但想想就很有趣。

相关内容