7

This question led to a new package: sclang-prettifier

I've been poring over the listings manual, trying to figure out how to get some very specific types of formatting for the SuperCollider language.

I need to highlight words where the opening delimiter is \ and the closing delimiter is any non-alphanumeric character. Background: SC has a normal string type, delimited by double quotes -- that's easy. It also has a Symbol type, in single quotes (also easy) -- but Symbols that consist only of alphanumeric characters (and underscore) may also be written with a preceding backslash: 'symbol' and \symbol are equivalent.

Note that the answer to How to highlight all identifiers starting by '@'? does not apply because the closing delimiter may be any non-alphanum (frequently a comma or closing paren, in which case it would be ugly to force a space before it).

If listings won't do it, what alternatives do I have? I also looked at the minted manual, but that was even more confusing.

Some sample SuperCollider code:

p.clear;

~grains.addSpec(\tfreq, [1, 40, \exp]);
~grains.addSpec(\overlap, [0.1, 10, \exp]);
~grains.addSpec(\pos, [0, b.duration]);  // 3.43 is nice!
~grains.addSpec(\rate, [0.5, 2, \exp]);
~grains = { |tfreq = 25, overlap = 6, pan = 0, amp = 0.2, pos = 3.43,
   rate = 1|
   var trig = Impulse.ar(tfreq);
   TGrains.ar(2, trig, b, rate, pos, overlap / tfreq, pan, amp)
};
~grains.play;

\exp, \tfreq, \overlap, \pos and \rate need to be highlighted as Symbols. Ideally, environment variables (e.g. ~grains) would also be highlighted in a different color (same rule but with a different opening delimiter).

I have another question, which I will ask separately...

James
  • 499
  • I don’t think minted supports SuperCollider; at least, it’s not in the list of lexers I get from pygmentize -L lexers. – alexwlchan Mar 22 '14 at 18:30

1 Answers1

6

listings can do that, but you have to whisper in its ear :)

First, tell listings to treat backslash and tilde as "letters", thereby allowing them in identifiers. Then, before each identifier gets printed, check the first character of that identifier and apply a different style depending on that character.

For convenience, I've defined keys to easily specify the styles for SuperCollider classes (starting by A-Z), symbols (starting by \), and global variables (starting by ~).

Update: For convenience to SuperCollider users, I've put together a little package called sclang-prettifier, now available on CTAN and, soon, in popular TeX distributions.

enter image description here

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[framed,numbered]{sclang-prettifier}

% --- write source code to external file (for this example) ---
\usepackage{filecontents}
\begin{filecontents*}{sample.scd}
p.clear;

~grains.addSpec(\tfreq, [1, 40, \exp]);
~grains.addSpec(\overlap, [0.1, 10, \exp]);
~grains.addSpec(\pos, [0, b.duration]);  // 3.43 is nice!
~grains.addSpec(\rate, [0.5, 2, \exp]);
~grains = { |tfreq = 25, overlap = 6, pan = 0, amp = 0.2, pos = 3.43,
   rate = 1|
   var trig = Impulse.ar(tfreq);
   TGrains.ar(2, trig, b, rate, pos, overlap / tfreq, pan, amp)
};
~grains.play;
\end{filecontents*}

\begin{document}
\lstinputlisting
[
  style      = SuperCollider-IDE,
  basicstyle = \scttfamily\small,
  caption    = {SuperCollider sample}
]{sample.scd}

\begin{lstlisting}[
  frame   = single,
  caption = Some code unrelated to SuperCollider,
]
 c = a
 a = b
 b = c
 discard c
\end{lstlisting}
\end{document}
jub0bs
  • 58,916
  • Thank you for this! It looks great. Sorry I didn't reply quickly; I was busy writing content. Question: There seems to be a bug, though. It works correctly for the first listing, but all subsequent listings have a large number of extra "a" characters sprinkled throughout, e.g. "// aProxySpace asyntaxa" with 3 extra "a"s. If I comment out the first listing and recompile, then the next listing is correct and all subsequent ones fail. I suspect some state variables are not being reset properly. I also suspect it's an easy fix :) and I'm really grateful for your work on this. – James Mar 22 '14 at 10:15
  • @James There is indeed a bug and it probably is an easy fix, but I won't have time to look into it until late today. Stay tuned. In the meantime, please also have a look at my answer to your other question. – jub0bs Mar 22 '14 at 10:49
  • @James The bug has been corrected in the latest version of supercollider.sty. Grab it from https://bitbucket.org/Jubobs/supercollider and test it on the code posted in my answer. Let me know if you notice anything else that looks like a bug. If you're happy, please upvote/accept my answer(s). Also, please let me know whether you think I should make this an official package and submit it to CTAN. Would SuperCollider users in general be interested in it? – jub0bs Mar 22 '14 at 18:17
  • I have tested it on my own code (just made a small reproducer here: https://github.com/jamshark70/scweek2014/blob/master/shows/full-article/listings-test.tex). It passed that test, and also rendered an entire chapter correctly as a test. It doesn't work with beamer, though: chokes on {\lst@FontAdjust. I can live without that for now, but that should be fixed before making an official package. So now it's just: tweak the colors, remove the border and run the whole thing. – James Mar 23 '14 at 08:43
  • I will accept this answer now, but I've also logged an issue at bitbucket for the Beamer problem. – James Mar 23 '14 at 09:16
  • @James Thanks for your feedback; there was indeed a bug, but I seem to have fixed it in my latest commit; please test it and confirm. Also, things are not set in stone yet. Do you have any suggestions for the package? In particular, do you think I should rename the globalvarstyle key to envvarstyle or something similar? – jub0bs Mar 23 '14 at 15:12
  • @James I don't use SuperCollider myself and I'm familiar neither with the language nor with the terminology. However, based on this 2012 post of yours, I've decided to rename the globalvarstyle key to envvarstyle. If you find other bugs or if you think of additional features for the package, please open an issue on the Bitbucket page. Also, since you're a SuperCollider power user, please don't hesitate to advertise the package to the SuperCollider community :) – jub0bs Mar 23 '14 at 17:20