[Tex/LaTex] Keywords with spaces in Listings

input-encodingskeywordslistingsmicrotypespacing

I want spaced keywords in listings (that is, keyword, with spaces in between).

Now, there are some questions in this site already answered, like this one, where the official answer is that “it is not possible”. But, of course, like almost everything, there are workarounds that let you do it.

However, I've seen in the documentation of microtype correctly highlighted keywords that do contain spaces (e.g., no ligatures, outer kerning, outer spacing).

That's all. If I didn't make myself clear, please, leave a comment. That's the question: I want to reproduce the system used in microtype's documentation.


Update

As @Robert noted, he used latin1 encoding in the documentation. Which seems to work nice with lstlisting (apart from non-breaking spaces, it even accepts, e.g., á, ü by default). But I use utf8 (not for anything special, but because it's recommended everywhere), which doesn't behaves well with listings. Since I like this idea of using non-breaking spaces to define keywords with spaces, I will rewrite my question

Is there a way to teach utf8/listings to understand non-breaking spaces inside of keywords?

Here is a minimal non-working example:

NOTE: the space between spaced and keyword is a non-breaking space (as you can see in the image below).

\documentclass{scrartcl}

%\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenx} % With latin1 it works perfectly

\usepackage{listings}
\lstset{keywords={spaced keyword}, columns=fullflexible}

\begin{document}
\begin{lstlisting}
  notakeyword spaced keyword notakeyword
\end{lstlisting}
\end{document}

enter image description here

Best Answer

Well, most of your questions have already been answered either in the question itself or in the comments, so here's just a recap to satisfy the site's mores:

  • The workaround to allow spaces in keywords that microtype.dtx employs is to use the "non-breaking space" in lieu of a normal space to make listings believe that it's a letter, while it will be output as a space;
  • this requires loading an input encoding that does indeed contain the non-breaking space and maps it to a normal space (e.g., latin1).
  • The problem in your example is that you use utf8 input encoding, which – though it meets the above requirement – is not compatible with the listings package. I don't see a way to fix this incompatibility other than in listings itself.

AFAICT, you only have two options:

  • either don't use utf8 encoding – which in your case appears to be possible considering the fact that you say the only reason why you use it in the first place is that it is recommended everywhere;
  • or use the listingsutf8 package (which understands utf8 input in included files) and store all your code listings in separate files – maybe a bit cumbersome depending on the number of listings you have.