如何使用 lstlisting 插入方程编号?

如何使用 lstlisting 插入方程编号?

我正在尝试使用lstlisting环境将 R 代码插入我的 LaTeX 文档。我无法弄清楚如何让 LaTeX 对这些方程式进行编号,以便我可以在文本后面引用它们。我想做这样的事情:

\begin{lstlisting}[language=R]
lm.model <- lm(Total.Score ~ Game.Num, data = sid1133)
\end{lstlisting}\label{eq:lm.model}

要清楚——我知道我能做到这一点:

\begin{lstlisting}[language=R, caption={Standard Linear Regression Model Equation}, label=foobar]
lm.model <- lm(Total.Score ~ Game.Num, data = sid1133)
\end{lstlisting}

但是,我想将公式编号放在公式的右边 - 而不是放在顶部的单独标题中,并且我希望能够在文本的后面引用它。

答案1

为了能够在 内创建 R 列表(或实际上任何列表)\begin{equation} ... \end{equation},您需要使用\lstinline而不是 \begin{lstlisting} ... \end{lstlisting}。要开始和结束代码片段,您可以使用任何字符不是在代码中使用。一个流行的选择是例如|$

\lstinline[language=R]|lm.model <- lm(Total.Score ~ Game.Num, data = sid1133)|

但同样,只要该字符没有出现在您的代码片段中,就没关系。

为了能够将其放入\lstinline等式中,您必须先“退出”数学模式,这样您就处于“正常”文本模式。这是通过 完成的\text{any content which is not math}。所以,合起来,这是

\documentclass{article}
\usepackage{listings}
\usepackage{amsmath}
\begin{document}
As described in \eqref{eq:lm.eq:lm.model}, this is very important.
\begin{equation} \label{eq:lm.eq:lm.model}
    \text{\lstinline[language=R]|lm.model <- lm(Total.Score ~ Game.Num, data = sid1133)|}
\end{equation}
\end{document}

在此处输入图片描述

答案2

通常,对列表的引用要么是对整个列表(因此会有标题),要么是对列表内的行号。

下面我采用第二种方法,因为提供带有标题的单行列表似乎很奇怪。即使编号是在 上设置的left,您也可以将其放在 上right。请参阅部分5.6 行号listings 文档有关列表内行号格式的更多选项。

在此处输入图片描述

\documentclass{article}

\usepackage[margin=1in]{geometry}% Just for this example

\usepackage{listings}
\lstnewenvironment{rcode}[1][]
  {\lstset{
     language=R,
     numbers=left,
     numberstyle=\footnotesize,
     escapeinside=@@,
     #1}}
  {}
\newsavebox{\codebox}

\begin{document}

\begin{rcode}
lm.model <- lm(Total.Score ~ Game.Num, data = sid1133) @\label{r:lm.model-1}@
\end{rcode}

See Line~\ref{r:lm.model-1} or Line~\ref{r:lm.model-2}.

\begin{rcode}[firstnumber=200]
lm.model <- lm(Total.Score ~ Game.Num, data = sid1133) @\label{r:lm.model-2}@
\end{rcode}

\begin{lrbox}{\codebox}
\begin{lstlisting}[language=R]
lm.model <- lm(Total.Score ~ Game.Num, data = sid1133)
\end{lstlisting}
\end{lrbox}

Alternatively, see~(\ref{eq:lm.model-1}):
\begin{equation}
  \usebox{\codebox} \label{eq:lm.model-1}
\end{equation}

\begin{lrbox}{\codebox}
\lstinline[language=R]|lm.model <- lm(Total.Score ~ Game.Num, data = sid1133)|
\end{lrbox}

Alternatively, see~(\ref{eq:lm.model-2}):
\begin{equation}
  \usebox{\codebox} \label{eq:lm.model-2}
\end{equation}

\end{document}

为了正确引用行号,你必须逃脱插入适当的\label

如果你确实希望将列表代码作为方程式包含,你可能需要考虑在设置之前将列表存储在一个框中(上面我使用\begin{lrbox}{\codebox}... \end{lrbox})。请注意在lstlisting 环境\lstinline

答案3

这个例子最好

\begin{equation}
\hbox{
\begin{lstlisting}
  @@
  (?:
   (?<commandOrEnvironmentName>[a-zA-Z]+)
   (?:@(?<groupingData>[,0-9\x20]+))?
  )?
  @@
   (?<PLSQLexpresion>.+?)
  @END@
   (?<endlineChars>.*?\n|.*)
\end{lstlisting}}
\end{equation}

相关内容