
Gibt es eine einfache Möglichkeit, dies zu tun? Idealerweise würde der Zeile, in der die Klammer fehlt, eine schließende Klammer hinzugefügt. Gibt es eine SED/AWK-Antwort?
Einige Zeilen lauten:
\url{http://google.com}
Während andere:
\url{http://google.com
Ich möchte den Zeilen, die eine öffnende Klammer enthalten, aber keine schließende Klammer haben, eine schließende Klammer hinzufügen.
%%%%% Die Quelldatei:
%\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}
Antwort1
Sie können in Lua mit LPEG eine Analyse schreiben, die mit ausgeglichenen Klammern übereinstimmt. Beachten Sie, dass dies zeilenbasiert ist. Wenn Sie also Konstrukte haben, bei denen die Klammern mehrere Zeilen umfassen, schlägt dies fehl.
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}
Das Ausführen mit texlua
gibt
$ texlua test.lua test.tex
test.lua:21: Closing } missing on line 4
Es ist auch möglich, automatisch eine schließende Klammer an die fehlerhafte Zeile anzufügen. Zu diesem Zweck analysieren wir die Zeile und fügen, wenn dies fehlschlägt, am Ende Klammern hinzu, bis es klappt.
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
Es gibt einige offensichtliche Einschränkungen bei diesem Ansatz, nämlich dass die Maschine nicht wissen kannwo genaudie schließende Klammer muss gesetzt werden.
test2.tex
\documentclass{article}
\usepackage{url}
\begin{document}
Use \url{http://google.com to reach Google search
\end{document}
Das Ausführen gegen das obige Beispiel ergibt eine syntaktisch korrekte, aber semantisch falsche Ausgabe:
$ texlua test2.lua test2.tex
\documentclass{article}
\usepackage{url}
\begin{document}
Use \url{http://google.com to reach Google search}
\end{document}
Dies lässt sich nicht automatisiert beheben. Nur der Benutzer kann wissen, wo die schließende Klammer platziert werden muss, damit sie semantisch korrekt ist.
Antwort2
Ich habe mehrere Programme in Auftrag gegeben, um das Problem zu beheben. Zwei davon sind Java-Programme. Eines ist ein Javascript-Programm. Das andere ist ein Python-Skript. Hier ist ein Link: https://www12.zippyshare.com/v/9f8cIYpY/file.html
Bei mir funktionierten die Javascript- und Python-Programme. Ihr Erfolg mit den Java-Dateien hängt von der Art der Datei ab, die Sie reparieren möchten. Meine Datei hatte manchmal zwei URLs in derselben Zeile, was dazu führte, dass die Java-Programme blockierten.
Dies könnte der Grund gewesen sein, warum das von @henrimenke vorgeschlagene Lua-Skript bei mir nicht funktioniert hat.