使用 LaTeX 比较两个版本的编程代码

使用 LaTeX 比较两个版本的编程代码

我想比较两个版本的程序,并在它们之间添加垂直线。如何使用 LaTeX 实现此目的?

在此处输入图片描述

答案1

一种方法是使用两个minipages 和包裹listings

在此处输入图片描述

在此过程中,您还可以添加一些语法高亮,并导入包含您想要显示的源代码的外部文件:

在此处输入图片描述

笔记:


代码:基本

\documentclass{article}
\usepackage{listings}

\begin{document}
\begin{minipage}[t]{0.45\linewidth}
\begin{lstlisting}[language=c++]
// before refactoring
class A {
  public int f;
  void m (int i) {
     f = i + f;
  }
}
\end{lstlisting}
\end{minipage}%
\hfill\vrule\hfill
\begin{minipage}[t]{0.45\linewidth}
\begin{lstlisting}[language=c++]
// after refactoring
class A {
  private int f;
  void m(int i) {
     setF(i * getF()();
  }

  public int getF() {
    return this.F;
  }

  public void setF(int f) {
    this.f = f;
  }
}
\end{lstlisting}
\end{minipage}%
\end{document} 

代号:Fancy

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}

\usepackage{filecontents}
\begin{filecontents*}{before.c}
// before refactoring
class A {
  public int f;
  void m (int i) {
     f = i + f;
  }
}
\end{filecontents*}
\begin{filecontents*}{after.c}
// after refactoring
class A {
  private int f;
  void m(int i) {
     setF(i * getF()();
  }

  public int getF() {
    return this.F;
  }

  public void setF(int f) {
    this.f = f;
  }
}
\end{filecontents*}

\lstdefinestyle{MyStyle}{ %
    language=C++,
    backgroundcolor=\color{gray!10},
    basicstyle=\small,
    basicstyle=\small\ttfamily,
    keywordstyle=\color{red}
}

\begin{document}
\begin{minipage}[t]{0.45\linewidth}
    \lstinputlisting[style=MyStyle]{before.c}
\end{minipage}%
\hfill\vrule\hfill
\begin{minipage}[t]{0.45\linewidth}
    \lstinputlisting[style=MyStyle]{after.c}
\end{minipage}
\end{document} 

答案2

使用简单的表格环境:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor,listings,beramono}
\lstset{basicstyle=\ttfamily\small,
        keywordstyle=\color{blue}}
\begin{document}

\begin{tabular}{@{}p{\dimexpr0.4\linewidth-\tabcolsep}% can be up to 0.5\linewidth 
                 | p{\dimexpr0.5\linewidth-\tabcolsep}@{}}
\begin{lstlisting}[language=c++]
// before refactoring
class A {
  public int f;
  void m (int i) {
     f = i + f;
  }
}
\end{lstlisting}
&
\begin{lstlisting}[language=c++]
// after refactoring
class A {
  private int f;
  void m(int i) {
     setF(i * getF()();
  }

  public int getF() {
    return this.F;
  }

  public void setF(int f) {
    this.f = f;
  }
}
\end{lstlisting}

\end{tabular}

\end{document} 

在此处输入图片描述

相关内容