<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>PANOSHU</title>
  <icon>https://www.gravatar.com/avatar/d3a730ec28462f0f85af188ffeda1048</icon>
  <subtitle>panoshu&#39;s blog | fighting!!!</subtitle>
  <link href="https://www.panoshu.top/atom.xml" rel="self"/>
  
  <link href="https://www.panoshu.top/"/>
  <updated>2026-03-21T06:14:35.817Z</updated>
  <id>https://www.panoshu.top/</id>
  
  <author>
    <name>panoshu</name>
    <email>panoshu.hu@outlook.com</email>
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>dev on wsl</title>
    <link href="https://www.panoshu.top/blog/e6ca0b12/"/>
    <id>https://www.panoshu.top/blog/e6ca0b12/</id>
    <published>2024-11-09T16:04:48.000Z</published>
    <updated>2026-03-21T06:14:35.817Z</updated>
    
    <content type="html"><![CDATA[<h2 id="install-wsl">Install WSL</h2><figure data-type="image"><img src="https://gcore.jsdelivr.net/gh/panoshu/blog-cdn@main/images/20241110/2600ba0917354472813029c75c944559.jpg" alt=""><figcaption>wsl</figcaption></figure><h2 id="wsl-q-amp-a">WSL Q&amp;A</h2><h2 id="wsl-amp-vs-code">WSL &amp; VSCode</h2><h2 id="python-on-wsl">Python on WSL</h2><h2 id="node-on-wsl">Node on WSL</h2><h2 id="make-wsl-linux-kernel">Make WSL Linux Kernel</h2>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;install-wsl&quot;&gt;Install WSL&lt;/h2&gt;
&lt;figure data-type=&quot;image&quot;&gt;&lt;img src=&quot;https://gcore.jsdelivr.net/gh/panoshu/blog-cdn@main/images/2024111</summary>
      
    
    
    
    <category term="技术方法论" scheme="https://www.panoshu.top/blog/categories/%E6%8A%80%E6%9C%AF%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    
    
    <category term="wsl" scheme="https://www.panoshu.top/blog/tags/wsl/"/>
    
  </entry>
  
  <entry>
    <title>如何让你的 VPS / Linux 服务器更安全</title>
    <link href="https://www.panoshu.top/blog/3fc6d94c/"/>
    <id>https://www.panoshu.top/blog/3fc6d94c/</id>
    <published>2024-07-11T12:55:49.000Z</published>
    <updated>2026-03-21T06:14:35.817Z</updated>
    
    <content type="html"><![CDATA[<h2 id="deng-lu-she-zhi">登录设置</h2><p>运行 <code>/etc/pam.d/allowuser</code> 创建登录用户白名单，文件里面写入允许登录的用户名</p><p>root 用户登陆，运行命令 <code>vim /etc/pam.d/login</code></p><p>在文件顶部添加下列内容：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">auth  required  pam_listfile.so item=user sense=allow file=/etc/pam.d/allowuser onerr=succeed</span><br><span class="line">auth  required  pam_faillock.so deny=5    unlock_time=600 even_deny_root root_unlock_time=1200 audit silent</span><br></pre></td></tr></tbody></table></figure><p>root 用户登陆，运行命令 <code>vi /etc/pam.d/sshd</code></p><p>在文件顶部添加下列内容：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">auth  required  pam_listfile.so item=user sense=allow file=/etc/pam.d/allowuser onerr=succeed</span><br><span class="line">auth  required  pam_faillock.so deny=5    unlock_time=600 even_deny_root root_unlock_time=1200 audit silent</span><br></pre></td></tr></tbody></table></figure><h2 id="ssh-she-zhi">ssh 设置</h2><p>root 用户登陆，运行命令 <code>vi /etc/ssh/sshd_config.d/security.conf</code> 添加以下内容</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">X11Forwarding no</span><br><span class="line">PermitRootLogin no</span><br><span class="line">Port &lt;替换成你的端口&gt;</span><br><span class="line"></span><br><span class="line">MaxAuthTries 3</span><br><span class="line">DenyUsers root</span><br><span class="line">AllowUsers &lt;替换成你的用户名&gt;</span><br><span class="line">Protocol 2</span><br><span class="line">ClientAliveInterval 120</span><br><span class="line">ClientAliveCountMax 5</span><br></pre></td></tr></tbody></table></figure>]]></content>
    
    
    <summary type="html">VPS / Linux 服务器的安全配置</summary>
    
    
    
    <category term="解决方案与经验分享" scheme="https://www.panoshu.top/blog/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%B8%8E%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="VPS" scheme="https://www.panoshu.top/blog/tags/VPS/"/>
    
    <category term="Linux服务器" scheme="https://www.panoshu.top/blog/tags/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>使用 rsync 同步服务器文件</title>
    <link href="https://www.panoshu.top/blog/3d028861/"/>
    <id>https://www.panoshu.top/blog/3d028861/</id>
    <published>2024-03-01T09:27:18.000Z</published>
    <updated>2026-03-21T06:14:35.817Z</updated>
    
    <content type="html"><![CDATA[<p>rsync is a file transfer program for Unix systems. rsync uses the “rsync algorithm” which provides a very fast method for bringing remote files into sync. It does this by sending just the differences in the files across the link, without requiring that both sets of files are present at one of the ends of the link beforehand.<br>Some features of rsync include</p><span id="more"></span><ul><li>can update whole directory trees and filesystems</li><li>optionally preserves symbolic links, hard links, file ownership, permissions, devices and times</li><li>requires no special privileges to install</li><li>internal pipelining reduces latency for multiple files</li><li>can use rsh, ssh or direct sockets as the transport</li><li>supports anonymous rsync which is ideal for mirroring</li></ul><h2 id="server">Server</h2><p>rsyncd.conf</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">usechroot</span> <span class="string">=</span> <span class="literal">no</span></span><br><span class="line"><span class="string">max</span> <span class="string">connections</span> <span class="string">=</span> <span class="number">20</span></span><br><span class="line"><span class="string">strict</span> <span class="string">mode</span> <span class="string">=</span> <span class="literal">yes</span></span><br><span class="line"><span class="string">port</span> <span class="string">=</span> <span class="number">18730</span></span><br><span class="line"><span class="string">timeout</span> <span class="string">=</span> <span class="number">600</span></span><br><span class="line"><span class="string">transfer</span> <span class="string">logging</span> <span class="string">=</span> <span class="literal">yes</span></span><br><span class="line"><span class="string">log</span> <span class="string">format</span> <span class="string">=</span> <span class="string">%t</span> <span class="string">%a</span> <span class="string">%m</span> <span class="string">%f</span> <span class="string">%b</span></span><br><span class="line"><span class="string">syslog</span> <span class="string">facility</span> <span class="string">=</span> <span class="string">local3</span></span><br><span class="line"><span class="string">pid</span> <span class="string">file</span> <span class="string">=</span> <span class="string">/path-of-rsync/run/rsyncd.pid</span></span><br><span class="line"><span class="string">lock</span> <span class="string">file</span> <span class="string">=</span> <span class="string">/path-of-rsync/run/rsync.lock</span></span><br><span class="line"><span class="string">log</span> <span class="string">file</span> <span class="string">=</span> <span class="string">/path-of-rsync/log/rsyncd.log</span></span><br><span class="line">[<span class="string">static</span>]</span><br><span class="line"><span class="string">path</span> <span class="string">=</span> <span class="string">/path-to-upload/</span></span><br><span class="line"><span class="string">ignore</span> <span class="string">errors</span></span><br><span class="line"><span class="string">read</span> <span class="string">only</span> <span class="string">=</span> <span class="literal">no</span></span><br><span class="line"><span class="string">write</span> <span class="string">only</span> <span class="string">=</span> <span class="literal">no</span></span><br><span class="line"><span class="string">list</span> <span class="string">=</span> <span class="literal">no</span></span><br><span class="line"><span class="string">hosts</span> <span class="string">allow</span> <span class="string">=</span> <span class="string">xx.xx.xx.xx</span></span><br><span class="line"><span class="string">hosts</span> <span class="string">deny</span> <span class="string">=</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span><span class="string">/32</span></span><br><span class="line"><span class="string">auth</span> <span class="string">users</span> <span class="string">=</span> <span class="string">rsync_static</span></span><br><span class="line"><span class="string">secrets</span> <span class="string">file</span> <span class="string">=</span> <span class="string">/path-of-rsync/config/rsyncd.secrets</span></span><br></pre></td></tr></tbody></table></figure><p>rsyncd.secrets</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">user:pass</span></span><br></pre></td></tr></tbody></table></figure><p>start_rsync.sh</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line"></span><br><span class="line">rsync --daemon --config /path-of-rsync/config/rsyncd.conf</span><br></pre></td></tr></tbody></table></figure><p>stop_rsync.sh</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line"></span><br><span class="line">pkill rsync</span><br></pre></td></tr></tbody></table></figure><h2 id="client">Client</h2><p>rsyncd.secrets</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">pass</span></span><br></pre></td></tr></tbody></table></figure><p>rsync_get.sh</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line"></span><br><span class="line">RSYNC_HOME=/path-of-rsync</span><br><span class="line">TARGET_PATH=/path-to-download</span><br><span class="line"></span><br><span class="line">RSYNC_USER=username</span><br><span class="line"></span><br><span class="line">REMOTE_IP=29.149.146.205</span><br><span class="line">REMOTE_PORT=18730</span><br><span class="line"></span><br><span class="line">date | tee -a ${RSYNC_HOME}/log/rsync_get.log</span><br><span class="line">echo "------------------------" &gt;&gt; ${RSYNC_HOME}/log/rsync_get.log</span><br><span class="line">echo  ""                        &gt;&gt; ${RSYNC_HOME}/log/rsync_get.log</span><br><span class="line"></span><br><span class="line">rsync -avh --delete --progress --password-file=${RSYNC_HOME}/config/rsyncd.secrets rsync://${RSYNC_USER}@${REMOTE_IP}:${REMOTE_PORT}/static ${TARGET_PATH} | tee -a ${RSYNC_HOME}/log/rsync_get.log</span><br><span class="line"></span><br><span class="line">echo -e "\n"                    &gt;&gt; ${RSYNC_HOME}/log/rsync_get.log</span><br></pre></td></tr></tbody></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;rsync is a file transfer program for Unix systems. rsync uses the “rsync algorithm” which provides a very fast method for bringing remote files into sync. It does this by sending just the differences in the files across the link, without requiring that both sets of files are present at one of the ends of the link beforehand.&lt;br&gt;
Some features of rsync include&lt;/p&gt;</summary>
    
    
    
    <category term="解决方案与经验分享" scheme="https://www.panoshu.top/blog/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%B8%8E%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="rsync" scheme="https://www.panoshu.top/blog/tags/rsync/"/>
    
    <category term="tools" scheme="https://www.panoshu.top/blog/tags/tools/"/>
    
  </entry>
  
  <entry>
    <title>通过 VBA 宏实现 Excel 工时自动统计</title>
    <link href="https://www.panoshu.top/blog/ef88e8e2/"/>
    <id>https://www.panoshu.top/blog/ef88e8e2/</id>
    <published>2023-02-21T00:24:27.000Z</published>
    <updated>2026-03-21T06:14:35.817Z</updated>
    
    <content type="html"><![CDATA[<div class="tag-plugin colorful note" color="yellow"><div class="body"><p>数学困难的三金老师在工作中遇到一个费时费力的大困难场景：需要定期统计工作事项的投入时长，此事项具有以下特点：</p><ul><li>需要在固定的模板中填写，模板见问题背景小节的图示</li><li>每项工作需要按日期分行，每行会有多个时间段，这些时间段会集中在一个单元格内</li><li>最后需要按天统计所有事项的时长（以分钟为单位）</li></ul></div></div><span id="more"></span><h2 id="wen-ti-bei-jing">问题背景</h2><figure data-type="image"><img src="https://gcore.jsdelivr.net/gh/panoshu/blog-cdn@main/site/blog/images/2023-02-21_22-02-04.png" alt=""><figcaption>工时统计模板</figcaption></figure><h2 id="wen-ti-fen-xi">问题分析</h2><p>不难看出，这实际上就是一个简单的时间计算问题，解决过程分解如下：</p><ul><li>循环读取每一行，每个循环内做如下事情：<ul><li>获取时间段</li><li>计算每个时间段的时长</li><li>计算此行累计时长，写入汇总单元格</li></ul></li><li>对所有行的时长进行累加，得到总计时长，写入汇总单元格</li></ul><p>如果每行只有一个时间段，那么用 Excel 的公式可以很简单的实现目的；但这个问题中，一个单元格内有多个时间段，需要先对时间段进行分离，对上述过程再进行分解：</p><ul><li>循环读取每一行，每个循环内做如下事情：<ul><li>在每个单元格内进行如下操作：<ul><li>循环读取时间段</li><li>计算每个时间段的时长</li></ul></li><li>计算此单元格累计时长，即为此行累计时长</li><li>将累计时长写入此行的汇总单元格</li></ul></li><li>对所有行的时长进行累加，得到总计时长，写入汇总单元格</li></ul><p>这使用公式难以实现；考虑到在 Excel 中，简单起见使用 VBA 宏实现。</p><h2 id="dai-ma">代码</h2><p>根据上一节的分析思路，需要实现几个子功能：</p><ul><li><code>read_cell</code> 读取单元格内容，输出时间段数据，可以用数组保存</li><li><code>time_calc</code> 读取数组中的时间段数据，分别计算时长并累计</li><li><code>write_result</code> 写入数据到单元格</li><li><code>sum_result</code> 计算总计时长</li></ul><p>2023/3/6 23:07 时间关系，今天先贴出全部代码，下次再根据功能分解，详细展开写写。</p><figure class="highlight vb"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Sub</span> work_calc()</span><br><span class="line">    <span class="keyword">Dim</span> my_rows <span class="keyword">As</span> <span class="type">Integer</span></span><br><span class="line">    <span class="keyword">Dim</span> my_cols <span class="keyword">As</span> <span class="type">Integer</span></span><br><span class="line">    <span class="keyword">Dim</span> str_temp <span class="keyword">As</span> <span class="type">String</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">Dim</span> read_arr <span class="keyword">As</span> Variant</span><br><span class="line">    <span class="keyword">Dim</span> time_arr <span class="keyword">As</span> Variant</span><br><span class="line">    <span class="keyword">Dim</span> result_arr <span class="keyword">As</span> Variant</span><br><span class="line"></span><br><span class="line">    my_rows = ActiveSheet.Range(<span class="string">"D"</span> &amp; Rows.Count).<span class="keyword">End</span>(xlUp).Row</span><br><span class="line">    my_cols = UsedRange.Columns.Count</span><br><span class="line"></span><br><span class="line">    sum_total = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">For</span> index_row = <span class="number">3</span> <span class="keyword">To</span> my_rows</span><br><span class="line">        <span class="keyword">If</span> Range(<span class="string">"I"</span> &amp; index_row).Value &lt;&gt; <span class="string">""</span> <span class="keyword">Then</span></span><br><span class="line">            str_temp = Range(<span class="string">"I"</span> &amp; index_row).Value</span><br><span class="line"></span><br><span class="line">            read_arr = read_cell(str_temp)</span><br><span class="line"></span><br><span class="line">            result_arr = time_calc(read_arr)</span><br><span class="line"></span><br><span class="line">            Range(<span class="string">"E"</span> &amp; index_row) = sum_result(result_arr)</span><br><span class="line"></span><br><span class="line">            sum_total = sum_total + sum_result(result_arr)</span><br><span class="line">        <span class="keyword">End</span> <span class="keyword">If</span></span><br><span class="line">    <span class="keyword">Next</span></span><br><span class="line"></span><br><span class="line">    Range(<span class="string">"E"</span> &amp; my_rows + <span class="number">1</span>) = sum_total</span><br><span class="line"><span class="keyword">End</span> <span class="keyword">Sub</span></span><br></pre></td></tr></tbody></table></figure><figure class="highlight vb"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Function</span> read_cell(cell_content <span class="keyword">As</span> <span class="type">String</span>) <span class="keyword">As</span> Variant</span><br><span class="line"></span><br><span class="line">    <span class="keyword">Dim</span> var_split <span class="keyword">As</span> Variant</span><br><span class="line"></span><br><span class="line">    <span class="keyword">If</span> InStr(cell_content, Chr(<span class="number">10</span>)) &gt; <span class="number">0</span> <span class="keyword">Then</span></span><br><span class="line">        var_split = Split(cell_content, Chr(<span class="number">10</span>))</span><br><span class="line">    <span class="keyword">Else</span></span><br><span class="line">        var_split = Array(<span class="number">1</span>)</span><br><span class="line">        var_split(<span class="number">0</span>) = cell_content</span><br><span class="line">    <span class="keyword">End</span> <span class="keyword">If</span></span><br><span class="line"></span><br><span class="line">    read_cell = var_split</span><br><span class="line"></span><br><span class="line"><span class="keyword">End</span> <span class="keyword">Function</span></span><br></pre></td></tr></tbody></table></figure><figure class="highlight vb"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Function</span> time_calc(time_arr <span class="keyword">As</span> Variant) <span class="keyword">As</span> Variant</span><br><span class="line">    <span class="keyword">Dim</span> time_split <span class="keyword">As</span> Variant</span><br><span class="line">    <span class="keyword">Dim</span> result() <span class="keyword">As</span> <span class="type">String</span></span><br><span class="line">    k = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">For</span> i = <span class="number">0</span> <span class="keyword">To</span> (UBound(time_arr) - LBound(time_arr))</span><br><span class="line">        time_split = Split(time_arr(i), <span class="string">"-"</span>)</span><br><span class="line">        <span class="keyword">ReDim</span> <span class="keyword">Preserve</span> result(<span class="number">0</span> <span class="keyword">To</span> k)</span><br><span class="line">        result(k) = Abs(DateDiff(<span class="string">"n"</span>, TimeValue(time_split(<span class="number">1</span>)), TimeValue(time_split(<span class="number">0</span>))))</span><br><span class="line">        k = k + <span class="number">1</span></span><br><span class="line">    <span class="keyword">Next</span></span><br><span class="line"></span><br><span class="line">    time_calc = result</span><br><span class="line"></span><br><span class="line"><span class="keyword">End</span> <span class="keyword">Function</span></span><br></pre></td></tr></tbody></table></figure><figure class="highlight vb"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Function</span> write_result(result_arr <span class="keyword">As</span> Variant)</span><br><span class="line">    <span class="keyword">Dim</span> content <span class="keyword">As</span> <span class="type">String</span></span><br><span class="line">    content = <span class="string">""</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">For</span> i = <span class="number">0</span> <span class="keyword">To</span> (UBound(result_arr) - LBound(result_arr))</span><br><span class="line"></span><br><span class="line">        content = content &amp; <span class="string">""</span> &amp; <span class="built_in">CStr</span>(result_arr(i))</span><br><span class="line">        <span class="keyword">If</span> i &lt; (UBound(result_arr) - LBound(result_arr)) <span class="keyword">Then</span></span><br><span class="line">            content = content + Chr(<span class="number">10</span>)</span><br><span class="line">        <span class="keyword">End</span> <span class="keyword">If</span></span><br><span class="line">    <span class="keyword">Next</span></span><br><span class="line"></span><br><span class="line">    write_result = content</span><br><span class="line"></span><br><span class="line"><span class="keyword">End</span> <span class="keyword">Function</span></span><br></pre></td></tr></tbody></table></figure><figure class="highlight vb"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Function</span> sum_result(result_arr <span class="keyword">As</span> Variant)</span><br><span class="line">    sum_temp = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">For</span> i = <span class="number">0</span> <span class="keyword">To</span> (UBound(result_arr) - LBound(result_arr))</span><br><span class="line">        sum_temp = sum_temp + result_arr(i)</span><br><span class="line">    <span class="keyword">Next</span></span><br><span class="line"></span><br><span class="line">    sum_result = sum_temp</span><br><span class="line"></span><br><span class="line"><span class="keyword">End</span> <span class="keyword">Function</span></span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><h2 id="yun-xing-jie-guo">运行结果</h2><figure data-type="image"><img src="https://gcore.jsdelivr.net/gh/panoshu/blog-cdn@main/site/blog/images/202303062317019.png" alt=""><figcaption>结果</figcaption></figure><h2 id="dai-ma-fen-xi">代码分析</h2><p>TODO</p>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;tag-plugin colorful note&quot; color=&quot;yellow&quot;&gt;&lt;div class=&quot;body&quot;&gt;&lt;p&gt;数学困难的三金老师在工作中遇到一个费时费力的大困难场景：需要定期统计工作事项的投入时长，此事项具有以下特点：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;需要在固定的模板中填写，模板见问题背景小节的图示&lt;/li&gt;&lt;li&gt;每项工作需要按日期分行，每行会有多个时间段，这些时间段会集中在一个单元格内&lt;/li&gt;&lt;li&gt;最后需要按天统计所有事项的时长（以分钟为单位）&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;</summary>
    
    
    
    <category term="解决方案与经验分享" scheme="https://www.panoshu.top/blog/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%B8%8E%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="Excel" scheme="https://www.panoshu.top/blog/tags/Excel/"/>
    
    <category term="VBA" scheme="https://www.panoshu.top/blog/tags/VBA/"/>
    
  </entry>
  
  <entry>
    <title>Hexo 博客 Stellar 主题使用 HarmonyOS 鸿蒙字体</title>
    <link href="https://www.panoshu.top/blog/7f3b7e3a/"/>
    <id>https://www.panoshu.top/blog/7f3b7e3a/</id>
    <published>2022-05-31T10:39:33.000Z</published>
    <updated>2026-03-21T06:14:35.817Z</updated>
    
    <content type="html"><![CDATA[<p>前序文章：<br><a href="/blog/2c3f9e38/">Hexo 博客 Stellar 主题使用 KaTex 公式与 Markdown 复杂表格</a></p><h2 id="harmony-os-sans-zi-ti">HarmonyOS Sans 字体</h2><p><a href="https://developer.harmonyos.com/cn/docs/design/des-guides/font-0000001157868583">HarmonyOS 字体</a>是华为发布的可免费商用的字体。其设计上聚焦于功能性、普适性，是一款多语言的无级可变字体，支持简体中文、繁体中文、拉丁、西里尔、希腊、阿拉伯等 5 大书写系统，105 种语言全球化覆盖。</p><p>我尝试了一下，在展示效果上，HarmonyOS 字体看上去确实要舒服很多，索性把它设置为了博客的基础字体。实际效果可以参考本博客。</p><h2 id="stellar-zhu-ti-shi-yong-harmony-os-zi-ti">Stellar 主题使用 HarmonyOS 字体</h2><p>其实，Hexo 博客使用字体的方式都是类似的，通过两个步骤完成：</p><ul><li>引入字体资源</li><li>修改主题中的字体设置</li></ul><p>其中，对于不同的主题，第二步的设置方式会不一样。但目前，大部分的主题都支持字体的自定义，具体方法可以通过主题的配置文档查看。</p><h3 id="yin-ru-zi-ti-zi-yuan">引入字体资源</h3><p>在站点配置文件<mark class="tag-plugin colorful mark" color="yellow">_config.yml</mark> 中，添加如下配置引入字体。</p><figure class="highlight yaml"><figcaption><span>{blog-path}/_config.yml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel="preconnect"</span> <span class="string">href="https://s1.hdslb.com/"</span> <span class="string">/&gt;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel="stylesheet"</span> <span class="string">href="//s1.hdslb.com/bfs/static/jinkela/long/font/medium.css"</span> <span class="string">media="all"</span> <span class="string">onload="this.media='all'"</span> <span class="string">/&gt;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel="stylesheet"</span> <span class="string">href="//s1.hdslb.com/bfs/static/jinkela/long/font/regular.css"</span> <span class="string">media="all"</span> <span class="string">onload="this.media='all'"</span> <span class="string">/&gt;</span></span><br></pre></td></tr></tbody></table></figure><p>上面的代码会引入 <code>medium</code> 和 <code>regular</code> 两种字重</p><h3 id="xiu-gai-zhu-ti-de-zi-ti-she-zhi">修改主题的字体设置</h3><p>修改主题配置文件，找到 <code>style</code> 部分下面的 <code>font-family</code> 配置：</p><figure class="highlight yaml"><figcaption><span>{blog-path}/_config.stellar.yml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">style:</span></span><br><span class="line">  <span class="attr">font-family:</span></span><br><span class="line">    <span class="attr">logo:</span> <span class="string">'HarmonyOS_Regular'</span></span><br><span class="line">    <span class="attr">body:</span> <span class="string">'HarmonyOS_Regular'</span></span><br></pre></td></tr></tbody></table></figure><p>如果喜欢粗一点的字体，可以修改为</p><figure class="highlight yaml"><figcaption><span>{blog-path}/_config.stellar.yml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">style:</span></span><br><span class="line">  <span class="attr">font-family:</span></span><br><span class="line">    <span class="attr">logo:</span> <span class="string">'HarmonyOS_Medium'</span></span><br><span class="line">    <span class="attr">body:</span> <span class="string">'HarmonyOS_Medium'</span></span><br></pre></td></tr></tbody></table></figure><p>两种字重的显示效果对比图如下，本站使用的字重为 <code>medium</code><br><img src="https://gcore.jsdelivr.net/gh/panoshu/blog-cdn@main/images/20241110/sdNhZj1Qi3B5le4.png" alt=""></p><h3 id="shi-she-zhi-sheng-xiao">使设置生效</h3><p>完成上述修改后，执行</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl &amp; hexo g &amp; hexo s</span><br></pre></td></tr></tbody></table></figure><p>再访问 <a href="http://localhost:4000">localhost:4000</a> 可以查看效果</p><h2 id="ru-he-xuan-ze-zi-ti">如何选择字体</h2><div class="tag-plugin colorful note" color="yellow"><div class="title"><strong><p>如何选择字体格式</p></strong></div><div class="body"><ul><li>为了不影响访问效率，不建议使用 <code>src: url('../fonts/yaheiconsolashybrid.ttf')</code> 引入 ttf、otf 等格式的字体，建议使用 woff2 格式。</li><li>为了进一步节省带宽，提升访问速度，还可以使用 <code>unicode-range</code> CSS 描述符对 <code>@font-face</code> 内的字体进行分割，可以做到按需加载。</li><li>本文上面提供的链接时 B 站已经处理好的 woff2 格式的字体，访问速度也很快。感谢 B 站！</li></ul></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;前序文章：&lt;br&gt;
&lt;a href=&quot;/blog/2c3f9e38/&quot;&gt;Hexo 博客 Stellar 主题使用 KaTex 公式与 Markdown 复杂表格&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;harmony-os-sans-zi-ti&quot;&gt;HarmonyOS Sans 字体</summary>
      
    
    
    
    <category term="解决方案与经验分享" scheme="https://www.panoshu.top/blog/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%B8%8E%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="Hexo" scheme="https://www.panoshu.top/blog/tags/Hexo/"/>
    
    <category term="Next 主题" scheme="https://www.panoshu.top/blog/tags/Next-%E4%B8%BB%E9%A2%98/"/>
    
    <category term="Stellar 主题" scheme="https://www.panoshu.top/blog/tags/Stellar-%E4%B8%BB%E9%A2%98/"/>
    
    <category term="HarmonyOS 字体" scheme="https://www.panoshu.top/blog/tags/HarmonyOS-%E5%AD%97%E4%BD%93/"/>
    
  </entry>
  
  <entry>
    <title>Hexo Stellar 和 Next 主题支持 KaTex 公式与 Markdown 复杂表格</title>
    <link href="https://www.panoshu.top/blog/2c3f9e38/"/>
    <id>https://www.panoshu.top/blog/2c3f9e38/</id>
    <published>2022-05-30T13:04:42.000Z</published>
    <updated>2026-03-21T06:14:35.817Z</updated>
    
    <content type="html"><![CDATA[<p>Hexo Stellar 主题优化配置，主要的特性与功能包括：</p><ul><li>Markdown-it 渲染引擎以及插件配置<ul><li>KaTex 公式设置</li><li>复杂的 Markdown 表格</li><li>定义文本颜色</li><li>复选框、emoji、键盘按键</li><li>寻找插件的通用方法</li></ul></li></ul><span id="more"></span><div class="tag-plugin colorful note" color="green"><div class="body"><p>本文的方法主要是基于 Hexo 插件，与主题没有强关联，理论上适用于任何 Hexo 主题。</p></div></div><h2 id="markdown-it">Markdown-it</h2><p>Hexo 需要使用 Markdown 渲染引擎将 md 文件渲染成 html 文件，Hexo 默认使用<span class="md-colorify md-colorify--info" style="color: #909399;"> hexo-renderer-marked</span>，可以换成<span class="md-colorify md-colorify--primary" style="color: #409EFF;"> hexo-renderer-markdown-it</span>。</p><p><a href="https://github.com/hexojs/hexo-renderer-markdown-it">hexo-renderer-markdown-it</a> 拥有更好的性能，而且可以通过插件扩展功能，如：上标、下标、引用注脚、emoji、KaTex 公式、多维表格等等。</p><h2 id="hexo-zhong-markdown-it-de-an-zhuang-yu-pei-zhi">Hexo 中 Markdown-it 的安装与配置</h2><p>先卸载 Hexo 默认引擎</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm un hexo-renderer-marked --save</span><br></pre></td></tr></tbody></table></figure><p>安装 markdown-it 引擎</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i hexo-renderer-markdown-it --save</span><br></pre></td></tr></tbody></table></figure><p>在<u>站点配置文件 _config.yml</u> 中增加以下配置，配置信息含义见<a href="https://github.com/hexojs/hexo-renderer-markdown-it#options">说明文档</a>。</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">markdown:</span></span><br><span class="line">  <span class="attr">preset:</span> <span class="string">'default'</span></span><br><span class="line">  <span class="attr">render:</span></span><br><span class="line">    <span class="attr">html:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">xhtmlOut:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">breaks:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">langPrefix:</span> <span class="string">'language-'</span></span><br><span class="line">    <span class="attr">linkify:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">typographer:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">quotes:</span> <span class="string">'“”‘’'</span></span><br><span class="line">  <span class="attr">plugins:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">'markdown-it-footnote'</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">'markdown-it-ins'</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">'markdown-it-mark'</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">'markdown-it-sub'</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">'markdown-it-sup'</span></span><br></pre></td></tr></tbody></table></figure><div class="tag-plugin colorful note"><div class="title"><strong><p>配置中的 typographer: true 的作用是显示特殊格式字符</p></strong></div><div class="body"><ul><li><p>写法：<br><code>(c) (C) (r) (R) (tm) (TM) (p) (P) +-</code></p></li><li><p>效果：<br>© © ® ® ™ ™ (p) (P) ±</p></li></ul></div></div><p>上面配置中，<code>plugins</code> 下面的五个插件，是自带的五个插件，下发与实现效果如下：</p><div class="tag-plugin tabs" id="tab_1"><div class="nav-tabs"><div class="tab active"><a href="#tab_1-1">footnote</a></div><div class="tab"><a href="#tab_1-2">ins</a></div><div class="tab"><a href="#tab_1-3">mark</a></div><div class="tab"><a href="#tab_1-4">sub</a></div><div class="tab"><a href="#tab_1-5">sup</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_1-1"><div class="tag-plugin colorful note"><div class="body"><p><strong>参考文献注脚</strong></p><ul><li><p>写法：<br><code>引用内容[^1]</code><br><code>[^1]: 参考文献1</code></p></li><li><p>效果：<br>引用内容 <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup></p></li></ul><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p> 参考文献 1 <a href="#fnref1" class="footnote-backref">↩︎</a></p></li></ol></section></div></div></div><div class="tab-pane" id="tab_1-2"><div class="tag-plugin colorful note"><div class="body"><p><strong>下划线</strong></p><ul><li><p>写法：<code>++Text++</code></p></li><li><p>效果：<ins>Text</ins></p></li></ul></div></div></div><div class="tab-pane" id="tab_1-3"><div class="tag-plugin colorful note"><div class="body"><p><strong>标记</strong></p><ul><li><p>写法：<code>==Text==</code></p></li><li><p>效果：<mark>Text</mark></p></li></ul></div></div></div><div class="tab-pane" id="tab_1-4"><div class="tag-plugin colorful note"><div class="body"><p><strong>下标</strong></p><ul><li><p>写法：<code>H~2~O</code></p></li><li><p>效果：H<sub>2</sub>O</p></li></ul></div></div></div><div class="tab-pane" id="tab_1-5"><div class="tag-plugin colorful note"><div class="body"><p><strong>上标</strong></p><ul><li><p>写法：<code>X^2^</code></p></li><li><p>效果：X<sup>2</sup></p></li></ul></div></div></div></div></div><div class="tag-plugin colorful note" color="yellow"><div class="body"><p>Stellar 主题提供了<a href="../../wiki/stellar/tag-plugins/">原生的下划线、标记、上标、下标等标签插件</a>，可以满足使用需求，但是如果你经常更换主题，那么可以使用 markdown-it 的插件的实现方式，免去了更换主题后修改标签的写法的工作量</p></div></div><p>其他用法，可以参考 markdown-it 的<a href="https://markdown-it.github.io/">官方效果演示 Demo</a></p><h2 id="ka-tex-gong-shi-cha-jian-an-zhuang-yu-pei-zhi">KaTex 公式插件安装与配置</h2><p><a href="https://katex.org/">KaTeX</a> 是一款轻量化的公式渲染器，<a href="https://www.intmath.com/cg5/katex-mathjax-comparison.php">拥有比 MathJax 3 更快的效率</a>。</p><p>在 markdown-it 中使用 Katex 的用法和配置如下：</p><h3 id="an-zhuang-markdown-it-katex-cha-jian">安装 markdown-it-katex 插件</h3><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i @traptitech/markdown-it-katex --save</span><br></pre></td></tr></tbody></table></figure><h3 id="tian-jia-pei-zhi">添加配置</h3><p>在<u>站点配置文件 _config.yml</u> 中增加 markdown-it 的插件配置</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">plugins:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">plugin:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">'@traptitech/markdown-it-katex'</span></span><br><span class="line">    <span class="attr">options:</span> <span class="comment"># see https://katex.org/docs/options.html</span></span><br><span class="line">      <span class="attr">blockClass:</span> <span class="string">"math-block"</span></span><br><span class="line">      <span class="attr">strict:</span> <span class="literal">false</span></span><br><span class="line">      <span class="attr">throwOnError:</span> <span class="literal">false</span></span><br><span class="line">      <span class="attr">errorColor:</span> <span class="string">"#cc0000"</span></span><br></pre></td></tr></tbody></table></figure><h3 id="yong-fa-yu-xiao-guo">用法与效果</h3><div class="tag-plugin tabs" id="tab_2"><div class="nav-tabs"><div class="tab active"><a href="#tab_2-1">Inline Style</a></div><div class="tab"><a href="#tab_2-2">Block Style</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_2-1"><div class="tag-plugin colorful note"><div class="title"><strong><p>写法</p></strong></div><div class="body"><figure class="highlight latex"><figcaption><span>inline 格式 </span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">$</span>E = mc<span class="built_in">^</span>{2}<span class="built_in">$</span></span><br></pre></td></tr></tbody></table></figure><figure class="highlight latex"><figcaption><span>inline 带颜色格式 </span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">$</span>{<span class="keyword">\color</span>{Green}{<span class="keyword">\underline</span>{P<span class="keyword">\{</span>a&lt;X<span class="keyword">\le</span> b<span class="keyword">\}</span>}}}<span class="built_in">$</span></span><br></pre></td></tr></tbody></table></figure></div></div><div class="tag-plugin colorful note"><div class="title"><strong><p>效果</p></strong></div><div class="body"><div class="tag-plugin colorful note"><div class="title"><strong><p>inline 格式</p></strong></div><div class="body"><p>inline 格式的效果： <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo>=</mo><mi>m</mi><msup><mi>c</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">E = mc^{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord mathnormal">m</span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span> ，可以与文字显示在同一行。</p></div></div><div class="tag-plugin colorful note"><div class="title"><strong><p>inline 带颜色格式</p></strong></div><div class="body"><p>inline 带颜色格式的效果： <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mstyle mathcolor="Green"><munder accentunder="true"><mrow><mi>P</mi><mo stretchy="false">{</mo><mi>a</mi><mo>&lt;</mo><mi>X</mi><mo>≤</mo><mi>b</mi><mo stretchy="false">}</mo></mrow><mo stretchy="true">‾</mo></munder></mstyle></mrow><annotation encoding="application/x-tex">{\color{Green}{\underline{P\{a&lt;X\le b\}}}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.45em;"></span><span class="mord"><span class="mord" style="color:Green;"><span class="mord underline" style="color:Green;"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.75em;"><span style="top:-2.59em;"><span class="pstrut" style="height:3em;"></span><span class="underline-line" style="color:Green;border-bottom-width:0.04em;"></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="color:Green;"><span class="mord mathnormal" style="margin-right:0.13889em;color:Green;">P</span><span class="mopen" style="color:Green;">{</span><span class="mord mathnormal" style="color:Green;">a</span><span class="mspace" style="color:Green;margin-right:0.2778em;"></span><span class="mrel" style="color:Green;">&lt;</span><span class="mspace" style="color:Green;margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;color:Green;">X</span><span class="mspace" style="color:Green;margin-right:0.2778em;"></span><span class="mrel" style="color:Green;">≤</span><span class="mspace" style="color:Green;margin-right:0.2778em;"></span><span class="mord mathnormal" style="color:Green;">b</span><span class="mclose" style="color:Green;">}</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.45em;"><span></span></span></span></span></span></span></span></span></span></span> ，可以与文字显示在同一行，同时还可以设置颜色。</p></div></div></div></div></div><div class="tab-pane" id="tab_2-2"><div class="tag-plugin colorful note"><div class="title"><strong><p>写法</p></strong></div><div class="body"><figure class="highlight latex"><figcaption><span>Block Style</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">$</span><span class="built_in">$</span>{<span class="keyword">\color</span>{Green}{<span class="keyword">\underline</span>{P<span class="keyword">\{</span>a&lt;X<span class="keyword">\le</span> b<span class="keyword">\}</span>}}}<span class="built_in">$</span><span class="built_in">$</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">$</span><span class="built_in">$</span></span><br><span class="line"><span class="keyword">\begin</span>{equation}</span><br><span class="line"><span class="keyword">\begin</span>{aligned}</span><br><span class="line">a <span class="built_in">&amp;</span>= b + c <span class="keyword">\\</span></span><br><span class="line"><span class="built_in">&amp;</span>= d + e + f + g<span class="keyword">\\</span></span><br><span class="line"><span class="built_in">&amp;</span>= h + i</span><br><span class="line"><span class="keyword">\end</span>{aligned}</span><br><span class="line"><span class="keyword">\end</span>{equation}</span><br><span class="line"><span class="built_in">$</span><span class="built_in">$</span></span><br></pre></td></tr></tbody></table></figure></div></div><div class="tag-plugin colorful note"><div class="title"><strong><p>效果</p></strong></div><div class="body"><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mstyle mathcolor="Green"><munder accentunder="true"><mrow><mi>P</mi><mo stretchy="false">{</mo><mi>a</mi><mo>&lt;</mo><mi>X</mi><mo>≤</mo><mi>b</mi><mo stretchy="false">}</mo></mrow><mo stretchy="true">‾</mo></munder></mstyle></mrow><annotation encoding="application/x-tex">{\color{Green}{\underline{P\{a&lt;X\le b\}}}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.45em;"></span><span class="mord"><span class="mord" style="color:Green;"><span class="mord underline" style="color:Green;"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.75em;"><span style="top:-2.59em;"><span class="pstrut" style="height:3em;"></span><span class="underline-line" style="color:Green;border-bottom-width:0.04em;"></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="color:Green;"><span class="mord mathnormal" style="margin-right:0.13889em;color:Green;">P</span><span class="mopen" style="color:Green;">{</span><span class="mord mathnormal" style="color:Green;">a</span><span class="mspace" style="color:Green;margin-right:0.2778em;"></span><span class="mrel" style="color:Green;">&lt;</span><span class="mspace" style="color:Green;margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;color:Green;">X</span><span class="mspace" style="color:Green;margin-right:0.2778em;"></span><span class="mrel" style="color:Green;">≤</span><span class="mspace" style="color:Green;margin-right:0.2778em;"></span><span class="mord mathnormal" style="color:Green;">b</span><span class="mclose" style="color:Green;">}</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.45em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.16em" columnspacing="1em"><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mi>a</mi></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mi>b</mi><mo>+</mo><mi>c</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mi>d</mi><mo>+</mo><mi>e</mi><mo>+</mo><mi>f</mi><mo>+</mo><mi>g</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mi>h</mi><mo>+</mo><mi>i</mi></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{equation}\begin{aligned}a &amp;= b + c \\  &amp;= d + e + f + g\\  &amp;= h + i\end{aligned}\end{equation}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:4.5em;vertical-align:-2em;"></span><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.5em;"><span style="top:-4.5em;"><span class="pstrut" style="height:4.5em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.5em;"><span style="top:-4.66em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">a</span></span></span><span style="top:-3.16em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-1.66em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.5em;"><span style="top:-4.66em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">c</span></span></span><span style="top:-3.16em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span></span></span><span style="top:-1.66em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">h</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2em;"><span></span></span></span></span></span></span></span><span class="tag"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.5em;"><span style="top:-4.5em;"><span class="pstrut" style="height:4.5em;"></span><span class="eqn-num"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2em;"><span></span></span></span></span></span></span></span></span></p></div></div></div></div></div><h2 id="fu-za-de-markdown-biao-ge">复杂的 Markdown 表格</h2><p>Markdown 原生只支持最简单的表格，不支持合并单元格表格，通过安装插件支持。</p><h3 id="an-zhuang-markdown-it-multimd-table-cha-jian">安装 markdown-it-multimd-table 插件</h3><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i markdown-it-multimd-table --save</span><br></pre></td></tr></tbody></table></figure><h3 id="tian-jia-pei-zhi-1">添加配置</h3><p>在<u>站点配置文件 _config.yml</u> 中增加 markdown-it 的插件配置</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">plugins:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">plugin:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">markdown-it-multimd-table</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">options:</span></span><br><span class="line">      <span class="attr">multiline:</span> <span class="literal">true</span></span><br><span class="line">      <span class="attr">rowspan:</span> <span class="literal">true</span></span><br><span class="line">      <span class="attr">headerless:</span> <span class="literal">true</span></span><br></pre></td></tr></tbody></table></figure><h3 id="yong-fa-yu-xiao-guo-1">用法与效果</h3><div class="tag-plugin tabs" id="tab_3"><div class="nav-tabs"><div class="tab active"><a href="#tab_3-1">Multiline 用法</a></div><div class="tab"><a href="#tab_3-2">Multiline 效果</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_3-1"><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">|   Markdown   | Rendered HTML |</span><br><span class="line">|--------------|---------------|</span><br><span class="line">|    *Italic*  | *Italic*      | \</span><br><span class="line">|              |               |</span><br><span class="line">|    - Item 1  | - Item 1      | \</span><br><span class="line">|    - Item 2  | - Item 2      |</span><br><span class="line">|    ```python | ```python       \</span><br><span class="line">|    .1 + .2   | .1 + .2         \</span><br><span class="line">|    ```       | ```           |</span><br></pre></td></tr></tbody></table></figure></div><div class="tab-pane" id="tab_3-2"><table><thead><tr><th>Markdown</th><th>Rendered HTML</th></tr></thead><tbody><tr><td><pre><code>*Italic*</code></pre></td><td><p><em>Italic</em></p></td></tr><tr><td><pre><code>- Item 1- Item 2</code></pre></td><td><ul><li>Item 1</li><li>Item 2</li></ul></td></tr><tr><td><pre><code>```python.1 + .2```</code></pre></td><td><pre><code class="lang-python">.1 + .2</code></pre></td></tr></tbody></table></div></div></div><div class="tag-plugin tabs" id="tab_4"><div class="nav-tabs"><div class="tab active"><a href="#tab_4-1">Rowspan 用法</a></div><div class="tab"><a href="#tab_4-2">Rowspan 效果</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_4-1"><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">Stage | Direct Products | ATP Yields</span><br><span class="line">----: | --------------: | ---------:</span><br><span class="line">Glycolysis | 2 ATP ||</span><br><span class="line">^^ | 2 NADH | 3--5 ATP |</span><br><span class="line">Pyruvaye oxidation | 2 NADH | 5 ATP |</span><br><span class="line">Citric acid cycle | 2 ATP ||</span><br><span class="line">^^ | 6 NADH | 15 ATP |</span><br><span class="line">^^ | 2 FADH2 | 3 ATP |</span><br><span class="line">**30--32** ATP |||</span><br><span class="line">[Net ATP yields per hexose]</span><br></pre></td></tr></tbody></table></figure></div><div class="tab-pane" id="tab_4-2"><table><caption id="netatpyieldsperhexose" style="caption-side: bottom">Net ATP yields per hexose</caption><thead><tr><th style="text-align:right">Stage</th><th style="text-align:right">Direct Products</th><th style="text-align:right">ATP Yields</th></tr></thead><tbody><tr><td style="text-align:right" rowspan="2">Glycolysis</td><td style="text-align:right" colspan="2">2 ATP</td></tr><tr><td style="text-align:right">2 NADH</td><td style="text-align:right">3–5 ATP</td></tr><tr><td style="text-align:right">Pyruvaye oxidation</td><td style="text-align:right">2 NADH</td><td style="text-align:right">5 ATP</td></tr><tr><td style="text-align:right" rowspan="3">Citric acid cycle</td><td style="text-align:right" colspan="2">2 ATP</td></tr><tr><td style="text-align:right">6 NADH</td><td style="text-align:right">15 ATP</td></tr><tr><td style="text-align:right">2 FADH2</td><td style="text-align:right">3 ATP</td></tr><tr><td style="text-align:right" colspan="3"><strong>30–32</strong> ATP</td></tr></tbody></table></div></div></div><div class="tag-plugin tabs" id="tab_5"><div class="nav-tabs"><div class="tab active"><a href="#tab_5-1">Headerless 用法</a></div><div class="tab"><a href="#tab_5-2">Headerless 效果</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_5-1"><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">|--|--|--|--|--|--|--|--|</span><br><span class="line">|♜|  |♝|♛|♚|♝|♞|♜|</span><br><span class="line">|  |♟|♟|♟|  |♟|♟|♟|</span><br><span class="line">|♟|  |♞|  |  |  |  |  |</span><br><span class="line">|  |♗|  |  |♟|  |  |  |</span><br><span class="line">|  |  |  |  |♙|  |  |  |</span><br><span class="line">|  |  |  |  |  |♘|  |  |</span><br><span class="line">|♙|♙|♙|♙|  |♙|♙|♙|</span><br><span class="line">|♖|♘|♗|♕|♔|  |  |♖|</span><br></pre></td></tr></tbody></table></figure></div><div class="tab-pane" id="tab_5-2"><table><tbody><tr><td>♜</td><td></td><td>♝</td><td>♛</td><td>♚</td><td>♝</td><td>♞</td><td>♜</td></tr><tr><td></td><td>♟</td><td>♟</td><td>♟</td><td></td><td>♟</td><td>♟</td><td>♟</td></tr><tr><td>♟</td><td></td><td>♞</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td>♗</td><td></td><td></td><td>♟</td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td>♙</td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td>♘</td><td></td><td></td></tr><tr><td>♙</td><td>♙</td><td>♙</td><td>♙</td><td></td><td>♙</td><td>♙</td><td>♙</td></tr><tr><td>♖</td><td>♘</td><td>♗</td><td>♕</td><td>♔</td><td></td><td></td><td>♖</td></tr></tbody></table></div></div></div><h2 id="ke-yi-she-zhi-wen-zi-yan-se-cha-jian">可以设置文字颜色插件</h2><p>Markdown 原生不支持对文字设置颜色，通过安装插件支持。</p><h3 id="an-zhuang-markdown-it-color-text-cha-jian">安装 markdown-it-color-text 插件</h3><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i markdown-it-color-text --save</span><br></pre></td></tr></tbody></table></figure><h3 id="tian-jia-cha-jian-pei-zhi">添加插件配置</h3><p>在<u>站点配置文件 _config.yml</u> 中增加 markdown-it 的插件配置</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">plugins:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">plugin:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">markdown-it-color-text</span></span><br><span class="line">    <span class="attr">options:</span></span><br><span class="line">      <span class="attr">classPrefix:</span> <span class="string">'md-colorify'</span></span><br><span class="line">      <span class="attr">inlineStyle:</span> <span class="literal">true</span></span><br><span class="line">      <span class="attr">customColor:</span></span><br><span class="line">        <span class="attr">primary:</span> <span class="string">'#409EFF'</span></span><br><span class="line">        <span class="attr">success:</span> <span class="string">'#67C23A'</span></span><br><span class="line">        <span class="attr">info:</span> <span class="string">'#909399'</span></span><br><span class="line">        <span class="attr">warning:</span> <span class="string">'#E6A23C'</span></span><br><span class="line">        <span class="attr">error:</span> <span class="string">'#F56C6C'</span></span><br></pre></td></tr></tbody></table></figure><h3 id="yong-fa-yu-xiao-guo-2">用法与效果</h3><div class="tag-plugin tabs" id="tab_6"><div class="nav-tabs"><div class="tab active"><a href="#tab_6-1">primary</a></div><div class="tab"><a href="#tab_6-2">success</a></div><div class="tab"><a href="#tab_6-3">info</a></div><div class="tab"><a href="#tab_6-4">warning</a></div><div class="tab"><a href="#tab_6-5">error</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_6-1"><ul><li> 用法：<code>{primary}(primary Text)</code></li><li>效果：<span class="md-colorify md-colorify--primary" style="color: #409EFF;">primary Text</span></li></ul></div><div class="tab-pane" id="tab_6-2"><ul><li> 用法：<code>{success}(success Text)</code></li><li>效果：<span class="md-colorify md-colorify--success" style="color: #67C23A;">success Text</span></li></ul></div><div class="tab-pane" id="tab_6-3"><ul><li> 用法：<code>{info}(info Text)</code></li><li>效果：<span class="md-colorify md-colorify--info" style="color: #909399;">info Text</span></li></ul></div><div class="tab-pane" id="tab_6-4"><ul><li> 用法：<code>{warning}(warning Text)</code></li><li>效果：<span class="md-colorify md-colorify--warning" style="color: #E6A23C;">warning Text</span></li></ul></div><div class="tab-pane" id="tab_6-5"><ul><li> 用法：<code>{error}(error Text)</code></li><li>效果：<span class="md-colorify md-colorify--error" style="color: #F56C6C;">error Text</span></li></ul></div></div></div><h2 id="fu-xuan-kuang-emoji-biao-qing-jian-pan-an-jian">复选框、emoji 表情、键盘按键</h2><div class="tag-plugin tabs" id="tab_7"><div class="nav-tabs"><div class="tab active"><a href="#tab_7-1">markdown-it-checkbox</a></div><div class="tab"><a href="#tab_7-2">markdown-it-emoji</a></div><div class="tab"><a href="#tab_7-3">markdown-it-kbd</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_7-1"><div class="tag-plugin colorful note"><div class="body"><p>让 markdown 支持复选框</p><ul><li><p>安装插件：</p><p><code>npm i markdown-it-checkbox --save</code></p></li><li><p>增加配置：<br>在<u>站点配置文件 _config.yml</u> 中 markdown-it 的 plugins 下面增加 <code>- markdown-it-checkbox</code></p></li><li><p>用法：</p></li></ul><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[ ] 选中 item 1</span><br><span class="line">[x] 未选中 item 2</span><br></pre></td></tr></tbody></table></figure><ul><li><p>效果：</p><p><input type="checkbox" id="checkbox1"><label for="checkbox1">选中 item 1</label><br><input type="checkbox" id="checkbox0" checked="true"><label for="checkbox0">未选中 item 2</label></p></li></ul></div></div></div><div class="tab-pane" id="tab_7-2"><div class="tag-plugin colorful note"><div class="body"><p>让 markdown 支持 emoji 表情</p><ul><li><p>安装插件：</p><p><code>npm i markdown-it-emoji --save</code></p></li><li><p>增加配置：<br>在<u>站点配置文件 _config.yml</u> 中 markdown-it 的 plugins 下面增加 <code>- markdown-it-emoji</code></p></li><li><p>用法：<code>:)</code></p></li><li><p>效果：😃</p></li></ul></div></div></div><div class="tab-pane" id="tab_7-3"><div class="tag-plugin colorful note"><div class="body"><p>让 markdown 支持按键格式</p><ul><li><p>安装插件：</p><p><code>npm i markdown-it-kbd --save</code></p></li><li><p>增加配置：<br>在<u>站点配置文件 _config.yml</u> 中 markdown-it 的 plugins 下面增加 <code>- markdown-it-kbd</code></p></li><li><p>用法：<code>[[ctrl]]</code>  <code>[[+]]</code>  <code>[[D]]</code></p></li><li><p>效果：<kbd>ctrl</kbd> <kbd>+</kbd> <kbd>D</kbd></p></li></ul></div></div></div></div></div><div class="tag-plugin colorful note" color="yellow"><div class="body"><ul><li>Stellar 主题提供了<a href="wiki/stellar/tag-plugins/">复选框、emoji 表情、键盘按键标签插件</a>，可以满足使用需求</li><li>如果你经常更换主题，那么可以使用 markdown-it 的插件的方式实现，免去了更换主题后修改标签的写法的工作量</li></ul></div></div><h2 id="xun-zhao-cha-jian-de-tong-yong-fang-fa">寻找插件的通用方法</h2><p>在 <a href="https://www.npmjs.com">https://www.npmjs.com</a> 或 <a href="https://www.github.com">https://www.github.com</a> 以 <code>markdown-it</code> + <code>keyword</code> 为关键字搜索</p><p>如 <code>markdown-it</code> + <code>table</code> 搜索 <code>markdown-it</code> 的表格插件</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Hexo Stellar 主题优化配置，主要的特性与功能包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Markdown-it 渲染引擎以及插件配置
&lt;ul&gt;
&lt;li&gt;KaTex 公式设置&lt;/li&gt;
&lt;li&gt;复杂的 Markdown 表格&lt;/li&gt;
&lt;li&gt;定义文本颜色&lt;/li&gt;
&lt;li&gt;复选框、emoji、键盘按键&lt;/li&gt;
&lt;li&gt;寻找插件的通用方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="解决方案与经验分享" scheme="https://www.panoshu.top/blog/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%B8%8E%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="Hexo" scheme="https://www.panoshu.top/blog/tags/Hexo/"/>
    
    <category term="KaTex" scheme="https://www.panoshu.top/blog/tags/KaTex/"/>
    
  </entry>
  
  <entry>
    <title>Hexo 博客免费部署方案及 Vercel 托管和 CDN 加速访问</title>
    <link href="https://www.panoshu.top/blog/fbbe79ce/"/>
    <id>https://www.panoshu.top/blog/fbbe79ce/</id>
    <published>2022-05-03T17:07:41.000Z</published>
    <updated>2026-03-21T06:14:35.817Z</updated>
    
    <content type="html"><![CDATA[<div class="tag-plugin colorful note"><div class="body"><p><a href="https://hexo.io/zh-cn/">Hexo</a> 是一个快速、简洁且高效的博客框架。它基于 Node.js 构建，使用 Markdown（或其他渲染引擎）解析文章，通过简单的命令，在几秒内即可利用靓丽的主题生成静态网页。</p></div></div><span id="more"></span><p>最早接触到 Hexo 框架还是在上大学的时候，当时使用的是 <a href="https://pages.github.com">Github Pages</a> 托管的方案，实现起来最简单，不过也有一些问题。最近试了一下通过 <a href="https://vercel.com">Vercel</a> 托管博客页面，上手难度也不高，搭配 <a href="https://github.com">Github</a> 仓库还可以实现自动部署。</p><p>本文将基于此总结一下 Hexo 博客的几种简单、免费的部署方案。划重点：<span class="md-colorify md-colorify--info" style="color: #909399;">免费！！！</span> 毕竟还不知道能写多久、写几篇，就花钱上这个云那个云买一堆 VPS 多少有点浪费。</p><h2 id="dong-tai-vs-jing-tai">动态 vs 静态</h2><pre class="mermaid">graph LR  A(Web Site <br> User Interface) --&gt;|Request| B(Application <br> Services)  B --&gt;|Connect| C[(fa:fa-database Data Services)]</pre><p>如上图，日常我们访问的网站，一般是动态网站，简单来说架构上通常由应用服务和数据服务构成，访问的时候需要从后端请求数据填充到页面上。所以部署的时候需要不仅需要计算资源还需要存储资源，由此可以演变出各种复杂的架构模式。</p><pre class="mermaid">graph LR  A(Web Site <br> User Interface) --&gt;|Request| B(Static <br> Sources)</pre><p>但是 Hexo 这类框架生成的静态博客会在部署前完成数据和页面的准备，部署上不依赖数据库，只需要解决静态资源的存储问题就可以，其架构大概如上图。所以在部署 Hexo 静态博客的时候只需要找到地方来存储静态资源就可以。</p><p>令人高兴的是目前很多云服务商提供了静态资源的免费托管服务，而对于博客中依赖的公共静态资源（如各种 js、字体等）还可以通过 CDN 来获取，进一步说部署静态博客，可以简单理解为：解决自定义的静态资源的存储问题。</p><div class="tag-plugin colorful note"><div class="body"><p>这里不讨论动态网站和静态网站的优劣，要知道架构没有绝对的优劣，只有合适与否。对于搭建个人博客的需求场景，静态博客在成本与收益比上无疑是更佳的选择。</p></div></div><p>所以，下面提到的各种部署方案，本质上就是选择不同的资源存储位置以及不同的资源提交方式。</p><h2 id="hexo-github-pages">Hexo + Github Pages</h2><p>这种方案的模式如下图：</p><pre class="mermaid">graph LR  A(Hexo) --&gt;|deploy| B(Github Pages)</pre><h3 id="dai-ma-tuo-guan-ping-tai">代码托管平台</h3><p>像 Github、Gitlab、Gitee、Coding 这类代码托管平台，都提供了静态页面托管的 Pages 服务，早年间笔者就曾用 Coding 的 Pages 服务搭建了第一个静态博客。</p><p>随着近些年政策法规的调整，Gitee 和 Coding 平台的 Pages 服务或实名认证或需要付费，如果绑定自定义域名还需要备案，对于初学或者入门的同学来说门槛稍高。而 Github 和 Gitlab 这类平台仍能提供免费静态网页托管服务，且没有严格的管控，适合新手练手。</p><h3 id="github-pages-cao-zuo-fang-shi">Github Pages 操作方式</h3><p>操作起来很简单，以 Github 为例：</p><ol><li>先在 Github 建好仓库</li><li>在本地通过 <code>hexo generation</code> 生成页面</li><li>使用 <code>hexo deploy</code> 命令推送页面资源到 Github 仓库</li><li>然后通过 <ins><code>https://username.github.io/repo_name</code></ins> 形式的 url 访问</li></ol><p><em>一般的，为了使得访问地址简单一点，可以直接将仓库命名为 <code>usename.github.io</code> 这样就能够直接通过 <ins><code>https://username.github.io</code></ins> 来访问。当然了，github page 也是可以绑定独立域名的。</em></p><div class="tag-plugin colorful note"><div class="body"><p>对于 Github 和 Gitlab 平台的 Pages 服务的开启方式，可以查阅官网说明或者自行搜索（可以使用关键词 <code>Hexo</code>+<code>Github Pages</code>）。</p></div></div><h3 id="fang-an-you-lie">方案优劣</h3><ul><li><p><strong>优势</strong></p><ul><li>操作简单。考虑到玩转 Hexo 的同学大多都有 Github 账号，所以这个方案最大的优势就是，操作实在太方便，几乎是零成本；</li><li>版本控制。基于 Github 天然的版本控制，天然具备版本管控、团队协作等特性。</li></ul></li><li><p><strong>劣势</strong></p><ul><li>访问速度不稳定。在国内网络环境下访问 <ins><code>github.io</code></ins> ，速度不可控，体验不好；</li><li>百度收录难。早在几年前，Github 已经拒绝了百度爬虫的访问。所以如果使用这个方案，你的博客很难被百度爬到，而中文搜索引擎，百度的占有率一家独大，这个问题绕不过去。如果只是自娱自乐，那这一点就不是问题。</li></ul></li></ul><h2 id="hexo-github-vercel">Hexo + Github + Vercel</h2><p>通过上一节的介绍，很自然的会想到，有没有什么办法能够解决 <code>Hexo + Github Pages</code> 方案的劣势，同时还能保留其优点呢。</p><h3 id="fen-xi-hexo-github-pages-mo-shi">分析 Hexo + Github Pages 模式</h3><p>稍微分析一下，<code>Hexo + Github Pages</code> 方案的优势来自于 Github 平台的主要功能：代码托管，这才是人家的‘主业’，静态网页托管只是‘副业’，做做代码文档还可以，让它托管一个要‘做大做强’的静态博客有点强人所难了。</p><div class="tag-plugin colorful note"><div class="body"><p>那需要找一个更专业的地方进行资源托管，而且还需要同时满足以下条件：</p><ul><li>可以稳定又快速的访问</li><li>可以同 Github 链接，进行自动的部署。（就是运行 <code>hexo deploy</code> 命令提交文件到 Github 的时候，可以自动触发页面部署）</li><li><span class="md-colorify md-colorify--info" style="color: #909399;">免费！！！</span></li></ul></div></div><h3 id="vercel">Vercel</h3><p>这里介绍一个神奇的网站，哦不，一个神奇的站点托管平台：<a href="https://vercel.com/">Vercel</a>，。</p><p><strong>Vercel</strong> 具备以下优势：</p><ul><li>类似 Github Pages 的托管功能，但是远比后者强大。Vercel 内置了几十种部署模板，包括 Hexo；</li><li>支持持续集成，可以对接 github 仓库，每次的 push 或者 PR 都可以出发自动发构建和部署；</li><li>Vercel 使用了定制版的 Amazon Global Accelerator，针对国内网络环境的访问有做过针对性优化，还可提供 CDN 加速，访问速度较快；</li><li>Vercel 支持自动配置 https，无需申请和配置 SSL 证书就能让你的博客支持 https；</li><li>还支持 serverless，不仅支持静态网站，还可以托管动态网站（这个对本文讨论的场景来说用处不大）；</li><li>更重要的是，这么强还免费！！！下面是它的价格，针对个人免费，每个月提供 100G 流量，对于个人博客足够了。</li></ul><figure data-type="image"><img src="https://s2.loli.net/2022/05/04/YymzWu57ZD68eLA.png" alt=""><figcaption>price</figcaption></figure><h3 id="mo-shi-yan-bian">模式演变</h3><pre class="mermaid">graph LR  A(Hexo) --&gt;|push| B(Github)  B --&gt;|CI/CD| C(Vercel)</pre><p>显然，<code>Vercel</code> 满足了上面提出的要求，而且给的更多。于是，部署方案演变成了上面的模式。<br>操作步骤变成了：</p><ol><li>先在 Github 建好仓库（也可以在第 3 步的时候再创建）</li><li>注册 <code>Vercel</code> 账号（可以使用 Github 的联合登录）</li><li>在 <code>Vercel</code> 创建一个应用（这里需要设置一个应用名 <code>Application Name</code>，后面访问的时候用得到），并关联 <code>Github</code> 仓库</li><li>在本地通过 <code>hexo generation</code> 生成页面</li><li>使用 <code>hexo deploy</code> 命令推送页面资源到 Github 仓库</li><li>【 <ins>自动触发</ins> 】push 代码到 <code>Github</code> 触发 <code>Vercel</code> 应用的自动构建和发布</li><li>通过 <ins><code>https://application_name.vercel.app</code></ins> 形式的 url 访问</li></ol><p><em><code>Vercel</code> 提供的 url 自带了 CDN 加速，同时还提供了绑定自定义域名的设置选项，绑定后可以通过你自己的域名访问。</em></p><details class="tag-plugin colorful folding"><summary><p>可以通过浏览器的 console 查看 CDN 缓存是否命中 (点击看图示)</p></summary><div class="body"><p><code>x-vercel-cache: HIT</code> 表示命中<br> <img src="https://s2.loli.net/2022/05/04/ul9OQGnL1CWIkdT.png" alt=""></p> </div></details><div class="tag-plugin colorful note"><div class="body"><p>注册 <code>Vercel</code> 账号、创建 <code>Vercel</code> 应用的操作比较简单，对照官网说明操作即可，或者自行搜索详细教程。</p></div></div><h2 id="hexo-vercel">Hexo + Vercel</h2><p>介绍了上面两种部署方案，也有人会想到，访问 <code>Github</code> 既然这么慢，可不可以不用它，直接让 Hexo 推送到 Vercel。</p><h3 id="vercel-ke-hu-duan">Vercel 客户端</h3><p><strong>当然是可以的！</strong></p><p><code>Vercel</code> 提供了本地客户端，可以直接从本地上传资源文件到 Vercel 服务器，不用借助其他第三方平台，于是部署方案也就变成了下面的模式：</p><h3 id="mo-shi-zai-yan-bian">模式再演变</h3><pre class="mermaid">graph LR  A(Hexo) --&gt;|deploy| B(Vercel)</pre><p>操作步骤如下：</p><ol><li>通过 <code>e-mail</code> 注册 Vercel 账号（毕竟都要绕过 GitHub 了，就不用 Github 的联合登录了）</li><li>在本地通过 <code>npm install -g vercel</code> 命令安装 <code>vercel</code> 控制台客户端</li><li>在本地通过 <code>hexo generation</code> 生成页面</li><li>到博客根目录下的 <code>public</code> 页面，执行 <code>vercel --prod --confirm</code> 命令完成部署</li><li>通过 <ins><code>https://application_name.vercel.app</code></ins> 形式的 url 访问</li></ol><p><em>绑定自定义域名以及后续的设置与 <code>Hexo + Github + Vercel</code> 方案的后续步骤相同</em></p><div class="tag-plugin colorful note"><div class="body"><p><code>vercel</code> 客户端的安装与配置，可以参考官网说明或者自行搜索详细教程</p></div></div><h2 id="zong-jie">总结</h2><p>从上面可以看出，由于需求的变化，部署方案也在随之演变。新的模式往往是为了解决旧的模式的问题，但采用新的模式往往也会引入新的问题。于是在不断的解决问题的过程中，模式也在不断的演变。</p><p>还是那句话，合适的才是需要的。</p>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;tag-plugin colorful note&quot;&gt;&lt;div class=&quot;body&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://hexo.io/zh-cn/&quot;&gt;Hexo&lt;/a&gt; 是一个快速、简洁且高效的博客框架。它基于 Node.js 构建，使用 Markdown（或其他渲染引擎）解析文章，通过简单的命令，在几秒内即可利用靓丽的主题生成静态网页。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</summary>
    
    
    
    <category term="解决方案与经验分享" scheme="https://www.panoshu.top/blog/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%B8%8E%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="Hexo" scheme="https://www.panoshu.top/blog/tags/Hexo/"/>
    
    <category term="Vercel" scheme="https://www.panoshu.top/blog/tags/Vercel/"/>
    
  </entry>
  
</feed>
