有没有简单的方法可以做到这一点?理想情况下,应该在缺少括号的行中添加一个右括号。有 SED/AWK 答案吗?
有些行会这样写:
\url{http://google.com}
而其他人:
\url{http://google.com
我想在包含左括号但缺少右括号的行中添加右括号。
%%%%% 源文件:
%\usepackage[anythingbreaks]{breakurl}
%\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref}
%\usepackage[hyphens]{url}
\usepackage{url}
\urlstyle{rm}
\makeatletter
\g@addto@macro{\UrlBreaks}{\UrlOrds}
\makeatother
\title{}
\author{}
\date{2019-08-19}
%\sloppy
\begin{document}
答案1
您可以使用 LPEG 在 Lua 中编写一个解析器,以匹配匹配的括号。请注意,这是基于行的,也就是说,如果您的构造中的括号跨越多行,这将失败。
test.lua
local lpeg = require("lpeg")
local P, S, V = lpeg.P, lpeg.S, lpeg.V
local function err(match, pos, cap)
print(match, pos, cap)
end
local rule = P{"text",
any = 1 - S"{}",
balanced = "{" * (V"any" + V"balanced")^0 * "}",
text = V"any" * (V"balanced" + V"any")^0 * P(-1)
}
local path = arg[1] or error("Usage: " .. arg[0] .. " <filename>")
local file = io.open(path, "r")
local n = 1
for line in file:lines() do
local match = rule:match(line)
if not match then
error("Closing } missing on line " .. n)
end
n = n + 1
end
test.tex
\documentclass{article}
\usepackage{url}
\begin{document}
\url{http://google.com
\end{document}
运行这个texlua
得到
$ texlua test.lua test.tex
test.lua:21: Closing } missing on line 4
还可以自动在有问题的行上添加结束括号。为此,我们解析该行,如果解析失败,则在末尾添加括号,直到解析成功。
test2.lua
local lpeg = require("lpeg")
local P, S, V = lpeg.P, lpeg.S, lpeg.V
local function err(match, pos, cap)
print(match, pos, cap)
end
local rule = P{"text",
any = 1 - S"{}",
balanced = "{" * (V"any" + V"balanced")^0 * "}",
text = V"any" * (V"balanced" + V"any")^0 * P(-1)
}
local path = arg[1] or error("Usage: " .. arg[0] .. " <filename>")
local file = io.open(path, "r")
for line in file:lines() do
local match
while not match do
match = rule:match(line)
if not match then
line = line .. "}"
end
end
print(line)
end
这种方法有一些明显的局限性,即机器无法知道具体在哪里必须放置右括号。
test2.tex
\documentclass{article}
\usepackage{url}
\begin{document}
Use \url{http://google.com to reach Google search
\end{document}
根据上面的例子运行,结果在语法上正确,但在语义上错误:
$ texlua test2.lua test2.tex
\documentclass{article}
\usepackage{url}
\begin{document}
Use \url{http://google.com to reach Google search}
\end{document}
这个问题无法通过自动化方法解决。只有用户才能知道右括号应该放在哪里才能保证语义正确。
答案2
我委托了几个程序来修复这个问题。两个是 Java 程序。一个是 Javascript 程序。另一个是 Python 脚本。以下是链接: https://www12.zippyshare.com/v/9f8cIYpY/file.html
Javascript 和 Python 程序对我来说很管用。Java 文件的运气取决于您要修复的文件的性质。我的文件有时在同一行有两个 URL,这导致 Java 程序卡住。
这可能是@henrimenke 提出的 lua 脚本对我来说不起作用的原因。