[Tex/LaTex] How to delete non-letter keywords (such as ‘<-')

listingsr

I am using the package to try and format my R code, and I don't like some of the things that are being treated as keywords (for the coloring scheme). However, when I specify deletekeywords={*,<-} in the \lstset, it refuses to remove them. Here is the code:

    \documentclass{scrartcl}
    \usepackage{courier}
    \usepackage{listings}
    \usepackage{xcolor}

    \xdefinecolor{gray}{rgb}{0.4,0.4,0.4}
    \xdefinecolor{blue}{RGB}{58,95,205}% R's royalblue3; #3A5FCD 


    \lstset{ %
      language=R,                % the language of the code
      basicstyle=\ttfamily\footnotesize,           % the size of the fonts that are used for the code
      deletekeywords={*, <-},
      numbers=left,                   % where to put the line-numbers
      numberstyle=\tiny\color{gray},  % the style that is used for the line-numbers
      stepnumber=2,                   % the step between two line-numbers. If it's 1, each line
                                      % will be numbered
      numbersep=5pt,                  % how far the line-numbers are from the code
      backgroundcolor=\color{white},      % 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
      frame=single,                   % adds a frame around the code
      rulecolor=\color{black},        % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. commens (green here))
      tabsize=2,                      % sets default tabsize to 2 spaces
      captionpos=b,                   % sets the caption-position to bottom
      breaklines=true,                % sets automatic line breaking
      breakatwhitespace=false,        % sets if automatic breaks should only happen at whitespace
      title=\lstname,                   % show the filename of files included with         \lstinputlisting;
                              % also try caption instead of title
      keywordstyle=\color{blue},          % keyword style
      commentstyle=\color{gray},       % comment style
      stringstyle=\color{gray},         % string literal style
      escapeinside={},            % if you want to add a comment within your code
     morekeywords={byrow}               % if you want to add more keywords to the set
    } 

    \begin{document}

    \begin{lstlisting}
    x <- c(1, 2, 3, 4, 5, 6)
    xmat <- matrix(x, byrow = TRUE, nrow = 3)
    xmat %*% t(xmat)
    \end{lstlisting}

    \end{document}

Best Answer

A bit of background...

The listings package has different mechanisms to define keywords. Two keys you're likely to use most often are keywords and morekeywords. The former defines a list of keywords from scratch (overwriting any existing list), whereas the latter adds to the existing list (if any). You can also delete existing keywords by using the deletekeywords key.

Besides, there is another key, called otherkeywords, that can be used to define special keywords. The manual (subsection 4.18) describes it thus:

otherkeywords={⟨keywords⟩}

Defines keywords that contain other characters, or start with digits. Each given 'keyword' is printed in keyword style, but without changing the 'letter', 'digit' and 'other' status of the characters. This key is designed to define keywords like =>, ->, -->, --, ::, and so on. If one keyword is a subsequence of another (like -- and -->), you must specify the shorter first.

So, what's going on here?

The incriminated "keywords" (* and <-) are defined with the otherkeywords key in the definition of the R language by the listings package (do a search for "definelanguage{R}" in the lstdvrs.dtx file):

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

"Other keywords" defined with that key cannot be deleted using the deletekeywords key.

A solution

Sadly, there is no deleteotherkeywords key. The only way to delete such "other keywords" is to reinitialise the value associated to the otherkeywords key

otherkeywords={},

preferably right after invoking language=R.

enter image description here

Edit: If you want to preserve a subset of those "other keywords", you need to copy the line from the original language definition,

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

and edit it to your taste.

Complete code

\documentclass{scrartcl}
\usepackage{courier}
\usepackage{listings}
\usepackage{xcolor}

\xdefinecolor{gray}{rgb}{0.4,0.4,0.4}
\xdefinecolor{blue}{RGB}{58,95,205}% R's royalblue3; #3A5FCD 


\lstset{ %
  language=R,                % the language of the code
  basicstyle=\ttfamily\footnotesize,           % the size of the fonts that are used for the code
  %otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,_,/}, % default in the R language defined by the listings package
  otherkeywords={}, % resets the list of "other keywords"
  numbers=left,                   % where to put the line-numbers
  numberstyle=\tiny\color{gray},  % the style that is used for the line-numbers
  stepnumber=2,                   % the step between two line-numbers. If it's 1, each line
                                  % will be numbered
  numbersep=5pt,                  % how far the line-numbers are from the code
  backgroundcolor=\color{white},      % 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
  frame=single,                   % adds a frame around the code
  rulecolor=\color{black},        % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. commens (green here))
  tabsize=2,                      % sets default tabsize to 2 spaces
  captionpos=b,                   % sets the caption-position to bottom
  breaklines=true,                % sets automatic line breaking
  breakatwhitespace=false,        % sets if automatic breaks should only happen at whitespace
  title=\lstname,                   % show the filename of files included with         \lstinputlisting;
                          % also try caption instead of title
  keywordstyle=\color{blue},          % keyword style
  commentstyle=\color{gray},       % comment style
  stringstyle=\color{gray},         % string literal style
  escapeinside={},            % if you want to add a comment within your code
 morekeywords={byrow}               % if you want to add more keywords to the set
} 

\begin{document}

\begin{lstlisting}[caption={A first example}, label=list:ex]
x <- c(1, 2, 3, 4, 5, 6)
xmat <- matrix(x, byrow = TRUE, nrow = 3)
xmat %*% t(xmat)
\end{lstlisting}

\end{document}