var qrcode = function() { var j = function(x, n) { var F = 236; var E = 17; var r = x; var t = g[n]; var p = null; var A = 0; var l = null; var v = new Array(); var B = {}; var y = function(H, G) { A = r * 4 + 17; p = function(L) { var J = new Array(L); for (var K = 0; K < L; K += 1) { J[K] = new Array(L); for (var I = 0; I < L; I += 1) { J[K][I] = null } } return J } (A); u(0, 0); u(A - 7, 0); u(0, A - 7); w(); m(); D(H, G); if (r >= 7) { s(H) } if (l == null) { l = o(r, t, v) } z(l, G) }; var u = function(I, G) { for (var H = -1; H <= 7; H += 1) { if (I + H <= -1 || A <= I + H) { continue } for (var J = -1; J <= 7; J += 1) { if (G + J <= -1 || A <= G + J) { continue } if ((0 <= H && H <= 6 && (J == 0 || J == 6)) || (0 <= J && J <= 6 && (H == 0 || H == 6)) || (2 <= H && H <= 4 && 2 <= J && J <= 4)) { p[I + H][G + J] = true } else { p[I + H][G + J] = false } } } }; var q = function() { var J = 0; var I = 0; for (var H = 0; H < 8; H += 1) { y(true, H); var G = f.getLostPoint(B); if (H == 0 || J > G) { J = G; I = H } } return I }; var m = function() { for (var G = 8; G < A - 8; G += 1) { if (p[G][6] != null) { continue } p[G][6] = (G % 2 == 0) } for (var H = 8; H < A - 8; H += 1) { if (p[6][H] != null) { continue } p[6][H] = (H % 2 == 0) } }; var w = function() { var M = f.getPatternPosition(r); for (var I = 0; I < M.length; I += 1) { for (var H = 0; H < M.length; H += 1) { var K = M[I]; var G = M[H]; if (p[K][G] != null) { continue } for (var J = -2; J <= 2; J += 1) { for (var L = -2; L <= 2; L += 1) { if (J == -2 || J == 2 || L == -2 || L == 2 || (J == 0 && L == 0)) { p[K + J][G + L] = true } else { p[K + J][G + L] = false } } } } } }; var s = function(J) { var I = f.getBCHTypeNumber(r); for (var H = 0; H < 18; H += 1) { var G = (!J && ((I >> H) & 1) == 1); p[Math.floor(H / 3)][H % 3 + A - 8 - 3] = G } for (var H = 0; H < 18; H += 1) { var G = (!J && ((I >> H) & 1) == 1); p[H % 3 + A - 8 - 3][Math.floor(H / 3)] = G } }; var D = function(L, K) { var J = (t << 3) | K; var I = f.getBCHTypeInfo(J); for (var H = 0; H < 15; H += 1) { var G = (!L && ((I >> H) & 1) == 1); if (H < 6) { p[H][8] = G } else { if (H < 8) { p[H + 1][8] = G } else { p[A - 15 + H][8] = G } } } for (var H = 0; H < 15; H += 1) { var G = (!L && ((I >> H) & 1) == 1); if (H < 8) { p[8][A - H - 1] = G } else { if (H < 9) { p[8][15 - H - 1 + 1] = G } else { p[8][15 - H - 1] = G } } } p[A - 8][8] = (!L) }; var z = function(L, H) { var J = -1; var Q = A - 1; var K = 7; var G = 0; var O = f.getMaskFunction(H); for (var I = A - 1; I > 0; I -= 2) { if (I == 6) { I -= 1 } while (true) { for (var N = 0; N < 2; N += 1) { if (p[Q][I - N] == null) { var M = false; if (G < L.length) { M = (((L[G] >>> K) & 1) == 1) } var P = O(Q, I - N); if (P) { M = !M } p[Q][I - N] = M; K -= 1; if (K == -1) { G += 1; K = 7 } } } Q += J; if (Q < 0 || A <= Q) { Q -= J; J = -J; break } } } }; var C = function(Q, T) { var I = 0; var W = 0; var U = 0; var H = new Array(T.length); var L = new Array(T.length); for (var O = 0; O < T.length; O += 1) { var P = T[O].dataCount; var G = T[O].totalCount - P; W = Math.max(W, P); U = Math.max(U, G); H[O] = new Array(P); for (var R = 0; R < H[O].length; R += 1) { H[O][R] = 255 & Q.getBuffer()[R + I] } I += P; var M = f.getErrorCorrectPolynomial(G); var V = c(H[O], M.getLength() - 1); var J = V.mod(M); L[O] = new Array(M.getLength() - 1); for (var R = 0; R < L[O].length; R += 1) { var N = R + J.getLength() - L[O].length; L[O][R] = (N >= 0) ? J.getAt(N) : 0 } } var S = 0; for (var R = 0; R < T.length; R += 1) { S += T[R].totalCount } var X = new Array(S); var K = 0; for (var R = 0; R < W; R += 1) { for (var O = 0; O < T.length; O += 1) { if (R < H[O].length) { X[K] = H[O][R]; K += 1 } } } for (var R = 0; R < U; R += 1) { for (var O = 0; O < T.length; O += 1) { if (R < L[O].length) { X[K] = L[O][R]; K += 1 } } } return X }; var o = function(N, M, J) { var H = e.getRSBlocks(N, M); var G = d(); for (var I = 0; I < J.length; I += 1) { var L = J[I]; G.put(L.getMode(), 4); G.put(L.getLength(), f.getLengthInBits(L.getMode(), N)); L.write(G) } var K = 0; for (var I = 0; I < H.length; I += 1) { K += H[I].dataCount } if (G.getLengthInBits() > K * 8) { throw new Error("code length overflow. (" + G.getLengthInBits() + ">" + K * 8 + ")") } if (G.getLengthInBits() + 4 <= K * 8) { G.put(0, 4) } while (G.getLengthInBits() % 8 != 0) { G.putBit(false) } while (true) { if (G.getLengthInBits() >= K * 8) { break } G.put(F, 8); if (G.getLengthInBits() >= K * 8) { break } G.put(E, 8) } return C(G, H) }; B.addData = function(H) { var G = i(H); v.push(G); l = null }; B.isDark = function(H, G) { if (H < 0 || A <= H || G < 0 || A <= G) { throw new Error(H + "," + G) } return p[H][G] }; B.getModuleCount = function() { return A }; B.make = function() { y(false, q()) }; B.createTableTag = function(K, I) { K = K || 2; I = (typeof I == "undefined") ? "auto": I; var G = ""; G += '>> 8); q.push(p & 255) } } else { q.push(l) } } } return q } }; var h = { MODE_NUMBER: 1 << 0, MODE_ALPHA_NUM: 1 << 1, MODE_8BIT_BYTE: 1 << 2, MODE_KANJI: 1 << 3 }; var g = { L: 1, M: 0, Q: 3, H: 2 }; var b = { PATTERN000: 0, PATTERN001: 1, PATTERN010: 2, PATTERN011: 3, PATTERN100: 4, PATTERN101: 5, PATTERN110: 6, PATTERN111: 7 }; var f = function() { var o = [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78], [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98], [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114], [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130], [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146], [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158], [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170]]; var l = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0); var q = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0); var n = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1); var p = {}; var m = function(r) { var s = 0; while (r != 0) { s += 1; r >>>= 1 } return s }; p.getBCHTypeInfo = function(r) { var s = r << 10; while (m(s) - m(l) >= 0) { s ^= (l << (m(s) - m(l))) } return ((r << 10) | s) ^ n }; p.getBCHTypeNumber = function(r) { var s = r << 12; while (m(s) - m(q) >= 0) { s ^= (q << (m(s) - m(q))) } return (r << 12) | s }; p.getPatternPosition = function(r) { return o[r - 1] }; p.getMaskFunction = function(r) { switch (r) { case b.PATTERN000: return function(t, s) { return (t + s) % 2 == 0 }; case b.PATTERN001: return function(t, s) { return t % 2 == 0 }; case b.PATTERN010: return function(t, s) { return s % 3 == 0 }; case b.PATTERN011: return function(t, s) { return (t + s) % 3 == 0 }; case b.PATTERN100: return function(t, s) { return (Math.floor(t / 2) + Math.floor(s / 3)) % 2 == 0 }; case b.PATTERN101: return function(t, s) { return (t * s) % 2 + (t * s) % 3 == 0 }; case b.PATTERN110: return function(t, s) { return ((t * s) % 2 + (t * s) % 3) % 2 == 0 }; case b.PATTERN111: return function(t, s) { return ((t * s) % 3 + (t + s) % 2) % 2 == 0 }; default: throw new Error("bad maskPattern:" + r) } }; p.getErrorCorrectPolynomial = function(s) { var r = c([1], 0); for (var t = 0; t < s; t += 1) { r = r.multiply(c([1, k.gexp(t)], 0)) } return r }; p.getLengthInBits = function(s, r) { if (1 <= r && r < 10) { switch (s) { case h.MODE_NUMBER: return 10; case h.MODE_ALPHA_NUM: return 9; case h.MODE_8BIT_BYTE: return 8; case h.MODE_KANJI: return 8; default: throw new Error("mode:" + s) } } else { if (r < 27) { switch (s) { case h.MODE_NUMBER: return 12; case h.MODE_ALPHA_NUM: re
 首页 >> 艺术学 >> 艺术鉴赏
从字里行间挖掘“隐藏项”
2018年12月28日 09:20 来源:美术报 作者: 字号
关键词:杨凝式;书写;阅读;作品;书法史

内容摘要:如何欣赏一幅经典的书法作品?不外乎:作者介绍、创作背景、作品的点划线条、空间结构、神采意味这几方面。欣赏书法是一件赏心悦目的事,而解读其背后的故事,更仿佛掀开一层神秘的面纱,其中的关系耐人寻味。如颜真卿的经典作品《祭侄文稿》,从作品看,前半段是比较严谨的书写,一字一字排列得非常认真。但是到中段

关键词:杨凝式;书写;阅读;作品;书法史

作者简介:

 

  唐 颜真卿 祭侄文稿(局部) 28.3×75.5cm 行书23行 共234字 中国台北故宫博物院藏

  如何欣赏一幅经典的书法作品?不外乎:作者介绍、创作背景、作品的点划线条、空间结构、神采意味这几方面。欣赏书法是一件赏心悦目的事,而解读其背后的故事,更仿佛掀开一层神秘的面纱,其中的关系耐人寻味。

  如颜真卿的经典作品《祭侄文稿》,从作品看,前半段是比较严谨的书写,一字一字排列得非常认真。但是到中段,开始有一点凌乱,到了末端便完全打破了前面的严谨的状态。这种转变,一方面是章法、自然观念的呈现,另一方面,更是真挚情感的自然流露。这些因素交融在一起,形成多元复杂的关系。

  日前,在宜春学院举行的“《中国书法史:观念和契机》中国·宜春2018国际研讨会”中,几位专家都提出了关于对经典作品的解读。与会专家中,杨涛、龙友、丘新巧等,他们都对一些作品进行了手术式、特别精细地观察。邱振中表示目前的书法界,对形式分析、技法的关注比较多,而对作品的内容、主题、作者等这些细节方面的解读并不明显。

  在细读的方面,龙友非常有兴趣而且又不断有新的发现,他勾摹了《神龙本兰亭序》所有字的边框,发现上面的边缘比较光洁,下面的边缘比较粗糙。从其中,我们能解读出什么问题?

  从书法史的研究方法看,经过细读的方法,会对我们有所启发,而得到的结论往往是在一般的书法史著作里没有的。邱振中举例说到,如对杨凝式(《韭花帖》作者),引用过后代对于杨凝式的评价,可以列出五六条品评,说他的作品雄伟、气势宏大,但这些论词用到别人的作品里也未必不适合。这实际上是古代书法文献里一个很重要的特点:有批评,但是没有视觉的对应。这一直影响着今天的评论,一篇评论文章可以套用到很多人的身上。

  在此次专题中,我们展示两位研究者通过对作品的仔细阅读之后,得到的一些新的观点。

  从经典的剩余中解读艺术

  ■林俊臣

  很多真正的、有内涵的、对人有影响的东西,都不在主要的历史陈述中,而是在历史陈述的剩余里。

  我们在介绍书法作品时,一般会把作品的背景和这件作品与作者之间的关系作说明和解释。作者这个人如何,他的作品就一定是这个样子。但我则是抱着一种怀疑的角度来思考。晚清的刘熙载的《书概》里头提到怀素和张旭的悲喜双用和悲喜双遣。他谈到的就是情绪,内在的感受和书写的关系。他谈张旭的时候是“双用”,这就意味着他的书写和他的喜怒有关系。而怀素则不把这两种情绪带到作品的书写中。

  我们书写是否存在着情感,作品是否存在一种情感,还是说情感是在书写的某个地方可以被说出来。那他们之间的关系是什么?德国的一位音乐美学家汉斯立克也在问同样的问题:音乐是否能够存在情感?我们听音乐,有了情感有了感受,是音乐给我们的,还是我们自己感受到的?我认为,在中国古代的思想里头有一句话很重要,《中庸》提到:喜怒哀乐之未发,谓之中;发而皆中节,谓之和。这个中与和之间的一种关系,也是在谈人的情感。书写一定是“有发”,只是在书写时,在作品的笔墨形质上,从哪里可以看到情绪。这个问题太有意思了。

  颜真卿《祭侄稿》的最后那二三十个字,我大概花了两三千字的文字来解读讨论,得出的结论是:对于书写的笔墨变化,对于观赏者来说,笔墨表现跟情感的关系是辅助作用,而不是承载。如讲话时,高兴时,肢体的语言来强化所说的内容;若讲比较严肃的问题,肢体也会随之改变。笔墨的这种形式感或者是带给你一种情绪生发的触媒,也是在强化对所阅读到的文字内容之感受。

  有一个前提就是,书写的是作者自己创作的内容,尤其是草稿这种较日常的书写,才比较有体会。那我们当代大多数人都不是以毛笔作为日常书写的工具,要回归到用毛笔书写、我手写我心的状态,很难。

  我在此提出一个观念:谈经典,更应该要谈经典的剩余。经典的作品,它是作者书写下来的遗迹,作者留下来的笔墨,它指向着那一个人,指向作者身体的种种动作。但这个遗迹还有很多剩余。很多真正的、有内涵的、对人有影响的东西,都不在主要的历史陈述中,而是在历史陈述的剩余里,必须要重新以一个系统的角度去挖掘,才能够挖掘出,解决我们现在的和未来的人的走向的一种可能性。

  作品的细致研究补充文献资料的不足

  ■龙友

  从图像阅读入手,与文献记载相互参考,可以使书法史研究回归到作品本身,通过作品的细致研究补充文献资料的不足。

  五代至宋初时的书写,其中有一个很重要的人物杨凝式。一直以来,他被认为是唐宋书史的枢纽人物。那么,他为什么会成为枢纽人物?要解决这个问题,除了文献之外,必须求诸于他的存世作品。杨凝式存世作品的数量不多,经过集中、细致的阅读发现,其代表作《韭花帖》最大的一个特征,是它整体上的疏朗,字距非常宽。一直以来的叙述中,都认为这是一种章法,是一种形式上的独创,我却一直不认为这是一种人为的或者是自觉意识引导下的“安排”。后来,通过对吐鲁番的文献及敦煌文献的阅读发现,在唐代,几乎所有的公文都存在一种现象,即字和字之间的距离都特别宽绰,而公文上的署衔却极其紧密,甚至一点空隙都不留。可见这是一种公文的书写形式,一种格套。那为什么杨凝式的《韭花帖》会运用这种格套?我们再细读《韭花帖》的内容,写得非常恭敬,使用了一套完整的敬语体系。从章法到内容,都是对上级或者长辈所使用的文体形式。与此同时,《韭花帖》还露出了一些蛛丝马迹:第一行“昼寝乍兴”几个字,距离还比较紧密,比较正常,当他写到第二行的时候,我猜测他的思维开始发生变化。或许是因为受到了一种恩惠,一种来自长辈或上级的恩惠,作为感谢信,他很快意识到要写得恭敬一些,所以逐渐拉开字距,到后三行,就进入了一种非常稳定的状态,进行了稳定的书写。《夏热帖》里面出现了跟佛教相关的词汇,很可能是写给佛教人士的一封书信。还有他的《神仙起居法》,是从某道士那里抄来的一封道家养生术的秘诀,这也可能是抄传给另一位朋友。杨凝式另外一件作品《新步虚词》,非常明确地表明,是为道教界人士抄写的。结合杨凝式的这些作品,可以看到,他的作品实际上具有非常明显的社交功能。

  从图像阅读入手,与文献记载相互参考,可以使书法史研究回归到作品本身,通过作品的细致研究补充文献资料的不足。杨凝式的《新步虚词》里,另有一些很有意思的细节,比如,其中大多数字都正常书写,但“龙“、“虎”等字却意外地夸张,这也许是一个线索,由此延伸到他的社交和道教之间非常密切的关系,可能是我过度阐释,但也算是拓展了研究的路径。

  这些年我一直在尝试重新阅读《兰亭序》,从“兰亭论辩”开始至今,有许多精彩的讨论和研究。我们作为书法实践者,应该对这件经典作品有更深入、细致的阅读。通过阅读,也确实发现了一些有趣的细节,这些细节,为新问题的提出和讨论提供了契机。作品本身的研究,空间很大,回到作品谈历史,更会凸显文献记载的价值。

  为什么杨凝式会成为枢纽人物?大多是宋代人的功劳,杨凝式的形象及其作品的评价也当归功于宋人,宋代人的书学观念决定了杨凝式的地位。宋代尚意书风的形成和杨凝式的书风之间,并非一贯以来公认的因果关系,它们之间的关系,与整个在书法史的转向都有密切的关联。要想细化其中的问题,单纯的文献考证和历史叙述似乎已经不够。高清的图片阅读,海量的图像资料,提供了新契机。杨凝式的作品虽然存世量不大,但是风格各异,各种风格集中在一个人身上,这是值得注意的。对它们进行细致地比较和分析,再结合文献,或许可以找出重新阐释历史的证据。唐代末期的政治和社会的特殊情形,导致书写谱系的破坏。一方面维系社会稳定的“家法”被破坏;同时,书写风格发展的藩篱也被打破,人们可以自由选择一种合适的书写适应不同的社会需求。与此同时,相对封闭的文化交流,被开放式的寺庙游览及题壁之风所替代,过去只为精英们服务的艺术被市井所接受。这也为杨凝式的深入人心创造了有利条件,他可以通过公共空间向下一个时代的人们展示他的书写。作出这种联想或推断,与作品的细致阅读和比较是分不开的。

作者简介

姓名: 工作单位:

转载请注明来源:中国社会科学网 (责编:胡子轩)
W020180116412817190956.jpg
用户昵称:  (您填写的昵称将出现在评论列表中)  匿名
 验证码 
所有评论仅代表网友意见
0评论 20人参与
最新发表的评论0条,总共0 查看全部评论

今日热点
回到频道首页
QQ图片20180105134100.jpg
jrtt.jpg
wxgzh.jpg
777.jpg
内文页广告3(手机版).jpg

24小时排行

中国社会科学院概况|中国社会科学杂志社简介|关于我们|法律顾问|广告服务|网站声明|联系我们