1

だから私はLaTeXスタイルのドキュメントをたくさん持っています.1つは次のようになります...

\documentclass{article}
\usepackage{amsmath, amssymb, amsthm}
\begin{document}
    {\Large \begin{center} Homework Problems \end{center}}\begin{itemize}\item\end{itemize}
    \begin{enumerate}
            \item Prove: For all sets $A$ and $B$, $(A - B) \cup
                    (A \cap B) = A$.
                    \begin{proof}
                            \begin{align}
                                    & (A - B) \cup (A \cap B) && \\
                                    & = (A \cap B^c) \cup (A \cap B) && \text{by
                                    Alternate Definition of Set Difference} \\
                                    & = A \cap (B^c \cup B) && \text{by Distributive Law} \\
                                    & = A \cap (B \cup B^c) && \text{by Commutative Law} \\
                                    & = A \cap U && \text{by Union with the Complement Law} \\
                                    & = A && \text{by Intersection with $U$ Law}
                            \end{align}
                    \end{proof}
            \item If $n = 4k + 3$, does 8 divide $n^2 - 1$?
                    \begin{proof}
                            Let $n = 4k + 3$ for some integer $k$. Then
                            \begin{align}
                                    n^2 - 1 & = (4k + 3)^2 - 1 \\
                                    & = 16k^2 + 24k + 9 - 1 \\
                                    & = 16k^2 + 24k + 8 \\
                                    & = 8(2k^2 + 3k + 1) \text{,}
                            \end{align}
                            which is certainly divisible by 8.
                    \end{proof}
    \end{enumerate}
 \end{document}

まず、各ドキュメントと行を読み、「\begin{BLOCK}」コマンドと「\end{BLOCK}」コマンドをすべて見つけて、ブロック文字列をスタックに追加し、一致する「\end」が見つかったら、スタックで pop() コマンドを呼び出します。私はほとんどすべてをやり遂げましたが、うまく整理されていないだけです。少なくとも、すべての「if」ステートメントよりも良い方法があると思います。それが私の最初の質問です。私がやった方法よりも良い方法はありますか?

次は、エラーを見つけて報告したいです。たとえば、上記のテキストから「\begin{document}」行を削除した場合、プログラムを実行して、想定されるすべてのことを実行させたいのですが、「\end{document}」行に到達すると報告されます「\begin」コマンドがありません。enumerate または itemize の「\begin」コマンドを削除するなど、他の例を処理するコードを取得しましたが、そのケースを機能させることができません。

最後に、欠落している「\ end」コマンドを処理できるようにしたいと考えています。私はそれを試みましたが、コンディショニングを正しく行うことができません。私がこの文書を持っているとしましょう...

\begin{argument}
\begin{Palin}No it can't. An argument is a connected series of statements intended to establish a proposition.\end{Palin}
\begin{Cleese}No it isn't.\end{Cleese}
\begin{Palin}\expression{exclamation}Yes it is! It's not just contradiction.\end{Palin}
\begin{Cleese}Look, if I argue with you, I must take up a contrary position.\end{Cleese}
\begin{Palin}Yes, but that's not just saying \begin{quotation}'No it isn't.'\end{Palin}
\begin{Cleese}\expression{exclamation}Yes it is!\end{Cleese}
\begin{Palin}\expression{exclamation}No it isn't!\end{Palin}
\begin{Cleese}\expression{exclamation}Yes it is!\end{Cleese}
\begin{Palin}Argument is an intellectual process.  Contradiction is just the automatic gainsaying of any statement the other person makes.\end{Palin}
\end{argument}

6 行目に「\end」のない「\begin{quotation}」コマンドがあることに気付くでしょう。この特定のドキュメントを通過するときの私のコードは、これを出力として提供します...

PARSE ERROR Line 6: Missing command \begin{Palin}.
PARSING TERMINATED!

これは明らかに真実ではありませんが、これらのケースを機能させるためにエラー処理を再構築する方法がわかりません。誰でも助けを提供できますか?特に、これらの問題を見つけやすくするために、このコードを整理する方法が重要です。

- - - - - - - - - - - - - - - - - - - - - -コード - - - --------------------------------------

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);

                        }
                    }//end of BEGIN if

                    if(nextData.contains("\\end") && !nextData.contains("\\begin")){

                        String[] theLine = nextData.split("[{}]");

                        for(int i = 0 ; i < theLine.length ; i++){

                            if(theLine[i].contains("\\end") && !s.isEmpty() && theLine[i+1].equals(s.peek())){

                                s.pop();

                                i++;

                            }

                            if(theLine[i].contains("\\end") && !theLine[i+1].equals(s.peek())){

                                System.out.println("PARSE ERROR Line " + lineCount + ": Missing command \\begin{" + theLine[i+1] + "}.");
                                System.out.println("PARSING TERMINATED!");
                                System.exit(0);

                            }
                        }
                    }//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].contains("\\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();

    if(s.isEmpty()){

        System.out.println();
        System.out.println(fname + " LaTeX file is valid!");
        System.exit(0);

    }

    while(!s.isEmpty()){



    }
}
}
4

0 に答える 0