如何自动突出显示 SuperCollider 符号和环境变量?

如何自动突出显示 SuperCollider 符号和环境变量?

这个问题导致了一个新的方案的出现: sclang-prettifier

我一直在仔细阅读listings手册,试图弄清楚如何获取 SuperCollider 语言的一些非常特殊的格式。

我需要突出显示开头分隔符\和结尾分隔符是任何非字母数字字符的单词。背景:SC 有一个普通的字符串类型,用双引号分隔——这很容易。它还有一个符号类型,用单引号分隔(也很容易)——仅由字母数字字符(和下划线)组成的符号也可以在前面加上反斜杠:'symbol'\symbol是等效的。

请注意如何突出显示所有以“@”开头的标识符?不适用,因为结束分隔符可能是任何非字母数字(通常是逗号或右括号,在这种情况下,强制在其前添加空格会很难看)。

如果listings不行的话,我还有别的选择吗?我也看了手册minted,但那更让人困惑。

一些 SuperCollider 代码示例:

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\rate~grains

我还有一个问题,我将单独询问......

答案1

listings可以做到这一点,但你必须在它耳边低语:)

首先,告诉listings将反斜杠和波浪线视为“字母”,从而允许它们出现在标识符中。然后,在打印每个标识符之前,检查该标识符的第一个字符,并根据该字符应用不同的样式。

A-Z为了方便起见,我定义了键来轻松指定 SuperCollider 类(以 开头)、符号(以 开头\)和全局变量(以 开头)的样式~

更新:为了方便 SuperCollider 用户,我整理了一个名为sclang-prettifier,现已在 CTAN 上可用,并且很快会在流行的 TeX 发行版中推出。

在此处输入图片描述

\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}

相关内容