有时当我写一些文字时,我会错误地在点/逗号前加空格,或者忘记在点/逗号后加空格。我希望 LaTeX 删除点前的所有空格并在标点后添加空格。
例如:
“这是一些文本。这是一些文本”
应该
“这是一些文字。这是一些文字”
和
“这是一些文字。这是一些文字”
应该
“这是一些文字。这是一些文字”
我来自欧洲。
答案1
好的,我们来试试懒散的诡计。
原料
对于我们的下一个技巧,我们需要:
- Sublime Text 2安装了编辑器(不用担心是多平台的),
- 针对此编辑器的包名为LaTeX 工具 依次安装
- 包控制(可以简化其他软件包的安装的插件或软件包)。
准备
按照每种情况的说明完成所有安装后,您就可以将其用作Sublime Text 2
LaTeX 编辑器。为了方便起见,我建议使用名为莫诺凯·布莱特(但您可以尝试并使用您最喜欢的)。
使用 Sublime Text 2打开单个.tex
文件或加载整个项目的目录(根据您的喜好)。打开文件后,可以轻松搜索和替换所需内容。让我们测试一下:
- 按
Ctrl + F
屏幕底部将出现一个包含以下选项的栏(从左到右):
- 常用表达 (
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
。)
我无法想象自己实际上会这样做,但想想就很有趣。