列表中代码语法突出显示的异常

列表中代码语法突出显示的异常

编辑:这个问题对我来说已经不再重要了,我决定改用包highlightR代码导出为 LaTeX 输出。这仍然需要手动修改,但至少我可以让它工作。也许这个问题仍然可以保持开放和“未解答”,以防有人想出解决方案。

我正在使用 listings 包将一些 R 代码包含在 LaTeX 中。现在,一些 R 函数(如date()或 )start被突出显示(以蓝色显示)。但是,不幸的是,我的一些变量包含字符串(如 date 或 start)。我希望只突出显示函数,而不突出显示变量名称中的内容。例如,在下面的代码中,只date应突出显示第一行中的

\documentclass{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{color}

\definecolor{lightgray}{gray}{0.95}
\definecolor{darkgray}{gray}{0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}


\usepackage{listings}
\lstset{ 
  language=R,                     % the language of the code
  basicstyle=\footnotesize,       % the size of the fonts that are used for the code
  numbers=none,                   % where to put the line-numbers
  backgroundcolor=\color{lightgray},  % choose the background color. You must add \usepackage{color}
  showspaces=false,               % show spaces adding particular underscores
  showstringspaces=false,         % underline spaces within strings
  showtabs=false,                 % show tabs within strings adding particular underscores
  tabsize=2,                      % sets default tabsize to 2 spaces
  breaklines=true,                % sets automatic line breaking
  keywordstyle=\color{blue},      % keyword style
  commentstyle=\color{darkgray},   % comment style
  stringstyle=\color{mauve},      % string literal style
} 

\begin{document}

\begin{lstlisting}[language=R]
a <- date(123)
date.a <- 123
a.start <- 456
a_start <- 456
\end{lstlisting}

\end{document} 

输出结果如下:

在此处输入图片描述

有没有办法将 的其他出现date或 的一般出现排除start在突出显示之外?我尝试deletekeywords={start}向 中添加一个选项\lstset,但它并没有改变输出

如果没有这样的选择,我也会很乐意删除任何突出显示datestart但该deletekeywords={start}选项似乎不起作用。

此外,我尝试了命令,该命令可以将“。”和“_”添加到字母列表中,但这也没有改变任何东西。也许是一些奇怪的交互。我找到了一个完全不同的解决方案,现在highlight直接在 中使用包R。不是一个真正优雅的解决方案,但至少我可以让它工作

答案1

在' (in )listings的定义中我们发现:Rlstlang3.sty

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

您会看到,它既_是关键字本身,又具有类别代码 other。还.具有类别代码 other。如果我们撤消此操作,即删除关键字(对于用 定义的关键字,这otherkeywords显然意味着我们必须重新设置整个列表,但没有我们想要删除的关键字)并将两个字符指定为字母

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

然后您就会得到所需的输出。带有._字母的listings不会将startdate视为变量名称中的函数,因为它现在将整个字符串date.a(包括.)视为一个单词:

\documentclass{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{color}

\definecolor{lightgray}{gray}{0.95}
\definecolor{darkgray}{gray}{0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}


\usepackage{listings}
\lstdefinestyle{mystyle}{
  language=R,                     % the language of the code
  basicstyle=\ttfamily,       % the size of the fonts that are used for the code
  numbers=none,                   % where to put the line-numbers
  backgroundcolor=\color{lightgray},  % choose the background color. You must
                                % add \usepackage{color}
  columns=fullflexible,
  showspaces=false,               % show spaces adding particular underscores
  showstringspaces=false,         % underline spaces within strings
  showtabs=false,                 % show tabs within strings adding particular underscores
  tabsize=2,                      % sets default tabsize to 2 spaces
  breaklines=true,                % sets automatic line breaking
  keywordstyle=\color{blue},      % keyword style
  commentstyle=\color{darkgray},   % comment style
  stringstyle=\color{mauve},      % string literal style
  alsoletter={._},
  otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,/}
} 

\begin{document}

\begin{lstlisting}[style=mystyle]
a <- date(123)
date.a <- 123
a.start <- 456
a_start <- 456
\end{lstlisting}

\end{document}

在此处输入图片描述

相关内容