Fonts 如何在PostScript中遍历数组数组?如何使用带有音乐符号的字体?

Fonts 如何在PostScript中遍历数组数组?如何使用带有音乐符号的字体?,fonts,postscript,Fonts,Postscript,我一直在努力编写一些PostScript代码,我正在一点一点地实现我的目标(PostScript语言真的很酷!) 到目前为止,我得到的是: %!PS-Adobe-2.0 /Times-Roman findfont 20 scalefont setfont /r 360 12 / def /triades [ (C Dm Em F G Am Bmb5) (F Gm Am Bb C Dm Emb5) (Bb Cm Dm Eb F Gm Amb5) (Eb Fm Gm Ab Bb Cm Dmb5)

我一直在努力编写一些PostScript代码,我正在一点一点地实现我的目标(PostScript语言真的很酷!)

到目前为止,我得到的是:

%!PS-Adobe-2.0
/Times-Roman findfont 20 scalefont setfont
/r 360 12 / def

/triades [
(C Dm Em F G Am Bmb5)
(F Gm Am Bb C Dm Emb5)
(Bb Cm Dm Eb F Gm Amb5)
(Eb Fm Gm Ab Bb Cm Dmb5)
(Ab Bbm Cm Db Eb Fm Gmb5)
(Db Ebm Fm Gb Ab Bbm Cmb5)
(F# G#m A#m B C# D#m E#mb5)
(B C#m D#m E F# G#m A#mb5)
(E F#m G#m A B C#m D#mb5)
(A Bm C#m D E F#m G#mb5)
(D Em F#m G A Bm C#mb5)
(G Am Bm C D Em F#b5)
] def

336 396 translate
triades  { 50 0 moveto show 30 rotate } forall
showpage
它给了我一页,12个和弦序列排列成一个圆圈。但这种方法存在一个问题:它会自动设置间距,因此在许多和弦都有
#
的直线上,直线会变大,和弦之间的距离也会变远。我试着做一个嵌套循环,一个接一个地打印chor,但这并没有真正起作用。以下是我尝试过的:

%!PS-Adobe-2.0
/Times-Roman findfont 20 scalefont setfont
/r 360 12 / def

/triadesArr [
[(C Dm Em F G Am Bmb5)]
[(F Gm Am Bb C Dm Emb5)]
[(Bb Cm Dm Eb F Gm Amb5)]
[(Eb Fm Gm Ab Bb Cm Dmb5)]
[(Ab Bbm Cm Db Eb Fm Gmb5)]
[(Db Ebm Fm Gb Ab Bbm Cmb5)]
[(F# G#m A#m B C# D#m E#mb5)]
[(B C#m D#m E F# G#m A#mb5)]
[(E F#m G#m A B C#m D#mb5)]
[(A Bm C#m D E F#m G#mb5)]
[(D Em F#m G A Bm C#mb5)]
[(G Am Bm C D Em F#b5)]
] def

336 396 translate
triadesArr { 50 0 moveto { 50 0 moveto show } forall 30 rotate } forall

showpage
由于某些原因,两个输出是相同的。我怎样才能修好它


还有一个话题:如何使用带有音乐符号的字体?我希望像
Bbm
这样的和弦有一个真正的平号,而不是
b
字母。我试着下载并使用类似或的字体(甚至是中使用的字体)

如有任何指示,将不胜感激

多谢各位


Obs.:字符串数组是否是作业最合适的数据结构?它对我来说就像是最简单、最朴素的。如果你是做这个程序的人,你会使用另一个数据结构吗?

我想你希望moves是相对的,不是,它在页面上指定了一个绝对位置。因此,外部循环移动到50,0,然后内部循环移动到50,0(这是相同的位置),并绘制字符串。然后旋转30度,移动到50,0,再移动到50,0,依此类推。您将立即注意到,它与第一个代码片段相同,这就是为什么您会得到相同的输出

如果你想要一个相对的moveto,那么你需要做一个相对的moveto,而不是moveto

当然,完全有可能我误解了你想要实现的目标

至于字体的使用,根据你使用的字体有两种方法

您可以将字体安装到解释器中,然后简单地调用字体,就像您为Times Roman所做的那样

您可以将字体嵌入PostScript文件并执行完全相同的操作,但在这种情况下,您可以将PostScript文件发送给没有字体的人,并且仍然可以正确打印

如果字体是type 1字体,则可以直接嵌入它们。注意:查看其中一个软件包,我注意到它包含无法直接使用的.pfb文件(打印机字体二进制文件),您需要对其进行解码。您根本不能直接使用TrueType(或OpenType)字体,它们需要转换为type 42字体(或者对于带有CFF轮廓的OpenType字体,转换为type 2字体)


我不完全确定你想做什么,所以很难对你的方法提出批评。请注意,我的音乐知识基本上是零,这可能没有帮助….

我想你的问题是你试图获得 注释位于每行的特定半径处。 这意味着每个音符必须是一个单独的字符串 每个弦都必须像这样旋转和重新启动:

%!PS-Adobe-2.0
/Times-Roman findfont 12 scalefont setfont
/r 360 12 / def

/triadesArr [
[(C ) (Dm ) (Em ) (F ) (G ) (Am ) (Bmb5 )]
[(F ) (Gm ) (Am ) (Bb) (C ) (Dm ) (Emb5 )]
[(Bb) (Cm ) (Dm ) (Eb) (F ) (Gm ) (Amb5 )]
[(Eb) (Fm ) (Gm ) (Ab) (Bb) (Cm ) (Dmb5 )]
[(Ab) (Bbm) (Cm ) (Db) (Eb) (Fm ) (Gmb5 )]
[(Db) (Ebm) (Fm ) (Gb) (Ab) (Bbm) (Cmb5 )]
[(F#) (G#m) (A#m) (B ) (C#) (D#m) (E#mb5)]
[(B ) (C#m) (D#m) (E ) (F#) (G#m) (A#mb5)]
[(E ) (F#m) (G#m) (A ) (B ) (C#m) (D#mb5)]
[(A ) (Bm ) (C#m) (D ) (E ) (F#m) (G#mb5)]
[(D ) (Em ) (F#m) (G ) (A ) (Bm ) (C#mb5)]
[(G ) (Am ) (Bm ) (C ) (D ) (Em ) (F#b5 )]
] def

336 396 translate
triadesArr { 50 0 moveto { 10 0 rmoveto show } forall 30 rotate } forall

showpage
这段代码已经过测试,字体必须缩小以适合页面