【问题标题】:How to fix mismatched brackets in a TeX string?如何修复 TeXT 字符串中不匹配的括号?
【发布时间】:2016-12-21 12:14:39
【问题描述】:

例如,我有很多 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,我打算用正则表达式来做,但想不出办法。

【问题讨论】:

  • 那些来自哪里?它们是更大文件的一部分吗?它们总是在单独的行上,还是在中间可能包含换行符的大块文本的一部分?
  • 就像一个极端情况:当单括号/大括号是公式的一部分时会发生什么,例如。 G。作为关于正则表达式的文档中的文字?
  • @simbabque 嗨,simbabque。我帖子中的字符串是一个完整的 Tex 形式的数学公式
  • 对于我们这些不熟悉 TeX 的人来说,这种解释毫无意义。请edit 并包含文件中的几行完整行。
  • 这通常是不可能的,除非有明确的错误模式。这就是为什么编程语言会发出像 missing semicolon 这样的错误,而不是仅仅为您修复它。这些数据是从哪里来的,最初是如何犯错误的?

标签: regex perl text-processing


【解决方案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.

您可以编写简单的代码来解决此问题,而不是打印括号(或存储括号的数量。可能更好地存储括号的索引),因为此时,您将拥有所需的所有信息。

如果文件中的错误没有模式,这不是一个简单的问题。我建议在实际尝试之前先寻找一个

【讨论】:

  • 感谢 yonyon 100 提供这个有用的脚本
  • 不客气@user15964。想到的另一个想法(如果 TeX 以这种方式工作)是遍历行并为每个左括号将其推入堆栈。遇到右括号时,检查堆栈顶部,看看它是否类似于右括号。如果是,则将其从堆栈中弹出。如果不是,请将右括号替换为适当的括号(仍然是堆栈顶部的那个)并将其弹出。这至少应该给你一个写得很好的括号样式。
【解决方案2】:

必须有某种条件,它指示使用括号而不是大括号的位置。我假设它要么在e^ 前面,要么在行尾。

这修复了第一个问题:

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

这是第二个:

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

【讨论】:

  • 嗨,切文。非常感谢您的回答。但是括号的匹配不是根据e^或者行尾。抱歉我的帖子不清楚。 )是不对的,因为没有'('匹配它,应该是'}'来匹配前面的'{'
  • 如果你不想写一个完整的 TeX 解析器,你必须找到一些启发式方法。
猜你喜欢
  • 2018-03-06
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多