这个问题导致了一个新的方案的出现:
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}