验证LaTeX文件,java

时间:2013-03-12 06:14:54

标签: java string split organization

所以我有这个文本文件

\begin{document}
    {\Large \begin{center} Homework Problems \end{center}}\begin{itemize}\item\end{itemize}
    \begin{enumerate}
                    \begin{proof}
                            \begin{align}

                            \end{align}
                    \end{proof}

                    \begin{proof}

                            \begin{align}

                            \end{align}

                    \end{proof}
    \end{enumerate}
\end{document}

我想浏览每一行,找到所有“\ begin”片段,然后在“{ _ }”中取出字符串并将其存储在堆栈中。当找到相应的“\ end”时,我在Stack上调用pop()命令并将其删除。我虽然有几个问题......

  1. 我正在处理各种各样的疯狂案件,确保一切都得到适应,并且当我想让它适用于各种类型的文件时,它会变得过于特殊。
  2. 我不知道如何检查“\ begin”和“\ end”而不是“begin”和“end”,这个重要的原因是因为如果文件包含“开始”或“结束”它可能不是一个命令,因此,而不是我正在寻找的。

    所有“if”语句都不会因“\”存在而起作用,我尝试添加方括号,但它没有修复任何内容。

    到目前为止,这是我的代码,它变得非常混乱,任何人都可以帮助组织并帮助纠正我上面提到的问题吗?

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.util.Scanner;
    import java.util.Stack;
    import java.util.StringTokenizer;
    
    public class LaTeXParser{
    
    public static void main(String args[]) throws FileNotFoundException{
    
        Scanner scan = new Scanner(System.in);
    
        Stack s = new Stack();
    
        int lineCount = 0;
    
        String line;
        String nextData = null;
        String title = null;
    
                String fname;
    
                System.out.print("Enter the name of the file (no extension): ");
                fname = scan.next();
    
                fname = fname + ".txt";
    
                FileInputStream fstream = new FileInputStream(fname);
    
                Scanner fscan = new Scanner(fstream);
    
                System.out.println();
    
                while(fscan.hasNextLine()){
    
                    lineCount++;
                    line = fscan.nextLine();
                    StringTokenizer tok = new StringTokenizer(line);
    
                    while(tok.hasMoreElements()){
    
                        nextData = tok.nextToken();
                        System.out.println("The line: "+nextData);
    
                        if(nextData.contains("\\begin") && !nextData.contains("\\end")){
    
                            if(nextData.charAt(1) == 'b'){
    
                                title = nextData.substring(nextData.indexOf("{") + 1, nextData.indexOf("}"));
    
                                s.push(title);
    
                            }
    
                            else{
    
                                //title = nextData.substring();
    
                            }
                        }//end of BEGIN if
    
                        if(nextData.contains("\\end") && !nextData.contains("\\begin")){
    
                            if(s.peek().equals(nextData.substring(nextData.indexOf("{") + 1, nextData.indexOf("}")))){
    
                                s.pop();
    
                            }
                        }//end of END if
    
                        if(nextData.contains("\\begin") && nextData.contains("\\end")){
    
                            String[] theLine = nextData.split("[{}]");
    
                            for(int i = 0 ; i < theLine.length ; i++){
    
                                if(theLine[i].equals("\\end") && theLine[i+1].equals(s.peek())){
    
                                    s.pop();
    
                                }
    
                                if(theLine[i].equals("\\begin")){
    
                                    title = theLine[i+1];
    
                                    s.push(title);
    
                                }
    
    
                            }
    
                        }//end of BEGIN AND END if
    
                    }
                }//end of whiles
    
                fscan.close();
    
        while(!s.isEmpty()){
    
            System.out.println("the top "+s.pop());
    
        }
    }
    }
    

    编辑:在用于检查一行以查看“\ begin”和“\ end”之后是否包含“\ begin”的if语句中,如何返回检查是否存在line还包含它的“\ end”?所以我在谈论这个案子......

    \begin{itemize}\item\end{itemize}
    

    看到我可以进入“\ begin”并添加正确的字符串,但它只是移动并传递“\ end {itemize}”。无论如何要解决这个问题?

    实际上,即使按下“itemize”字符串,它也应检查并正常执行,但它不起作用!我相信它与“\ end”有关,任何人都可以确认吗?它跳过了那一步,显然是因为它不符合条件,但它适用于其他行。只是不是这个特例!

1 个答案:

答案 0 :(得分:1)

您可能需要转义反斜杠,因此请写\\而不是\。如果它们是正则表达式(regexprs),则需要将它们两次转义:\\\\;我认为不需要括号。