使用列表包时 R 语言运算符的输出不一致

使用列表包时 R 语言运算符的输出不一致

一位裁判注意到我使用的代码清单中的 <<-(分配给全局)和(矩阵乘法)运算符是错误的。%*%

我使用的是标准 listings 包(版本 1.4,发布日期为 2007/02/22,来自 Ubuntu 12.10 上的 texlive 20120611)。下面是一个例子。在这两种情况下第二使用<%似乎使用了正确的字体,但第一个没有。

这些运算符在文件中定义lstlang3.sty

otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,_,/},%

在这个简短的例子中,我甚至定义了一个简单的自定义语言定义。通过定义%*%为,otherkeyword我解决了一半的问题——但我无法同时修复<<-和:一旦添加,它就会在内部匹配。这看起来像是一个错误。有谁可以追踪它?<-<-<<-

代码:

\documentclass[12pt]{article}
\usepackage{listings}           
\lstdefinelanguage{customR}{    % defined a new R entry
  keywords={t},
  otherkeywords={<<-,\%*\%},    %% cannot add <-
  keywordstyle=\bfseries
}
\lstdefinelanguage{customRtwo}{
  otherkeywords={<-,<<-,\%*\%},  %% cannot add <-
  keywordstyle=\bfseries
}

\begin{document} 

\lstset{language=R,caption={Standard R}}
\begin{lstlisting}[frame=tb]
    S <- H %*% t(pprd) %*% t(H) + R
    xest <<- xprd + kalmangain %*% (z - H %*% xprd)
}
\end{lstlisting}

\lstset{language=customR,caption={Custom R}}
\begin{lstlisting}[frame=tb]
    S <- H %*% t(pprd) %*% t(H) + R
    xest <<- xprd + kalmangain %*% (z - H %*% xprd)
}
\end{lstlisting}

\lstset{language=customRtwo,caption={Custom R (alt.)}}
\begin{lstlisting}[frame=tb]
    S <- H %*% t(pprd) %*% t(H) + R
    xest <<- xprd + kalmangain %*% (z - H %*% xprd)
}
\end{lstlisting}

\end{document}

输出(此处渲染为 png)

在此处输入图片描述

总之:

  • 默认情况下,和<<-都是%*%错误的
  • 我设法修复了<<-%*%但是......
  • ...我似乎无法修复<<- <-

任何帮助将不胜感激。

编辑:结尾}当然是虚假的,我最初有一个更长的例子,但忘了删除它们。

答案1

一种可能的手动方法是使用moredelim=**[is][\bfseries]{@}{@},

我也可以建议一种风格吗?下面我\lstdefinelanguage customRthree结合包进行了定义courier。您也可以尝试beramono。例如,Latex 列表 R:需要带有粗体关键字和正确插入符号(^)的等宽字体

\lstdefinelanguage{customRthree}{
    keywords={t},
    otherkeywords={<<-,\%*\%},    %% cannot add <-
    keywordstyle=\bfseries,
    moredelim=**[is][\bfseries]{@}{@}, % every character inside @ @ will be in bold face
    basicstyle=\ttfamily,
    commentstyle=\textsl,
}

代码

\documentclass[preview,border=5,convert]{standalone}

\usepackage{courier}

\usepackage{listings}           
\lstdefinelanguage{customR}{    % defined a new R entry
  keywords={t},
  otherkeywords={<<-,\%*\%},    %% cannot add <-
  keywordstyle=\bfseries,
  moredelim=**[is][\bfseries]{@}{@},
}
\lstdefinelanguage{customRtwo}{
  otherkeywords={<-,<<-,\%*\%},  %% cannot add <-
  keywordstyle=\bfseries,
  moredelim=**[is][\bfseries]{@}{@},
}

\lstdefinelanguage{customRthree}{
    keywords={t,R},
    otherkeywords={<<-,\%*\%},    %% cannot add <-
    keywordstyle=\bfseries,
    moredelim=**[is][\bfseries]{@}{@},
    basicstyle=\ttfamily,
    commentstyle=\textsl,
}

\begin{document} 

\lstset{language=R,caption={Standard R}}
\begin{lstlisting}[frame=tb]
    S <- H %*% t(pprd) %*% t(H) + R
    xest <<- xprd + kalmangain %*% (z - H %*% xprd)
}
\end{lstlisting}

\lstset{language=customR,caption={Custom R}}
\begin{lstlisting}[frame=tb]
    S @<-@ H %*% t(pprd) %*% t(H) + R
    xest @<<-@ xprd + kalmangain %*% (z - H %*% xprd)
}
\end{lstlisting}

\lstset{language=customRtwo,caption={Custom R (alt.)}}
\begin{lstlisting}[frame=tb]
    S <- H %*% t(pprd) %*% t(H) + R
    xest @<@<- xprd + kalmangain %*% (z - H %*% xprd)
}
\end{lstlisting}

\begin{lstlisting}[frame=tb,language=customRthree,caption={Custom R 3}]
    S @<-@ H %*% t(pprd) %*% t(H) + R
    xest @<<-@ xprd + kalmangain %*% (z - H %*% xprd)
}
\end{lstlisting}

\end{document}

输出

在此处输入图片描述

相关内容