~cytrogen/blog-public

ref: 88eebf3dfdd8ab819fa1a84e1976a8a75d5af2b6 blog-public/posts/5a85.html -rw-r--r-- 26.3 KiB
88eebf3dCytrogen Deploy 2026-02-19 08:34:27 3 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
<!DOCTYPE html><html lang="zh" data-theme="dark"><head><meta charset="utf-8"><meta name="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>请学会如何读空气吧 · Cytrogen 的个人博客</title><meta name="description" content="Cytrogen2026-02-19T08:33:14.317Z前不久,我写了一篇 文章,讲了我在一个评论区底下发觉到的 Whataboutism。未曾想,这篇文章给我带来的,是一场跟朋友的争吵。"><link rel="icon" href="../favicon.png"><link rel="canonical" href="https://cytrogen.icu/posts/5a85.html"><link rel="webmention" href="https://webmention.io/cytrogen.icu/webmention"><link rel="me" href="https://m.otter.homes/@Cytrogen"><link rel="me" href="https://github.com/cytrogen"><meta name="fediverse:creator" content="@Cytrogen@m.otter.homes"><link rel="preload" href="../fonts/opensans-regular-latin.woff2" as="font" type="font/woff2" crossorigin="anonymous"><style>@font-face {
  font-family: 'Open Sans';
  src: url('../fonts/opensans-regular-latin.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
  size-adjust: 107%;
  ascent-override: 97%;
  descent-override: 25%;
  line-gap-override: 0%;
}
</style><script>(function() {
  try {
    // 优先级:用户选择 > 系统偏好 > 默认浅色
    const saved = localStorage.getItem('theme');
    const theme = saved || 
      (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
    
    document.documentElement.setAttribute('data-theme', theme);
    document.documentElement.style.colorScheme = theme;
  } catch (error) {
    // 失败时使用默认主题,不阻塞渲染
    document.documentElement.setAttribute('data-theme', 'light');
  }
})();
</script><link rel="stylesheet" href="../css/ares.css"><script data-netlify-skip-bundle="true">(function() {
  document.addEventListener('DOMContentLoaded', function() {
    const theme = document.documentElement.getAttribute('data-theme');
    const pageWrapper = document.getElementById('page-wrapper');
    if (pageWrapper && theme) {
      pageWrapper.setAttribute('data-theme', theme);
    }
  });
})();

</script><!-- hexo injector head_end start -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-math@4.0.0/dist/style.css">
<!-- hexo injector head_end end --><meta name="generator" content="Hexo 8.1.1"><link rel="alternate" href="atom.xml" title="Cytrogen 的个人博客" type="application/atom+xml">
</head><body><div id="page-wrapper"><a class="skip-link" href="#main-content">跳到主要内容</a><div class="wrap"><header><a class="logo-link" href="../index.html"><img src="../favicon.png" alt="logo"></a><div class="h-card visually-hidden"><img class="u-photo" src="https://cytrogen.icu/favicon.png" alt="Cytrogen"><a class="p-name u-url u-uid" href="https://cytrogen.icu">Cytrogen</a><p class="p-note">Cytrogen 的个人博客,Cytrogen's Blog</p><a class="u-url" rel="me noopener" target="_blank" href="https://m.otter.homes/@Cytrogen">Mastodon</a><a class="u-url" rel="me noopener" target="_blank" href="https://github.com/cytrogen">GitHub</a></div><nav class="site-nav"><div class="nav-main"><div class="nav-primary"><ul class="nav-list hidden-mobile"><li class="nav-item"><a class="nav-link" href="../index.html">首页</a></li></ul><div class="nav-tools"><div class="language-menu"><button class="language-toggle" type="button"><svg class="icon icon-globe" width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true" focusable="false"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm7.5-6.923c-.67.204-1.335.82-1.887 1.855A7.97 7.97 0 0 0 5.145 4H7.5V1.077zM4.09 4a9.267 9.267 0 0 1 .64-1.539 6.7 6.7 0 0 1 .597-.933A7.025 7.025 0 0 0 2.255 4H4.09zm-.582 3.5c.03-.877.138-1.718.312-2.5H1.674a6.958 6.958 0 0 0-.656 2.5h2.49zM4.847 5a12.5 12.5 0 0 0-.338 2.5H7.5V5H4.847zM8.5 5v2.5h2.99a12.495 12.495 0 0 0-.337-2.5H8.5zM4.51 8.5a12.5 12.5 0 0 0 .337 2.5H7.5V8.5H4.51zm3.99 0V11h2.653c.187-.765.306-1.608.338-2.5H8.5zM5.145 12c.138.386.295.744.468 1.068.552 1.035 1.218 1.65 1.887 1.855V12H5.145zm.182 2.472a6.696 6.696 0 0 1-.597-.933A9.268 9.268 0 0 1 4.09 12H2.255a7.024 7.024 0 0 0 3.072 2.472zM3.82 11a13.652 13.652 0 0 1-.312-2.5h-2.49c.062.89.291 1.733.656 2.5H3.82zm6.853 3.472A7.024 7.024 0 0 0 13.745 12H11.91a9.27 9.27 0 0 1-.64 1.539 6.688 6.688 0 0 1-.597.933zM8.5 12v2.923c.67-.204 1.335-.82 1.887-1.855A7.97 7.97 0 0 0 10.855 12H8.5zm3.68-1h2.146c.365-.767.594-1.61.656-2.5h-2.49a13.65 13.65 0 0 1-.312 2.5zm2.802-3.5a6.959 6.959 0 0 0-.656-2.5H12.18c.174.782.282 1.623.312 2.5h2.49zM11.27 2.461c.247.464.462.98.64 1.539h1.835a7.024 7.024 0 0 0-3.072-2.472c.218.284.418.598.597.933zM10.855 4a7.966 7.966 0 0 0-.468-1.068C9.835 1.897 9.17 1.282 8.5 1.077V4h2.355z"></path></svg><span>中文</span></button><div class="language-dropdown"></div></div></div><div class="nav-controls"><div class="more-menu hidden-mobile"><button class="more-toggle" type="button"><span>更多</span><svg class="icon icon-chevron-down" width="12" height="12" viewBox="0 0 12 12" fill="currentColor" aria-hidden="true" focusable="false"><path d="M6 8.825c-.2 0-.4-.1-.5-.2l-3.3-3.3c-.3-.3-.3-.8 0-1.1s.8-.3 1.1 0l2.7 2.7 2.7-2.7c.3-.3.8-.3 1.1 0s.3.8 0 1.1l-3.3 3.3c-.1.1-.3.2-.5.2z"></path></svg></button><div class="more-dropdown"><ul class="dropdown-list"><li class="dropdown-item"><a class="nav-link" href="../archives/index.html">归档</a></li><li class="dropdown-item"><a class="nav-link" href="../categories/index.html">分类</a></li><li class="dropdown-item"><a class="nav-link" href="../tags/index.html">标签</a></li><li class="dropdown-item"><a class="nav-link" href="../about/index.html">关于</a></li><li class="dropdown-item"><a class="nav-link" href="../sitemap/index.html">领地地图</a></li></ul></div></div><div class="theme-switcher"><button class="theme-toggle" type="button" role="switch" aria-pressed="false" aria-label="切换主题"><div class="theme-icon moon-icon"><svg class="icon icon-moon" width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true" focusable="false"><path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"></path></svg></div><div class="theme-icon sun-icon"><svg class="icon icon-sun" width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true" focusable="false"><path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z"></path></svg></div></button></div><details class="mobile-menu-details hidden-desktop"><summary class="hamburger-menu" aria-label="nav.menu"><svg class="icon icon-bars" width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true" focusable="false"><path d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"></path></svg><span class="menu-text">nav.menu</span></summary><div class="mobile-menu-dropdown"><ul class="mobile-nav-list"><li class="mobile-nav-item"><a class="mobile-nav-link" href="../index.html">首页</a></li><li class="mobile-nav-item"><a class="mobile-nav-link" href="../archives/index.html">归档</a></li><li class="mobile-nav-item"><a class="mobile-nav-link" href="../categories/index.html">分类</a></li><li class="mobile-nav-item"><a class="mobile-nav-link" href="../tags/index.html">标签</a></li><li class="mobile-nav-item"><a class="mobile-nav-link" href="../about/index.html">关于</a></li><li class="mobile-nav-item"><a class="mobile-nav-link" href="../sitemap/index.html">领地地图</a></li></ul></div></details></div></div></div></nav></header><main class="container" id="main-content" tabindex="-1"><div class="post"><article class="post-block h-entry"><div class="post-meta p-author h-card visually-hidden"><img class="author-avatar u-photo" src="../favicon.png" alt="Cytrogen"><span class="p-name">Cytrogen</span><a class="u-url" href="https://cytrogen.icu">https://cytrogen.icu</a></div><a class="post-permalink u-url u-uid visually-hidden" href="https://cytrogen.icu/posts/5a85.html">永久链接</a><div class="p-summary visually-hidden"><div class="self-reply-content h-entry"><div class="p-author h-card" style="position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden;"><img class="u-photo" src="https://cytrogen.icu/favicon.png" alt="Cytrogen"><a class="p-name u-url" href="https://cytrogen.icu">Cytrogen</a></div><time class="dt-published" style="position: absolute; left: -9999px;" datetime="2026-02-19T08:33:14.317Z">2026-02-19T08:33:14.317Z</time><div class="e-content"><p>前不久,我写了一篇 <a href="https://cytrogen.icu/posts/dfa8.HTML">文章</a>,讲了我在一个评论区底下发觉到的 Whataboutism。未曾想,这篇文章给我带来的,是一场跟朋友的争吵。</p></div></div></div><div class="visually-hidden"><a class="p-category" href="../categories/%E4%B8%AA%E4%BA%BA%E9%9A%8F%E6%83%B3/">个人随想</a><a class="p-category" href="../tags/%E4%BA%92%E8%81%94%E7%BD%91/">互联网</a><a class="p-category" href="../tags/%E9%80%BB%E8%BE%91%E5%AD%A6/">逻辑学</a><a class="p-category" href="../tags/%E5%BF%83%E7%90%86%E5%AD%A6/">心理学</a><a class="p-category" href="../tags/%E7%A4%BE%E4%BC%9A%E5%AD%A6/">社会学</a></div><h1 class="post-title p-name">请学会如何读空气吧</h1><div class="post-info"><time class="post-date dt-published" datetime="2025-12-01T22:44:03.000Z">12/1/2025</time><time class="dt-updated visually-hidden" datetime="2026-02-09T17:16:55.549Z"></time></div><div class="post-content e-content"><html><head></head><body><div class="self-reply-content h-entry"><div class="p-author h-card" style="position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden;"><img class="u-photo" src="https://cytrogen.icu/favicon.png" alt="Cytrogen"><a class="p-name u-url" href="https://cytrogen.icu">Cytrogen</a></div><time class="dt-published" style="position: absolute; left: -9999px;" datetime="2026-02-19T08:33:14.317Z">2026-02-19T08:33:14.317Z</time><div class="e-content"><p>前不久,我写了一篇 <a href="https://cytrogen.icu/posts/dfa8.html">文章</a>,讲了我在一个评论区底下发觉到的 Whataboutism。未曾想,这篇文章给我带来的,是一场跟朋友的争吵。</p>
<span id="more"></span>
<p>我的朋友阅读了那篇文章的草稿(和实际发出来的内容大差不差),并提出了这些让他反感的点:</p>
<ol>
<li>Whataboutism 这个例子用得不好,两者明明有关联性</li>
<li>评论区说的没有问题,中国的作业就是比美国的作业多</li>
<li>发布在网上的东西被人骂了活该</li>
<li>无论是发帖子的人、发评论的人,还是写文章的我,全都是事逼;<em>小题大做,闲得慌</em></li>
</ol>
<p>我来一一说说。</p>
</div></div>
<h2 id="一-语境错位"><a class="markdownIt-Anchor" href="#一-语境错位"></a> 一、语境错位</h2>
<p>Whataboutism 原本是一种政治宣传技巧,但是我在这里的使用方式更多是将其视为一种逻辑谬论,直白点理解就是「因为有更糟糕的事情 B 在,所以糟糕的事情 A 就不算问题。」</p>
<p>朋友会认为这个例子不好,是因为他觉得「美国的作业」和「中国的作业」都是「作业」,是有关联性的,那么评论提及「中国的作业」就不涉及到 Whataboutism。</p>
<p>我们的核心分歧在于,「关联性」到底由什么决定?</p>
<p>朋友的逻辑是,只要主体属于同一类别(「作业」),且事实属实(「中国的作业确实比美国的作业多」),那么在这个帖子下提及到中国的作业就是合理的比较,不是谬误。</p>
<p>似乎很有道理。</p>
<p>但是我们在讨论一件事的时候,<em>说出来的内容</em> 其实并没有 <em>说这个内容的目的</em> 重要。原帖主发帖的目的是什么?是寻求安慰、共情和建议。这些提及到国内作业的评论做的又是什么?首先是预设原帖主的目的是否认国内的作业没有美国的多,其次是靠比烂彰显优越感。这些评论是否有帮助到原帖主?没有,反而更糟糕了,因为它们否认了原帖主抱怨的权利。</p>
<p>如果提及国内作业的目的是为了消解原帖主的情绪或者否定他的问题,那么即使他们说的是事实,他们依然涉及到了 Whataboutism 或者比烂。</p>
<p>原帖的语境是情感宣泄,而评论却把语境强制降维成了事实比对。但是问题在于,<em>到底谁问你们了?有任何人说中国的作业不多吗?</em></p>
<h2 id="二-真理的功能性"><a class="markdownIt-Anchor" href="#二-真理的功能性"></a> 二、真理的功能性</h2>
<div class="self-reply-content h-entry"><div class="p-author h-card" style="position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden;"><img class="u-photo" src="https://cytrogen.icu/favicon.png" alt="Cytrogen"><a class="p-name u-url" href="https://cytrogen.icu">Cytrogen</a></div><time class="dt-published" style="position: absolute; left: -9999px;" datetime="2026-02-19T08:33:14.321Z">2026-02-19T08:33:14.321Z</time><div class="e-content"><p>朋友以及评论区的那些人的防御逻辑在于,他们说的是事实。「中国的作业就是多」这句话因为在事实层面是真的,所以他们也认为自己在对话层面是合理的。</p>
<p>但是人类之间的对话绝对不是只要 <a href="https://cytrogen.icu/posts/d4e5.html">说了事实便可以攻击他人</a></p>
<p>事实有两种用法:一是解决问题,例如你提醒他人外面下雨了,记得带伞;二是剥夺权利,骂所有说食物不好吃的人「非洲还有人饿死呢,你要什么好抱怨的」。当一个人在寻求情感支持的时候,去谈论谁更惨,本质是一种冷漠和对他人痛苦的刻意忽视。</p>
<p>如果按照这个逻辑下去,那么除了那个全宇宙最惨的人,剩下 70 亿人都没有资格难过了。这显而易见是荒谬的。</p>
<p><strong>这些评论拿出的「事实」,不是为了讨论,而是为了封你的嘴。</strong> 这就是我想说的功能性。目的真的是为了陈述事实吗?那怎么看都不是。</p>
<p>不过我认为,朋友之所以无法理解我说的,最主要还是「拒绝看见情绪价值」这个维度。我后面会提到。</p>
</div></div>
<h2 id="三-消极放任"><a class="markdownIt-Anchor" href="#三-消极放任"></a> 三、消极放任</h2>
<p>到这个时候,朋友明显开始出现了情绪化的状况,不过他依然想要和我辩论。他认为,发到互联网上的东西就是会被他人看到、批判,甚至辱骂。这是再正常不过的事情了,因为互联网无时无刻都充斥着攻击和辱骂。<em>不过是一个这么小的一件事,你还专门写个文章说,你一天天难道没有事情做吗?</em></p>
<p>这里的逻辑可以简单梳理为,既然一件事情已经是这样了,那么我想要去改变、批判它,就是矫情和多余。这也是另一种形式的虚无主义:<em>反正人都要死,何必这么拼命?</em> 这个事情是大事吗?当然不是,它确实是一件小到不能再小的事情。</p>
<p>但小事不代表没错。我发现了问题,我指了出来,你指责我是什么意思?</p>
<p>这种「消极放任」才是最可怕的。因为它 <strong>不仅承认了恶的存在,还进一步把「指出恶」定义为一种错误</strong>。这不单单是虚无,也是一种对现状的共谋。用「大家都被骂」来合理化网络暴力,并试图以此让不满者闭嘴时,他其实已经成为了那个糟糕环境的维护者。所谓的「正常」,也不过是习惯了麻木之后的自我催眠罢了。</p>
<p>我肯定不认为写一篇博客就能彻底净化互联网,但我至少想要拒绝加入这种麻木的合唱。连指出「这不对」的勇气都被嘲笑,那才是无可救药。</p>
<h2 id="四-充满攻击性的理中客"><a class="markdownIt-Anchor" href="#四-充满攻击性的理中客"></a> 四、充满攻击性的理中客</h2>
<p>到最后,他终于把自己内心所想的事情说了出来:他觉得我们三方都是事逼。</p>
<p>当他这么说的时候,我忽然理解了我们之前辩论的实质。那些争论或许都只是表象,核心驱动力可能并非源于逻辑,而是源于一种深刻的情感不认同 —— 他是一个厌恶互联网的人,他讨厌我写博客、讨厌我上网、讨厌我交网友……<em> 真烦!跟你有什么关系!</em> 总之,他觉得任何在网上发布这些「私人想法」的人,都有罪,都是在无事生非。</p>
<p>于是,一场本该关于公共讨论规则的辩论,最终坍缩为一场人身攻击。我意识到,他或许只想批判我的姿态,所以我也不乐意再跟他讲什么道理了。我说,「你的这些想法真的很烦很坏。」烦是因为这并不是他第一次向我传达这些具有攻击性的想法(而我最讨厌别人满嘴只剩自己了);坏是因为 <strong>他一边劝我闭嘴,一边自己又闭不上嘴</strong>。尽管他说了这都是观点、没有想要纠正我的意思,但一些话并不会因为你的事后解释就变了性质。</p>
<p>或许网络上那些不由分说的「比烂」和「反问」,其内核也是如此:拒绝进入语境、拒绝理解情感,只想用最简单粗暴的方式完成居高临下评判的姿态。这种姿态不仅隔绝了理解,也杀死了沟通。如果有什么是可以打破这层傲慢的厚壁的话,或者就只有这简单的几个字:<strong>请学会如何读空气吧 —— 因为在冰冷的逻辑和事实之外,那里才是我们要共同呼吸的地方。</strong></p>
</body></html></div></article></div></main><footer><div class="paginator"><a class="prev" href="e955.html">上一篇</a><a class="next" href="31df.html">下一篇</a></div><!-- Webmention 显示区域--><div class="webmention-section webmention-empty" data-page-url="posts/5a85.html" data-full-url="https://cytrogen.icu/posts/5a85.html" data-mode="static">
              <h3 class="webmention-title">Webmentions (<span class="webmention-count">0</span>)</h3>
              <div class="webmention-list"></div>
              <span>暂无 Webmentions</span>
            </div><div class="copyright"><p class="footer-links"><a href="../friends/index.html">友链</a><span class="footer-separator"> ·</span><a href="../links/index.html">邻邦</a><span class="footer-separator"> ·</span><a href="../contact/index.html">联络</a><span class="footer-separator"> ·</span><a href="../colophon/index.html">营造记</a><span class="footer-separator"> ·</span><a href="../atom.xml">RSS订阅</a></p><p>© 2025 - 2026 <a href="https://cytrogen.icu">Cytrogen</a>, powered by <a href="https://hexo.io/" target="_blank">Hexo</a> and <a href="https://github.com/cytrogen/hexo-theme-ares" target="_blank">hexo-theme-ares</a>.</p><p><a href="https://blogscn.fun" target="_blank" rel="noopener">BLOGS·CN</a></p></div></footer></div></div><a class="back-to-top" href="#top" aria-label="返回顶部"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path d="M3.293 9.707a1 1 0 010-1.414L9.586 2a2 2 0 012.828 0l6.293 6.293a1 1 0 01-1.414 1.414L11 3.414V17a1 1 0 11-2 0V3.414L2.707 9.707a1 1 0 01-1.414 0z"></path></svg></a><script>document.addEventListener('DOMContentLoaded', function() {
  const codeBlocks = document.querySelectorAll('figure.highlight');
  
  codeBlocks.forEach(block => {
    let caption = block.querySelector('figcaption');
    if (!caption) {
      caption = document.createElement('figcaption');
      block.insertBefore(caption, block.firstChild);
    }

    const info = document.createElement('div');
    info.className = 'info';
    
    const filename = caption.querySelector('span');
    if (filename) {
      filename.className = 'filename';
      info.appendChild(filename);
    }
    
    const lang = block.className.split(' ')[1];
    if (lang) {
      const langSpan = document.createElement('span');
      langSpan.className = 'lang-name';
      langSpan.textContent = lang;
      info.appendChild(langSpan);
    }

    const sourceLink = caption.querySelector('a');
    if (sourceLink) {
      sourceLink.className = 'source-link';
      info.appendChild(sourceLink);
    }

    const actions = document.createElement('div');
    actions.className = 'actions';

    const codeHeight = block.scrollHeight;
    const threshold = 300;

    if (codeHeight > threshold) {
      block.classList.add('folded');
      
      const toggleBtn = document.createElement('button');
      toggleBtn.textContent = '展开';
      toggleBtn.addEventListener('click', () => {
        block.classList.toggle('folded');
        toggleBtn.textContent = block.classList.contains('folded') ? '展开' : '折叠';
      });
      actions.appendChild(toggleBtn);
    }

    const copyBtn = document.createElement('button');
    copyBtn.textContent = '复制';
    copyBtn.addEventListener('click', async () => {
      const codeLines = block.querySelectorAll('.code .line');
      const code = Array.from(codeLines)
        .map(line => line.textContent)
        .join('\n')
        .replace(/\n\n/g, '\n');
      
      try {
        await navigator.clipboard.writeText(code);
        copyBtn.textContent = '已复制';
        copyBtn.classList.add('copied');
        
        setTimeout(() => {
          copyBtn.textContent = '复制';
          copyBtn.classList.remove('copied');
        }, 3000);
      } catch (err) {
        console.error('复制失败:', err);
        copyBtn.textContent = '复制失败';
        
        setTimeout(() => {
          copyBtn.textContent = '复制';
        }, 3000);
      }
    });
    actions.appendChild(copyBtn);

    caption.innerHTML = '';
    caption.appendChild(info);
    caption.appendChild(actions);

    const markedLines = block.getAttribute('data-marked-lines');
    if (markedLines) {
      const lines = markedLines.split(',');
      lines.forEach(range => {
        if (range.includes('-')) {
          const [start, end] = range.split('-').map(Number);
          for (let i = start; i <= end; i++) {
            const line = block.querySelector(`.line-${i}`);
            if (line) line.classList.add('marked');
          }
        } else {
          const line = block.querySelector(`.line-${range}`);
          if (line) line.classList.add('marked');
        }
      });
    }
  });
});</script><script async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" id="MathJax-script"></script><script>(function() {
  document.addEventListener('DOMContentLoaded', function() {
    const themeToggle = document.querySelector('.theme-toggle');
    
    if (!themeToggle) return;
    
    const getCurrentTheme = () => {
      return document.documentElement.getAttribute('data-theme') || 'light';
    };
    
    const updateUI = (theme) => {
      const isDark = theme === 'dark';
      themeToggle.setAttribute('aria-pressed', isDark.toString());
    };
    
    const setTheme = (theme) => {
      document.documentElement.setAttribute('data-theme', theme);
      document.documentElement.style.colorScheme = theme;
      
      const pageWrapper = document.getElementById('page-wrapper');
      if (pageWrapper) {
        pageWrapper.setAttribute('data-theme', theme);
      }
      
      // Find and remove the temporary anti-flicker style tag if it exists.
      // This ensures the main stylesheet takes full control after the initial load.
      const antiFlickerStyle = document.getElementById('anti-flicker-style');
      if (antiFlickerStyle) {
        antiFlickerStyle.remove();
      }
      
      localStorage.setItem('theme', theme);
      updateUI(theme);
    };
    
    const toggleTheme = () => {
      const current = getCurrentTheme();
      const newTheme = current === 'light' ? 'dark' : 'light';
      setTheme(newTheme);
    };
    
    updateUI(getCurrentTheme());
    
    themeToggle.addEventListener('click', toggleTheme);
    
    if (window.matchMedia) {
      const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
      mediaQuery.addEventListener('change', function(e) {
        if (!localStorage.getItem('theme')) {
          const theme = e.matches ? 'dark' : 'light';
          setTheme(theme);
        }
      });
    }
  });
})();
</script><script src="../js/details-toggle.js" defer></script><script>(function() {
  document.addEventListener('DOMContentLoaded', function() {
    const backToTopBtn = document.querySelector('.back-to-top');
    
    if (!backToTopBtn) return;
    
    const toggleButtonVisibility = () => {
      const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
      const shouldShow = scrollTop > 200;
      
      if (shouldShow) {
        backToTopBtn.classList.add('is-visible');
      } else {
        backToTopBtn.classList.remove('is-visible');
      }
    };
    
    let ticking = false;
    const handleScroll = () => {
      if (!ticking) {
        requestAnimationFrame(() => {
          toggleButtonVisibility();
          ticking = false;
        });
        ticking = true;
      }
    };
    
    const scrollToTop = (event) => {
      event.preventDefault();
      window.scrollTo({
        top: 0,
        behavior: 'smooth'
      });
    };
    
    window.addEventListener('scroll', handleScroll);
    backToTopBtn.addEventListener('click', scrollToTop);
    
    toggleButtonVisibility();
  });
})();</script></body></html>