3

だから私はこのテキストファイルを持っています

\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」が見つかったら、スタックで pop() コマンドを呼び出して削除します。いくつか問題がありますが...

  1. 私はあらゆる種類のクレイジーなケースに対処し、すべてが収容されていることを確認し、そのように記述されたあらゆる種類のファイルで機能させたいときに、このケースに固有になりすぎていることを確認しています。
  2. 「begin」と「end」ではなく「\begin」と「\end」をチェックする方法がわかりません。これが重要な理由は、ファイルに「begins」または「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」を見つけた後、行に「\begin」と「\end」の両方が含まれているかどうかを確認するために使用されるifステートメントで、その行にも含まれているかどうかを確認するにはどうすればよいですか? 「\end」ですか?だから私はケースについて話している...

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

「\begin」に到達して適切な文字列を追加できますが、移動して「\end{itemize}」を渡すだけです。とにかくこれを修正するには?

実際には、「itemize」文字列が押された後でもチェックして正常に実行されるはずですが、機能しません! 「\end」に関係していると思いますが、誰か確認できますか? そのステップをスキップします。これは明らかに条件に適合しないためですが、他の行では機能します。この特定のケースだけではありません!

4

1 に答える 1

1

おそらくバックスラッシュをエスケープする必要があるため、\\代わりに\. また、それらが正規表現 (regexprs) である場合は、それらを 2 回エスケープする必要があります\\\\。ブラケットは必要ないと思います。

于 2013-03-12T06:17:38.070 に答える