У меня есть следующий фрагмент кода LaTeX и вы хотите удалить все вхождения \ NEW {"text spanning multiple lines"}. «Текст, охватывающий несколько строк», должен быть сохранен, и нужно удалить только «\ NEW {» и где-нибудь в файле «}», в новых скобках следует оставить нетронутым. Необходимо сохранить вкладки, пробелы и символы новой строки. Я уже пытался написать приложение python, но не смог добиться достойного вывода. Самая сложная часть - это место, где вы удаляете скобки (и можете быть на следующей строке).Удалить макрос LaTeX, охватывающий несколько строк
Вход:
\chapter{A \NEW{very} small \NEW{chapter}}
\begin{itemize}
\item \NEW{Bla}
\item Dusse
\item Mekker
\end{itemize}
\NEW{This is new
multiline \texttt{text} with some things \TBD{TBD} in between
} The end
выход (ожидаемый):
\chapter{A very small chapter}
\begin{itemize}
\item Bla
\item Dusse
\item Mekker
\end{itemize}
This is new
multiline \texttt{text} with some things \TBD{TBD} in between
The end
Собственное решение в питона, который работает:
- Читать линия
- Заменить \ NEW {встречаемость с маркером (символ 0xff)
- Чтения с в линии
- Проверить, если с маркером, набор отмечен = True, установите marked_cnt для вложенных скобок, прочитать следующий символ
- Else проверки: с == '{', приращение marked_cnt
- Else проверка: с == '}' и промаркирован == Правда, декремент marked_cnt
- Если marked_cnt == -1, сброс отмеченные = False, marked_cnt = 0, читать дальше голец
- Распечатать «действительный» знак
#!/usr/bin/env python2.7 import sys marker=chr(255) marked=False marked_cnt=0 fin = open("file.tex", "r") fout = open("file.tex.out", "w") for line in fin: l = line.replace("\NEW{", marker) for c in l: if c == marker: marked = True marked_cnt = 0 continue elif c == '{': marked_cnt += 1 elif ((c == '}') and (marked == True)): marked_cnt -= 1 if marked_cnt == -1: marked = False marked_cnt = 0 continue fout.write(c) fin.close() fout.close()
Требуется ли, чтобы скрипт находился на Python? Если это так, вы можете поделиться тем, что вы делали до сих пор, чтобы можно было взглянуть на нее и исправить ее! –
Если единственный интерес заключается в том, что вывод недействителен независимо от воздействия '\ NEW {..}', вы можете установить его как no-op: '\ AtBeginDocument {\ renewcommand {\ NEW} { }} '. – Werner