2016-08-15 6 views
-1

Например, у меня есть много строк Tex какКак исправить несогласованные скобки в строке TeX?

|u(x,t)|^2 = \frac{1}{\sqrt{1+(4+t)^2))e^{-\frac{2(x-k_0t)^2}{1+4t^2)) 

Проблема с выше Tex является то, что кронштейн не соответствует. \frac{1}{\sqrt{1+(4+t)^2)) должны быть \frac{1}{\sqrt{1+(4+t)^2}} и {-\frac{2(x-k_0t)^2}{1+4t^2)) должны быть {-\frac{2(x-k_0t)^2}{1+4t^2}}

wrong: \frac{1}{\sqrt{1+(4+t)^2)) 
right: \frac{1}{\sqrt{1+(4+t)^2}} 

wrong: {-\frac{2(x-k_0t)^2}{1+4t^2)) 
right: {-\frac{2(x-k_0t)^2}{1+4t^2}} 

Объяснение: Первый пример не подходит, потому что за последние два ) нет ) сопоставления его, и он должен быть }, чтобы соответствовать предыдущей {

Я хочу знать, как автоматически корректировать такие несогласованные скобки? У меня установлен perl, и я намеревался сделать это с помощью регулярного выражения, но не могу понять способ.

+0

Откуда берутся эти? Являются ли они частью более крупного файла? Всегда ли они на отдельных линиях или часть большого блока текста, который может содержать разрывы строк посередине? – simbabque

+0

Как и в случае с угловым корпусом: что происходит, когда одиночные скобки/фигурные скобки являются частью формул, e. г. как литералы в документе о регулярных выражениях? – Albjenow

+0

@simbabque Привет, Simbabque. Строка в моем посте - это единственная полная форма формул математической формулы – user15964

ответ

0

Должно быть какое-то условие, которое указывает, где вместо скобок используются скобки. Я предполагаю, что он находится либо перед e^, либо в конце строки.

Это фиксирует первый один:

perl -pi~ -e 's/\)\)e\^/}}e^/' file.tex 

И это вторая:

perl -pi~ -e 's/\)\)$/}}/' file.tex 
+0

Привет, ceving. Большое спасибо за ответ. Но соответствие скобки не соответствует 'e ^' или концу строки. Извините за мою неясную запись. '' 'Неправильный, потому что нет '(' сопоставление, и оно должно быть '}', чтобы соответствовать предыдущему '{' – user15964

+0

Если вы не хотите писать полный парсер TeX, вам нужно найти некоторые эвристики – ceving

1

Я не знаю, если я правильно понять вас, но это звучит для меня, как вам нужно подсчитать скобки и убедиться, что число (or [ or { равно числу соответствующих ) or ] or }.

Одно из возможных решений с использованием хэш для каждой строки TeX и хранения значений в нем (. Не знаю, как выглядит файл я предполагаю, что все линии, как вы предоставили):

#!/usr/bin/perl 
use strict; 
use warnings; 

my $file = shift; 
my $line_num = 0; 
open FH, "<$file" or die "Error: $!\n"; 
while(<FH>) { 
    my %brackets = (
     '('  =>  0, 
     '['  =>  0, 
     '{'  =>  0 
    ); 
    $line_num++; 
    my @chars = split //, $_; 
    ### Count brackets. 
    foreach my $char (@chars) { 
     if ($char eq '(' or $char eq '[' or $char eq '{') { 
      $brackets{$char}++; 
     } elsif ($char eq ')' or $char eq ']' or $char eq '}') { 
      if ($char eq ')') { $brackets{'('}--; } 
      if ($char eq ']') { $brackets{'['}--; } 
      if ($char eq '}') { $brackets{'{'}--; } 
     } else { 
      next; 
     } 
    } 
    ### Check that all hash values are 0. 
    foreach my $bracket (keys %brackets) { 
     if ($brackets{$bracket} != 0) { 
      print "In line $line_num: '$bracket' missing $brackets{$bracket} closing brackets.\n"; 
     } 
    } 
} 

Этот код будет в в наименьшей степени скажите вам, где произошли ошибки, и дайте общее представление о характере этих ошибок. для ввода такого как )ff){gfs[[y[46rw] выход будет:

In line 1: '{' missing 1 closing brackets. 
In line 1: '[' missing 2 closing brackets. 
In line 1: '(' missing -2 closing brackets. 

Вместо печати скобки (или хранения числа скобок Возможно лучше хранить индекс в скобках.), вы можете написать простой код, чтобы исправить это, потому что в этом вы получите всю необходимую информацию.

Это не простой вопрос, если ошибки в файле не имеют шаблона. Я рекомендую искать один, прежде чем на самом деле попробуем

+0

Благодарим yonyon 100 за предоставление этого полезного скрипта. – user15964

+0

Добро пожаловать. @ User15964. Еще одна идея, которая приходит на ум (если TeX работает именно так) - перебирать строки и для каждой открытой скобки, толкать ее в стек. Когда вы сталкиваетесь с закрывающей скобой, проверьте верхнюю часть стека и посмотрите, похож ли он на закрывающий кронштейн. Если это так, вытащите его из стека. Если нет, замените закрывающий кронштейн соответствующим кронштейном (все еще тот, что находится наверху стека) и поп это. Это должно дать вам хотя бы хорошо написанный стиль кронштейна. – yonyon100