2014-10-30 4 views
0

У меня есть следующий фрагмент кода 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() 
+0

Требуется ли, чтобы скрипт находился на Python? Если это так, вы можете поделиться тем, что вы делали до сих пор, чтобы можно было взглянуть на нее и исправить ее! –

+1

Если единственный интерес заключается в том, что вывод недействителен независимо от воздействия '\ NEW {..}', вы можете установить его как no-op: '\ AtBeginDocument {\ renewcommand {\ NEW} { }} '. – Werner

ответ

0

Попробуйте использовать регулярные выражения:

import re 
myRe = re.compile(r'\\NEW{\w+}') 
for match in myRe.findall(myString): 
    newstring = match.replace('\NEW{','') 
    newstring = newstring.replace('}','') 
    myString.replace(match,newstring) 

Это, однако, не избавиться от проблемы с многострочным. Чтобы решить эту проблему, пройдите через строку напрямую, проверив для этого открытие и закрытие скобок:

while s.find('\\NEW{')>-1: 
    position = s.find('\\NEW{') 
    print(position, s[position:position+4]) 
    s = s[0:position]+s[position+5:] 
    trailexist = True 
    openbrackets = 0 

    while trailexist and position<len(s): 
     position +=1 
     print(len(s), position,s[position]) 
     if s[position] == '}' and openbrackets == 0: 
      s = s[:position]+s[position+1:] 
      trailexist = False 
      print("Removed!", position) 
     elif s[position] == '{': 
      openbrackets += 1 
      print('Openbrackets:',openbrackets) 
     elif s[position] == '}' and openbrackets>0: 
      openbrackets -= 1 
Смежные вопросы