
이 작업을 수행하는 쉬운 방법이 있나요? 이상적으로는 대괄호가 없는 줄에 닫는 대괄호를 추가하는 것이 좋습니다. 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 프로그램입니다. 하나는 자바스크립트 프로그램이다. 다른 하나는 Python 스크립트입니다. 다음은 링크입니다: https://www12.zippyshare.com/v/9f8cIYpY/file.html
Javascript와 Python 프로그램이 저에게 효과적이었습니다. Java 파일의 행운은 수정하려는 파일의 성격에 따라 달라집니다. 내 파일에는 때때로 같은 줄에 두 개의 URL이 있었고 이로 인해 Java 프로그램이 중단되었습니다.
이것이 @henrimenke가 제안한 lua 스크립트가 나에게 작동하지 않는 이유일 수 있습니다.