<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feeds/atom-style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://ydysd.top/</id>
    <title>码上观澜</title>
    <updated>2026-01-27T17:26:50.384Z</updated>
    <generator>Astro-Theme-Retypeset with Feed for Node.js</generator>
    <author>
        <name>David Ye</name>
        <uri>https://ydysd.top/</uri>
    </author>
    <link rel="alternate" href="https://ydysd.top/"/>
    <link rel="self" href="https://ydysd.top/atom.xml"/>
    <subtitle>David Ye 的个人技术博客，也许也会有一些生活随笔。本站由 Astro 主题 Retypeset 和 GitHub Pages 强力驱动。</subtitle>
    <rights>Copyright © 2026 David Ye</rights>
    <entry>
        <title type="html"><![CDATA[基于 WSL 2 和 VS Code 的 Python、C/C++ 开发环境配置最佳实践]]></title>
        <id>https://ydysd.top/posts/wsl2-vscode-python-cpp-dev-best-practices/</id>
        <link href="https://ydysd.top/posts/wsl2-vscode-python-cpp-dev-best-practices/"/>
        <updated>2025-07-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文简要介绍了笔者本人使用 VS Code 基于 WSL 2 的 Python 和 C/C++ 基本开发环境的配置操作。]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>[!NOTE]
本文笔者使用的设备环境是 Windows 11 家庭中文版 24H2，且配置的是基于 WSL 2 的 Ubuntu 24.04 LTS 发行版，不代表以下教程适用于其他情况。</p>
</blockquote>
<h2>启用 WSL 2 并安装 Linux 发行版</h2>
<p>如果你的 Windows 11 完全没有安装或启用过 WSL，只要以<strong>管理员身份</strong>运行 PowerShell 或 CMD（Windows Command Prompt，Windows 命令提示符），输入命令 <code>wsl --install</code>，然后重新启动电脑，即可一键完成 WSL 的启用和安装。最终，这条命令会为你启用 WSL，下载并安装最新的 WSL Linux 内核（默认是 WSL 2，可以通过 <code>wsl --set-default-version 2</code> 修改，但你八成不太会用上这个命令），并同时为你下载、安装一个名为 <code>Ubuntu</code> 的默认发行版（一般是最新的 Ubuntu LTS 版本）。你唯一需要做的就是根据提示创建一个 Unix 用户并配置好密码。</p>
<p>例如：</p>
<pre><code>Windows PowerShell
版权所有（C） Microsoft Corporation。保留所有权利。

安装最新的 PowerShell，了解新功能和改进！https://aka.ms/PSWindows

PS C:\WINDOWS\system32&gt; wsl --install
正在下载: Ubuntu
正在安装: Ubuntu
已成功安装分发。可以通过 “wsl.exe -d Ubuntu” 启动它
正在启动 Ubuntu...
wsl: 检测到 localhost 代理配置，但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。
Provisioning the new WSL instance Ubuntu
This might take a while...
Create a default Unix user account: david
New password:
Retype new password:
passwd: password updated successfully
To run a command as administrator (user "root"), use "sudo &lt;command&gt;".
See "man sudo_root" for details.

david@ThinkBook:/mnt/c/WINDOWS/system32$ exit
exit
PS C:\WINDOWS\system32&gt; wsl -l -v
  NAME              STATE           VERSION
* Ubuntu            Stopped         2
</code></pre>
<p>当然，你也可以手动一步步执行这条命令为你完成的操作：打开设置，转到<strong>应用</strong>-&gt;<strong>应用和功能</strong>-&gt;<strong>可选功能</strong>，再点击<strong>更多Windows功能</strong>，找到<strong>适用于Linux的Windows子系统</strong>（Windows Subsystem for Linux）和<strong>虚拟机平台</strong>（Virtual Machine Platform），勾选这两项后点击“确定”，然后重启电脑。</p>
<p>接下来你可以通过 <code>wsl -l -o</code> (<code>wsl --list --online</code>) 查看所有可用的发行版和版本列表，然后使用 <code>wsl --install -d &lt;Name&gt;</code> 安装指定的发行版（新版本的 WSL 工具链已经简化了此命令，你可以去掉 <code>-d</code> 直接通过 <code>wsl --install &lt;Name&gt;</code> 安装指定发行版），例如 <code>wsl --install -d Ubuntu-24.04</code>。</p>
<pre><code>PS C:\WINDOWS\system32&gt; wsl --list --online
以下是可安装的有效分发的列表。
使用“wsl.exe --install &lt;Distro&gt;”安装。

NAME                            FRIENDLY NAME
AlmaLinux-8                     AlmaLinux OS 8
AlmaLinux-9                     AlmaLinux OS 9
AlmaLinux-Kitten-10             AlmaLinux OS Kitten 10
AlmaLinux-10                    AlmaLinux OS 10
Debian                          Debian GNU/Linux
FedoraLinux-42                  Fedora Linux 42
SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
SUSE-Linux-Enterprise-15-SP7    SUSE Linux Enterprise 15 SP7
Ubuntu                          Ubuntu
Ubuntu-24.04                    Ubuntu 24.04 LTS
archlinux                       Arch Linux
kali-linux                      Kali Linux Rolling
openSUSE-Tumbleweed             openSUSE Tumbleweed
openSUSE-Leap-15.6              openSUSE Leap 15.6
Ubuntu-18.04                    Ubuntu 18.04 LTS
Ubuntu-20.04                    Ubuntu 20.04 LTS
Ubuntu-22.04                    Ubuntu 22.04 LTS
OracleLinux_7_9                 Oracle Linux 7.9
OracleLinux_8_7                 Oracle Linux 8.7
OracleLinux_9_1                 Oracle Linux 9.1
</code></pre>
<h2>管理已安装的 WSL 发行版系统</h2>
<p>你可以通过 <code>wsl -l -v</code> (<code>wsl --list --verbose</code>) 查看所有已安装的 WSL 发行版及其运行状态，并使用 <code>wsl -d &lt;Name&gt;</code> 启动相应 WSL 发行版的终端。</p>
<p>下面介绍一些常用的命令。</p>
<h3>查看所有已安装的 WSL 发行版运行状态</h3>
<pre><code>PS C:\WINDOWS\system32&gt; wsl -l -v
  NAME              STATE           VERSION
* Ubuntu-24.04      Running         2
  docker-desktop    Stopped         2
</code></pre>
<p>其中带有星号 <code>*</code> 的项是默认的发行版，我们可以通过 <code>wsl --set-default &lt;Name&gt;</code> 修改。如果不使用 <code>-d</code> (<code>--distribution</code>) 指定发行版，启动的就是默认的发行版。</p>
<h3>启动</h3>
<pre><code>PS C:\WINDOWS\system32&gt; wsl ~ -d Ubuntu-24.04
&lt;YourUsername&gt;@&lt;YourMachineName&gt;:~$
</code></pre>
<p>如果你不指定初始目录 <code>~</code>，那么你在登录发行版后会在 Windows 终端所在的目录下，例如 <code>/mnt/c/Users/david</code>。</p>
<h3>更新</h3>
<pre><code>PS C:\WINDOWS\system32&gt; wsl --update
正在检查更新。
已安装最新版本的适用于 Linux 的 Windows 子系统。
</code></pre>
<h3>停止或退出发行版</h3>
<p>如果只要关闭特定发行版，使用 <code>wsl --terminate &lt;Name&gt;</code> 即可；如果需要在发行版内部关闭，可以使用 <code>logout</code>、<code>exit</code> 或 <code>Ctrl + D</code>。如果需要关闭所有 WSL 实例，可以使用 <code>wsl --shutdown</code>。</p>
<h2>一些其他杂项设置</h2>
<h3>将发行版迁移到系统盘之外的盘</h3>
<p><code>wsl --install</code> 命令本身没有提供直接指定安装路径的选项，它会默认将发行版安装在 C 盘的用户个人文件夹下，如果你的 C 盘剩余空间和我一样已经捉襟见肘，不如选择将安装好的 WSL 发行版迁移到其他盘。下面以将默认在 C 盘安装的 <code>Ubuntu-24.04</code> 迁移到 D 盘为例进行演示：</p>
<ol>
<li>在 D 盘创建目标文件夹：<code>mkdir D:\WSL</code>、<code>mkdir D:\WSL\Ubuntu-24.04</code>。</li>
<li>导出已安装的发行版：<code>wsl --export Ubuntu-24.04 D:\WSL\ubuntu2404.tar</code>。</li>
<li>注销（删除）C 盘的旧发行版：<code>wsl --unregister Ubuntu-24.04</code>。这个操作会删除 C 盘上的原发行版及其所有数据，请确保上一步的导出已成功完成。</li>
<li>导入发行版到 D 盘：<code>wsl --import Ubuntu-24.04 D:\WSL\Ubuntu-24.04 D:\WSL\ubuntu2404.tar --version 2</code>。</li>
<li>导入成功后删除备份文件：<code>del D:\WSL\ubuntu2404.tar</code>。</li>
</ol>
<h3>配置开源软件镜像站</h3>
<p>如果你想要让 WSL 2 发行版得以使用 Clash 等代理软件，可以参考<a href="https://blog.east.monster/2022/10/05/clash-config-in-wsl/">这篇文章</a>。</p>
<p>此处建议使用服务器架设于中国大陆的镜像站，例如<a href="https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/">清华大学开源软件镜像站</a>。</p>
<h2>通过 VS Code 在 WSL 2 上进行开发</h2>
<p>安装、配置 VS Code 的过程在此不赘述，只需要在 VS Code 上安装 WSL 扩展即可。<code>Ctrl + Alt + O</code> 或按 <code>F1</code>  输入 WSL 后，选择 <code>New WSL Window using Distro...</code> 就可以指定要连接的发行版（<code>New WSL Window</code> 启动的应该是默认的发行版）。</p>
<h3>配置 Python 开发环境</h3>
<ol>
<li>在已经连接到 WSL 的 VS Code 窗口中，同时在本地和远程环境（WSL）安装 Python 扩展。</li>
<li>在 WSL 2 Ubuntu 发行版中安装 Miniconda：<code>wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh</code>，随后运行脚本 <code>bash Miniconda3-latest-Linux-x86_64.sh</code>，完成后重启终端，即可在提示符前看到 <code>(base)</code>。</li>
</ol>
<p>运行安装脚本时，可能会有提示 <code>Do you wish the installer to initialize Miniconda3 by running 'conda init'?</code>，这里建议输入 <code>yes</code>，这样脚本会修改 shell 配置文件（通常是 <code>~/.bashrc</code>），这样每次启动新的终端时 Conda 的 base 环境就会自动激活。</p>
<p>另外，也可以同时使用 Ubuntu 24.04 官方源的 Python 3.12，确保操作系统和系统级应用的稳定性；在我们自己的开发环境中使用 Miniconda 作为环境管理工具，可以避免与系统工具冲突：</p>
<p>Ubuntu 24.04 默认自带了 Python 3.12。你可以通过以下命令来安装或确认它是否已安装。这个版本通常是经过 Canonical 测试和验证的，能与系统其他组件良好协作。</p>
<ol>
<li>更新软件包列表：打开终端，运行命令 <code>sudo apt update</code> 以确保你的软件包列表是最新版本。</li>
<li>安装 Python 3.12：执行 <code>sudo apt install python3.12</code> 来安装 Python 3.12。如果已经安装，系统会提示。</li>
<li>安装完成后，检查 Python 版本：<code>python3.12 --version</code>。输出应该会显示 Python 3.12.3。</li>
</ol>
<p>注意这里的 Python 版本号是 3.12.3，作为 LTS 系统，我们不需要特别在意版本号是否最新，使用 Ubuntu 官方维护的软件包即可。</p>
<pre><code>ysd1123@YSD-ThinkBook:~$ python3.12 -V
Python 3.12.3
ysd1123@YSD-ThinkBook:~$ conda activate
(base) ysd1123@YSD-ThinkBook:~$ python -V
Python 3.13.5
</code></pre>
<h3>配置深度学习开发环境</h3>
<p>可以通过 <code>nvidia-smi</code> 或 <code>nvcc</code> 检查 Nvidia GPU 是否在 WSL 中可用。一般可能需要安装 CUDA Toolkit 才能使用后者（<code>sudo apt install nvidia-cuda-toolkit</code>）。</p>
<pre><code>(base) ysd1123@YSD-ThinkBook:~$ nvidia-smi
Wed Jul  2 23:09:16 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 575.51.02              Driver Version: 576.02         CUDA Version: 12.9     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 4060 ...    On  |   00000000:01:00.0  On |                  N/A |
| N/A   34C    P8              2W /  115W |     265MiB /   8188MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+
(base) ysd1123@YSD-ThinkBook:~$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Fri_Jan__6_16:45:21_PST_2023
Cuda compilation tools, release 12.0, V12.0.140
Build cuda_12.0.r12.0/compiler.32267302_0
</code></pre>
<h3>配置 C/C++ 开发环境</h3>
<p>因笔者暂无除算法题以外的使用 C/C++ 的需求，因此此处不会涉及详细的适用于 C/C++ 大型工程的开发环境配置。</p>
<h4>在 Ubuntu 中安装 C/C++ 工具链</h4>
<p>首先需要在 WSL 2 的 Ubuntu 中安装核心的开发工具。build-essential 是一个集合包，它包含了 C/C++ 编译器（gcc 和 g++）、make 等自动化编译工具。gdb 是我们用来调试代码的工具。</p>
<p>在 VS Code 集成终端中，输入 <code>sudo apt update &amp;&amp; sudo apt install build-essential gdb -y</code> 来更新软件包列表，并安装 GNU 编译器工具和 GDB 调试器。</p>
<p>安装完成后，可以验证是否安装成功：</p>
<pre><code>(base) &lt;YourUsername&gt;@&lt;YourMachineName&gt;:~$ g++ --version
g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

(base) &lt;YourUsername&gt;@&lt;YourMachineName&gt;:~$ gdb --version
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
</code></pre>
<p>随后在 VS Code 中安装 C/C++ 扩展即可，注意需要安装到 WSL 环境。</p>
<h4>创建工作区并配置编译和调试</h4>
<p>在家目录下创建你喜欢的目录，例如 <code>/projects/acm_practise</code>。执行 <code>cd ~/projects/helloworld</code>，再通过 <code>code .</code> 启动 VS Code 在该文件夹下的新窗口。</p>
<p>新建一个 C++ 文件<code>main.cpp</code>，粘贴以下代码并保存：</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
   vector&lt;string&gt; msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};

   for (const string&amp; word : msg)
   {
      cout &lt;&lt; word &lt;&lt; " ";
   }
   cout &lt;&lt; endl;
}
</code></pre>
<p>随后按下 VS Code 界面右上角的播放按钮，选择 <code>Run C/C++ File</code>，在弹出的窗口中，在系统上检测到的编译器列表中选择 <code>g++ 构建并调试活动文件</code>（<code>g++ build and debug active file</code>）。首次运行 C++ 文件时，系统只会提示选择一个编译器（此编译器将在 <code>tasks.json</code> 中设置为默认编译器）。</p>
<p>当然，你也可以按下 <code>Ctrl + Shift + D</code>，在左侧 <code>运行和调试</code> 窗口中创建 <code>launch.json</code>：如果你的工作区中已经有 <code>launch.json</code> 文件，按下播放按钮后 VS Code 会自动读取它以确定如何运行和调试你的 C++ 代码，否则 VS Code 只会创建一个临时的配置。（详情见此处：<a href="https://code.visualstudio.com/docs/cpp/config-wsl">code.visualstudio.com, Using C++ and WSL in VS Code</a>）</p>
<p>这里另外推荐 <a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner">Code Runner</a> 插件，并在自己的工作区内（不建议全局修改配置，即只在工作区 <code>.vscode/settings.json</code> 中修改）使用以下配置：</p>
<pre><code>{
  "code-runner.runInTerminal": true,
  "code-runner.clearPreviousOutput": true,
  "code-runner.fileDirectoryAsCwd": true,
  "code-runner.executorMap": {
    "c": "gcc $fileName -o $fileNameWithoutExt &amp;&amp; $dir$fileNameWithoutExt",
    "cpp": "g++ $fileName -o build/$fileNameWithoutExt &amp;&amp; $dir/build/$fileNameWithoutExt"
  },
  "code-runner.preserveFocus": false,
  "code-runner.saveFileBeforeRun": true
}
</code></pre>
<p>具体设置项释义在此不赘述。</p>
<p>最后，通过 <code>Ctrl + Alt + N</code> 快捷键，你就可以快捷地编译运行当前编辑器中打开的代码文件。如果你需要调试代码，只需要使用右上角的播放按钮进行调试。</p>
<hr />
<h2>参考资料</h2>
<ol>
<li><a href="https://code.visualstudio.com/docs/remote/wsl">code.visualstudio.com, Developing in WSL.</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl">marketplace.visualstudio.com, Visual Studio Code WSL</a></li>
<li><a href="https://code.visualstudio.com/blogs/2019/09/03/wsl2">code.visualstudio.com, WSL 2 with Visual Studio Code</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows/wsl/basic-commands">learn.microsoft.com, Basic commands for WSL</a></li>
<li><a href="https://code.visualstudio.com/docs/cpp/config-wsl">code.visualstudio.com, Using C++ and WSL in VS Code</a></li>
<li><a href="https://prinsss.github.io/vscode-c-cpp-configuration-for-acm-oj/">prinsss.github.io, 使用 VS Code 搭建适用于 ACM 练习的 C/C++ 开发环境</a></li>
</ol>
]]></content>
        <author>
            <name>David Ye</name>
            <uri>https://ydysd.top/</uri>
        </author>
        <published>2025-07-04T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[计算机科学与数学中的常用 LaTeX 数学字体整理]]></title>
        <id>https://ydysd.top/posts/common-latex-math-fonts-in-cs/</id>
        <link href="https://ydysd.top/posts/common-latex-math-fonts-in-cs/"/>
        <updated>2026-01-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[蒋启芬. 线性代数[M]. 机械工业出版社, 2020. 向量 α：$\boldsymbol{\alpha}$ 矩阵 A：$\boldsy...]]></summary>
        <content type="html"><![CDATA[<h2>一些特殊字体在权威出版物中的使用情况整理</h2>
<ul>
<li><strong>蒋启芬. 线性代数[M]. 机械工业出版社, 2020.</strong>
<ul>
<li>向量 α：$\boldsymbol{\alpha}$</li>
<li>矩阵 A：$\boldsymbol{A}$</li>
<li>线性空间 V：$V$</li>
<li>线性变换 A：$\mathscr A$，即 <code>MATHEMATICAL ROUNDHAND CAPITAL A</code></li>
</ul>
</li>
<li><strong>周志华. 机器学习[M]. 清华大学出版社, 2016.</strong>
<ul>
<li>向量 x：$\boldsymbol{x}$</li>
<li>变量集 x：$\mathbf{x}$</li>
<li>矩阵 A：$\mathbf{A}$</li>
<li>样本空间或状态空间 X：</li>
<li>概率分布 D：$\mathcal D$</li>
<li>数据样本（数据集）D：$D$</li>
<li>假设空间 H：$\mathcal H$</li>
<li>假设集 H：$H$</li>
<li>学习算法 L：$\mathfrak L$，哥特体，<code>\mathfrak L</code></li>
<li>指示函数：$\mathbb{I}(\cdot)$，<code>\mathbb{I}(\cdot)</code></li>
</ul>
</li>
<li><strong>张. 动手学深度学习 PyTorch版 = Dive into deep learning[M]. 人民邮电出版社, 2023.</strong>
<ul>
<li>向量 x：$\mathbf{x}$</li>
<li>矩阵 X：$\mathbf{X}$</li>
<li>张量 X：$\mathsf{X}$，无衬线体，<code>\mathsf x</code></li>
<li>集合 X：$\mathcal X$</li>
<li>指示函数：$\mathbf{1}_\mathcal{X}$，<code>\mathbf{1}_\mathcal{X}</code></li>
</ul>
</li>
<li><strong>GB/T 3102.11-1993：物理科学和技术中使用的数学符号</strong>
<ul>
<li>变量、变动附标、函数：斜体字母，如 $f_i(x,y)$</li>
<li>点、线段、弧：斜体字母</li>
<li>在特定场合中视为常数的参数：斜体字母</li>
<li>有定义的已知函数：正体字母，如 $\exp{(x)}$、$\sin{x}$</li>
<li>其值不变的数学常数：正体字母，如 $\mathrm{e}=2.718\cdots$</li>
<li>已定义的算子：正体字母，如 $\frac{\mathrm{d}f}{\mathrm{d}x}$</li>
<li>向量 a：$\boldsymbol{a}$ 或者 $\vec{a}$</li>
<li>矩阵 A：$\boldsymbol{A}$</li>
<li>二阶张量 T： $\boldsymbol{T}$ 或者 $\vec{\vec{T}}$</li>
</ul>
</li>
</ul>
<h2>特殊符号字体格式速查表</h2>
<table>
<thead>
<tr>
<th><strong>LaTeX 符号</strong></th>
<th><strong>字体名称</strong></th>
<th><strong>常用含义</strong></th>
<th><strong>LaTeX 源码</strong></th>
<th><strong>备注</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>$\mathcal L$</td>
<td>花体字（Calligraphic letter）</td>
<td>损失函数</td>
<td><code>\mathcal L</code></td>
<td></td>
</tr>
<tr>
<td>$\mathcal O$</td>
<td>花体字（Calligraphic letter）</td>
<td>时间复杂度</td>
<td><code>\mathcal O</code></td>
<td></td>
</tr>
<tr>
<td>$\mathcal D$</td>
<td>花体字（Calligraphic letter）</td>
<td>样本集</td>
<td><code>\mathcal D</code></td>
<td></td>
</tr>
<tr>
<td>$\mathcal N$</td>
<td>花体字（Calligraphic letter）</td>
<td>高斯分布</td>
<td><code>\mathcal N</code></td>
<td></td>
</tr>
<tr>
<td>$\mathbb R$</td>
<td>板粗体（Blackboard bold font）</td>
<td>实数集</td>
<td><code>\mathbb R</code></td>
<td>亦可作正体（罗马体）粗体 $\mathbf{R}$</td>
</tr>
<tr>
<td>$\ell$</td>
<td></td>
<td>将小写 L/l、大写 I/i 和数字 1 区分</td>
<td><code>\ell</code></td>
<td></td>
</tr>
<tr>
<td>$\nabla$</td>
<td></td>
<td>nabla 算子</td>
<td><code>\nabla</code></td>
<td></td>
</tr>
<tr>
<td>$\mathrm{d}$</td>
<td>罗马体/正体</td>
<td>微分</td>
<td><code>\mathrm{d}</code></td>
<td></td>
</tr>
<tr>
<td>$\sin$</td>
<td></td>
<td>正弦函数</td>
<td><code>\sin</code></td>
<td>最好不写<code>\mathrm{sin}</code></td>
</tr>
<tr>
<td>$\mathbf{A}$</td>
<td>罗马体/正体 加粗</td>
<td>矩阵</td>
<td><code>\mathbf{x}</code></td>
<td>国标是斜体加粗</td>
</tr>
<tr>
<td>$\boldsymbol{\theta}$</td>
<td>斜体加粗</td>
<td>矢量或向量</td>
<td><code>\boldsymbol{theta}</code></td>
<td></td>
</tr>
</tbody>
</table>
<p>使用某些数学字体样式需要在文档序言中添加 <code>\usepackage{amssymb}</code> ：有关更多信息，请参阅 <a href="https://ctan.org/pkg/amsfonts"><code>amsfonts</code> 包</a>。</p>
<p>另外，<code>\mathcal{}</code> 和 <code>\mathscr{}</code> 有时有区别，有时没区别，这取决于你的 $\LaTeX$ 文档配置。</p>
<p>参见：<a href="https://zhuanlan.zhihu.com/p/569922028">https://zhuanlan.zhihu.com/p/569922028</a>、<a href="https://devblogs.microsoft.com/math-in-office/unicode-math-calligraphic-alphabets/">https://devblogs.microsoft.com/math-in-office/unicode-math-calligraphic-alphabets/</a> 和 <a href="https://www.unicode.org/L2/L2020/20275r-math-calligraphic.pdf">https://www.unicode.org/L2/L2020/20275r-math-calligraphic.pdf</a>。</p>
<ul>
<li>
<p>a <strong>chancery</strong> L: $\mathcal L$, $\mathcal{ABCDEFGabcdefg }$, aka Caligraphic style.</p>
</li>
<li>
<p>a <strong>roundhand</strong> L: $\mathscr L$, $\mathscr{ABCDEFGabcdefg }$, aka Script style.</p>
</li>
</ul>
<h2>其他示例</h2>
<p>行内公式: $E = mc^2$</p>
<p>自定义宏: $\R$ 表示实数集，$\N$ 表示自然数集</p>
<p>块级公式: $$\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$$</p>
<p>带编号的公式:</p>
<p>$$
\begin{equation} F = ma \end{equation}
$$</p>
<p>物理公式: $\vec{F} = m\vec{a}$</p>
<h2>参考资料</h2>
<h3>主要参考</h3>
<ol>
<li><a href="https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=3DE79450D562E62D41CB6E79FF411054">国家标准|GB/T 3102.11-1993</a></li>
<li><a href="https://www.overleaf.com/learn/latex/Mathematical_fonts">Mathematical fonts - Overleaf, Online LaTeX Editor</a></li>
<li><a href="https://oi-wiki.org/intro/symbol/">数学符号表 - OI Wiki</a></li>
<li><a href="https://www.deeplearningbook.org/contents/notation.html">Ian Goodfellow and Yoshua Bengio and Aaron Courville, Deep Learning, MIT Press</a></li>
</ol>
<h3>其他</h3>
<ol>
<li>https://blog.csdn.net/qq_18846849/article/details/130631476</li>
<li>https://quicy.notion.site/0910aaa654f14cab9443cc5a8366d712</li>
<li>https://toddzhoufeng.github.io/document/2019/07/20/latex-tutorial/</li>
<li>https://www.latexstudio.net/archives/51494.html</li>
</ol>
]]></content>
        <author>
            <name>David Ye</name>
            <uri>https://ydysd.top/</uri>
        </author>
        <published>2025-03-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[解决 Ubuntu 中 apt 的更新文件配置多次导致无法更新的问题]]></title>
        <id>https://ydysd.top/posts/how-to-solve-ubuntu-apt-update-problem/</id>
        <link href="https://ydysd.top/posts/how-to-solve-ubuntu-apt-update-problem/"/>
        <updated>2026-01-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在终端中输入 apt update，错误提示类似 W: 目标 DEP-11 (partner/dep11/Components-amd64...]]></summary>
        <content type="html"><![CDATA[<h2>问题细节</h2>
<p>在终端中输入 <code>apt update</code>，错误提示类似 <code>W: 目标 DEP-11 (partner/dep11/Components-amd64.yml) 在 /etc/apt/sources.list:44 和 /etc/apt/sources.list:87中被配置了多次</code> 且无法更新。</p>
<h2>解决方法</h2>
<p>一种方案就是手动在 <code>sources.list</code> 里注释掉提示错误的那几行。</p>
<p>但如果错误有很多条，可以使用脚本来解决，这里有一个在 GitHub 上开源的脚本：</p>
<p>::github{repo="davidfoerster/aptsources-cleanup"}</p>
<p>按照 readme 教程操作即可。</p>
]]></content>
        <author>
            <name>David Ye</name>
            <uri>https://ydysd.top/</uri>
        </author>
        <published>2021-03-22T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[MathJax 3 全新版本配置指南]]></title>
        <id>https://ydysd.top/posts/how-to-configure-mathjax3/</id>
        <link href="https://ydysd.top/posts/how-to-configure-mathjax3/"/>
        <updated>2026-01-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[忽然发现 MathJax 版本号更新到 3.X 了，而中文互联网是竟然还没多少配置最新版本 MathJax 的相关教程，于是乎我就去官方文档...]]></summary>
        <content type="html"><![CDATA[<h2>写在前面</h2>
<p>忽然发现 <em>MathJax</em> 版本号更新到 <em>3.X</em> 了，而中文互联网是竟然还没多少配置最新版本 <em>MathJax</em> 的相关教程，于是乎我就去官方文档扒了扒。</p>
<h2>更新了什么</h2>
<p>根据其官方文档的说法，相比于 <em>MathJax 2.X</em> 版本，<em>3.X</em> 版本可谓是变化极大。从在你的网页头部引入配置它的时候，就不再需要引入一个完整的 <code>MathJax.js</code> 文件，还需要加个 <code>?config=</code> 以使用组合配置了。当你打开某个提供开源前端CDN加速服务的网站，会发现 <em>MathJax</em> 有几十个供选择的配置文件，而你只需加载你需要的一个，以避免多个文件传输，还能同步使用。也就是更加<strong>模块化</strong>了。</p>
<h2>引入并配置 MathJax 3</h2>
<h3>引入</h3>
<p>刚起步，我们直接在页头脚本处引入最通用但也是最大的一个文件 <code>tex-mml-chtml.js</code>（也可以选择文件名带 <code>.min.js</code> 的压缩后文件）。</p>
<pre><code>&lt;script type="text/javascript" id="MathJax-script" async
  src="https://cdn.bootcdn.net/ajax/libs/mathjax/3.1.2/es5/tex-mml-chtml.min.js"&gt;
&lt;/script&gt;
</code></pre>
<h3>配置</h3>
<p>现在不能用老版本里 <code>MathJax.Hub.Config({})</code> 像 <em>JSON</em> 一样配置了，而是直接用 <code>MathJax = {}</code>。之后就和老版本一样配置了，我还是按老习惯用美元符号作为分隔符。这里还是用内联脚本的形式配置。</p>
<pre><code>&lt;script&gt;
MathJax = {
  tex: {
    inlineMath: [['$', '$']], //行内公式
    displayMath: [['$$','$$']] //段内公式
  }
  svg: {
    fontCache: 'global'
  }
};
&lt;/script&gt;
</code></pre>
<p>要多来几个分隔符？写成诸如 <code>[['$','$'], ['//','//']]</code> 这样就可以。注意逗号别忘记加。</p>
<h3>从旧版本的配置迁移</h3>
<p>你不需要重新写一份，官方提供了一个转换工具，只需将原来的配置粘贴，就能得到新版本的配置了。链接在此：</p>
<p>https://mathjax.github.io/MathJax-demos-web/convert-configuration/convert-configuration.html</p>
<p>最终成果：</p>
<pre><code>&lt;link rel="dns-prefetch" href="https://cdn.bootcdn.net" /&gt;
&lt;link rel="dns-prefetch" href="https://cdn.mathjax.org" /&gt;
&lt;script&gt;
    MathJax = {
        tex: {
            inlineMath: [
                ["$", "$"]
            ], //行内公式选择$
            displayMath: [
                ["$$", "$$"]
            ], //段内公式选择$$
            processEscapes: true,
            autoload: {
                color: [],
                colorv2: ['color']
            },
            packages: {
                '[+]': ['noerrors', 'extpfeil', 'mhchem']
            }
        },
        svg: {
            fontCache: 'global'
        }
        options: {
            skipHtmlTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code', 'a'], //避开某些标签
            ignoreHtmlClass: 'tex2jax_ignore',
            processHtmlClass: 'tex2jax_process'
        },
        chtml: {
            matchFontHeight: false
        },
        loader: {
            load: ['[tex]/noerrors', '[tex]/extpfeil', '[tex]/mhchem']
        }
    };
&lt;/script&gt;
&lt;script type="text/javascript" id="MathJax-script" async
    src="https://cdn.bootcdn.net/ajax/libs/mathjax/3.1.2/es5/tex-mml-chtml.min.js"&gt;
&lt;/script&gt;
</code></pre>
]]></content>
        <author>
            <name>David Ye</name>
            <uri>https://ydysd.top/</uri>
        </author>
        <published>2021-01-23T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[数学公式前端库 MathJax 的配置]]></title>
        <id>https://ydysd.top/posts/how-to-configure-mathjax/</id>
        <link href="https://ydysd.top/posts/how-to-configure-mathjax/"/>
        <updated>2026-01-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[你可以根据服务端和客户端的网络状况选择合适的 CDN 服务器来引入。感谢国内免费CDN服务：BootCDN 详情在文后有提到。这是个 <sc...]]></summary>
        <content type="html"><![CDATA[<h2>引入</h2>
<p>你可以根据服务端和客户端的网络状况选择合适的 CDN 服务器来引入。</p>
<h3>官方CDN</h3>
<pre><code>&lt;script type="text/javascript" async src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"&gt;&lt;/script&gt;
</code></pre>
<h3>BootCDN</h3>
<pre><code>&lt;script type="text/javascript" async src="https://cdn.bootcss.com/mathjax/2.7.7/MathJax.js?config=TeX-AMS-MML_HTMLorMML"&gt;&lt;/script&gt;
</code></pre>
<p><em>感谢国内免费CDN服务：<strong><a href="https://www.bootcdn.cn/">BootCDN</a></strong></em></p>
<h3>有问题？</h3>
<h4>“?config=”是什么</h4>
<p>详情在文后有提到。</p>
<h4>“async”是什么</h4>
<p>这是个 <code>&lt;script&gt;</code> 标签的属性，表示异步执行该脚本。仅对有 <code>src</code> 属性的脚本有作用，也就是说对内联脚本（无 <code>src</code> 属性的）无作用。</p>
<h2>配置</h2>
<p>引入 MathJax 之后，就可以配置它了。</p>
<p>官方文档中提到，主要可以通过使用外联配置文件和在 <code>&lt;script&gt;</code> 中内联配置两种方法来配置。</p>
<h3>外联配置</h3>
<p>你可能已经注意到，在其他的 MathJax 配置教程引入库的代码中，链接后都带有一个 <code>?config=</code> 参数，而参数值在许多教程里各不相同。比如这样：<code>https://cdn.bootcss.com/mathjax/2.7.7/MathJax.js?config=TeX-AMS-MML_HTMLorMML</code>。
这个参数其实就是指定预编译的配置文件的，那么这个参数值有有何不同呢？</p>
<p>大概有这么几种参数值（配置文件）：</p>
<ul>
<li><code>TeX-MML-AM_CHTML</code></li>
<li><code>TeX-MML-AM_HTMLorMML</code></li>
<li><code>TeX-MML-AM_SVG</code></li>
<li><code>TeX-AMS-MML_HTMLorMML</code></li>
<li><code>TeX-AMS_CHTML</code></li>
<li><code>TeX-AMS_SVG</code></li>
<li><code>TeX-AMS_HTML</code></li>
<li><code>TeX-AMS-MML_SVG</code></li>
<li><code>MML_CHTML</code></li>
<li><code>MML_SVG</code></li>
<li><code>MML_HTMLorMML</code></li>
<li><code>AM_CHTML</code></li>
<li><code>AM_SVG</code></li>
<li><code>AM_HTMLorMML</code></li>
<li><code>default</code></li>
</ul>
<p>每个预编译的配置文件都会加载特定的预处理器、输入处理器、输出处理器和扩展。另外，如果你把它指定为 <code>default</code> 的话，它就会加载几乎所有的配置以及解释器，然后就可以自己定制。你还可以通过在配置末尾加上“<code>-full</code>”来加载完整版（对应的标准版不加载实现代码），不过对于偶尔使用一下就没有必要了。</p>
<p>这里使用的 <code>TeX-AMS-MML_HTMLorMML</code> 等同于内联配置中的：</p>
<pre><code>MathJax.Hub.Config({
    config: ["MMLorHTML.js"],
    jax: ["input/TeX","input/MathML","output/HTML-CSS","output/NativeMML", "output/PreviewHTML"],
    extensions: ["tex2jax.js","mml2jax.js","MathMenu.js","MathZoom.js", "fast-preview.js", "AssistiveMML.js", "a11y/accessibility-menu.js"],
    TeX: {
        extensions: ["AMSmath.js","AMSsymbols.js","noErrors.js","noUndefined.js"]
    }
});
</code></pre>
<p>因此，你也可以直接在内联配置中配置。</p>
<h3>内联配置</h3>
<p>你需要在 <code>MathJax.Hub.Config()</code> 函数中加载配置。</p>
<p>你还需要在包含 <code>MathJax.Hub.Config()</code> 的 <code>&lt;script&gt;</code> 标签上带上 <code>type="text/x-mathjax-config"</code>。</p>
<p>需要注意的是，这个配置的 <code>&lt;script&gt;</code> 必须放在引入的 <code>&lt;script&gt;</code> 之前。
也就是这样：</p>
<pre><code>&lt;script type="text/x-mathjax-config"&gt;
    MathJax.Hub.Config();
&lt;/script&gt;
&lt;script type="text/javascript" async src="https://cdn.bootcss.com/mathjax/2.7.7/MathJax.js?config=TeX-AMS-MML_HTMLorMML"&gt;&lt;/script&gt;
</code></pre>
<h4>详细配置说明</h4>
<pre><code>MathJax.Hub.Config({
    showProcessingMessages: false, //关闭js加载过程信息
    messageStyle: "none", //不显示信息
    extensions: ["tex2jax.js"],
    jax: ["input/TeX", "output/HTML-CSS"],
    tex2jax: {
        inlineMath: [["$", "$"]], //行内公式选择$
        displayMath: [["$$", "$$"]], //独立段落公式选择$$
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code', 'a'], //避开某些标签
        processEscapes: true
    },
    "HTML-CSS": {
        availableFonts: ["STIX", "TeX"], //可选字体
        showMathMenu: false //关闭右击菜单显示
    },
    TeX: {
        extensions: ["AMSmath.js", "AMSsymbols.js", "extpfeil.js", "mhchem.js"] //一些写化学式的包
    },
    CommonHTML: {
        matchFontHeight: false
    }
});
</code></pre>
<p>大概如图所示了，你可以自行修改。</p>
<h3>更多的优化配置</h3>
<h4>约束识别范围</h4>
<p>目的是只让脚本识别 WordPress 文章内容里的公式识别符。</p>
<p>首先获取当前文章 id，赋值给变量 <code>mathId</code>：</p>
<pre><code>var mathId = document.getElementById("post-content");
</code></pre>
<p>然后在配置 <code>MathJax.Hub.Config()</code> 之后加上：</p>
<pre><code>MathJax.Hub.Queue(["Typeset",MathJax.Hub,mathId]);
</code></pre>
<p>意思就是只在 id 为 <code>post-content</code> 的标签内去识别。</p>
<p>你也可以在 <code>MathJax.Hub.Config()</code> 里加上：</p>
<pre><code>skipTags: ['script', 'noscript', 'style', 'textarea', 'pre','code','a']
</code></pre>
<p>意思就是不识别这些标签里的文本。</p>
<h4>去除公式周围的蓝框</h4>
<p>css 里加上：</p>
<pre><code>.MathJax{outline:0;}
</code></pre>
<h2>注意事项</h2>
<p>以上配置仅作参考，请根据自己的实际情况选择。</p>
<h3>兼容性问题</h3>
<p><code>getElementById()</code> 的传入参数需要根据自己的实际情况选择，大概是把需要渲染的标签id输入即可。</p>
<p>比如这个示例， WordPress 的正文部分的标签id大概是“post-57”，“57”即为文章id。所以需要先 <code>document.getElementById("post-content")</code> 获取一下。</p>
<pre><code>var mathId = document.getElementById("post-content"); //获取当前文章id
window.MathJax.Hub.Queue(["Typeset", MathJax.Hub, document.getElementById(mathId)]); //如果不传入第三个参数，则渲染整个document
</code></pre>
<h2>最后</h2>
<pre><code>&lt;link rel="dns-prefetch" href="https://cdn.bootcss.com" /&gt;
&lt;link rel="dns-prefetch" href="https://cdn.mathjax.org" /&gt;
&lt;script type="text/x-mathjax-config"&gt;
    var mathId = document.getElementById("post-content"); //选择公式识别范围
    MathJax.Hub.Config({
        showProcessingMessages: false, //关闭js加载过程信息
        messageStyle: "none", //不显示信息
        extensions: ["tex2jax.js"],
        jax: ["input/TeX", "output/HTML-CSS"],
        tex2jax: {
            inlineMath:  [ ["$", "$"] ], //行内公式选择$
            displayMath: [ ["$$","$$"] ], //段内公式选择$$
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre','code','a'], //避开某些标签
            processEscapes: true
        },
        "HTML-CSS": {
            availableFonts: ["STIX","TeX"], //可选字体
            showMathMenu: false //关闭右击菜单显示
        },
        TeX: {
            extensions: ["AMSmath.js","AMSsymbols.js","extpfeil.js","mhchem.js"] //化学式
        },
        CommonHTML: {
            matchFontHeight: false
        }
    });
    MathJax.Hub.Queue(["Typeset",MathJax.Hub,mathId]);
&lt;/script&gt;
&lt;script data-no-instant&gt;
    InstantClick.on('change', function (isInitialLoad) {
        if (isInitialLoad === false) {
            if (typeof MathJax !== 'undefined') {
                var mathId = document.getElementById("post-content");
                MathJax.Hub.Queue(["Typeset", MathJax.Hub, mathId]);
            }
        }
    });
    InstantClick.init();
&lt;/script&gt;
&lt;script type="text/javascript" async
    src="https://cdn.bootcss.com/mathjax/2.7.7/MathJax.js?config=TeX-AMS-MML_HTMLorMML"&gt;&lt;/script&gt;
</code></pre>
<hr />
<h2>参见</h2>
<h3>MathJax官网</h3>
<p><a href="https://www.mathjax.org/">MathJax | Beautiful math in all browsers.</a></p>
<h3>CDN来源</h3>
<p><a href="https://www.bootcdn.cn/">BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务</a></p>
<h3>部分代码参考</h3>
<p><a href="https://docs.mathjax.org/en/v2.7-latest/index.html">MathJax Documentation — MathJax 2.7 documentation</a></p>
<p><a href="https://segmentfault.com/a/1190000008317350">前端整合MathjaxJS的配置笔记</a> <em>2017-02-20</em></p>
<p><a href="https://juejin.im/post/5bb60837e51d450e805b7d97">MathJax: 让前端支持数学公式</a> <em>2018-10-04</em></p>
<h3>其他</h3>
<p><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/script#%E5%B1%9E%E6%80%A7">https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/script#%E5%B1%9E%E6%80%A7</a></p>
]]></content>
        <author>
            <name>David Ye</name>
            <uri>https://ydysd.top/</uri>
        </author>
        <published>2020-04-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Bilibili 视频封面下载链接获取]]></title>
        <id>https://ydysd.top/posts/how-to-download-bilibili-video-covers/</id>
        <link href="https://ydysd.top/posts/how-to-download-bilibili-video-covers/"/>
        <updated>2026-01-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在Bilibili视频页面，使用开发者工具，可以看到Bilibili的api服务器（api.bilibili.com）。通过英文翻译粗略判断...]]></summary>
        <content type="html"><![CDATA[<h2>获取API</h2>
<p>在Bilibili视频页面，使用开发者工具，可以看到Bilibili的api服务器（<code>api.bilibili.com</code>）。</p>
<p><img src="http://qiniu.pic.ydysd.top/img/2020/2020_how-to-download-bilibili-video-covers_1.jpg" alt="示例：视频av19390801中使用开发者工具查看" /></p>
<p>通过英文翻译粗略判断各个api的用途，然后再在Network选项卡中，一个个过滤慢慢找，找到那个可以返回所有视频基本信息的api。</p>
<p><img src="http://qiniu.pic.ydysd.top/img/2020/2020_how-to-download-bilibili-video-covers_2.jpg" alt="找到这个能返回视频封面的api" /></p>
<p>好了，这样就找到了这个能返回视频封面的api了。api地址：https://api.bilibili.com/x/web-interface/view</p>
<table>
<thead>
<tr>
<th>参数</th>
<th>值</th>
<th>猜测用途</th>
</tr>
</thead>
<tbody>
<tr>
<td>aid</td>
<td>19390801</td>
<td>视频av号</td>
</tr>
<tr>
<td>cid</td>
<td>31621681</td>
<td>不知道</td>
</tr>
</tbody>
</table>
<p>测试一下：<code>https://api.bilibili.com/x/web-interface/view?aid=19390801</code></p>
<p>返回了一个很长很长的json：</p>
<pre><code>{"code":0,"message":"0","ttl":1,"data":{"bvid":"","aid":19390801,"videos":1,"tid":22,"tname":"鬼畜调教","copyright":1,"pic":"http://i0.hdslb.com/bfs/archive/d52994a1876d07a975dc6683b78a898d9b581208.png","title":"【春晚鬼畜】赵本山：我就是念诗之王！【改革春风吹满地】","pubdate":1518339644,"ctime":1518230987,"desc":"小时候每次吃完年夜饭，都会急急忙忙跑回自己房间跟朋友玩彩虹岛，街头篮球，泡泡堂，极品飞车，CS。一旦听到外面大人们喊“哦！赵本山来咯！”，就马上暂停手上的游戏赶紧跑出去看。对我来说没有赵本山的春晚根本不是春晚。\n鬼畜本家：av18521530\n【举起手来】花姑娘又要吸旺仔牛奶！\nby @疯猴pme","state":0,"attribute":16384,"duration":152,"rights":{"bp":0,"elec":0,"download":1,"movie":0,"pay":0,"hd5":0,"no_reprint":0,"autoplay":1,"ugc_pay":0,"is_cooperation":0,"ugc_pay_preview":0,"no_background":0},"owner":{"mid":353246678,"name":"UP-Sings","face":"http://i1.hdslb.com/bfs/face/224815f69567dfbdacffc64185b89568bf8da0f3.jpg"},"stat":{"aid":19390801,"view":51436661,"danmaku":372199,"reply":98581,"favorite":1772810,"coin":2432147,"share":975376,"now_rank":0,"his_rank":3,"like":2143394,"dislike":0,"evaluation":""},"dynamic":"不管今年春晚有没有本山叔，鬼畜区总归是有的！","cid":31621681,"dimension":{"width":0,"height":0,"rotate":0},"no_cache":false,"pages":[{"cid":31621681,"page":1,"from":"vupload","part":"P1","duration":152,"vid":"","weblink":"","dimension":{"width":0,"height":0,"rotate":0}}],"subtitle":{"allow_submit":false,"list":[]}}}
</code></pre>
<p>格式化一下：</p>
<p><img src="http://qiniu.pic.ydysd.top/img/2020/2020_how-to-download-bilibili-video-covers_3.jpg" alt="格式化的 JSON" /></p>
<p>嗯，<code>json.data.pic</code>里的字符串就是封面图像url啦。</p>
<p>丢给requests就可以啦，别忘了把<code>user-agent</code>带上。</p>
<pre><code>import requests
def main(aid):
    url = 'https://api.bilibili.com/x/web-interface/view?aid='+str(aid)
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
    av_data = requests.get(url, headers=headers)
    av_data.encoding = 'utf-8'
    dict_avdata = av_data.json()
    if dict_avdata['code'] == 0:
        return "封面下载链接：" + dict_avdata['data']['pic']
    else:
        return 'Video 404'
if __name__ == "__main__":
    print(main(10492)) # 函数传入的参数就是av号
</code></pre>
]]></content>
        <author>
            <name>David Ye</name>
            <uri>https://ydysd.top/</uri>
        </author>
        <published>2020-01-29T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[KaTeX 在 WordPress 中的使用]]></title>
        <id>https://ydysd.top/posts/how-to-use-katex-on-wordpress/</id>
        <link href="https://ydysd.top/posts/how-to-use-katex-on-wordpress/"/>
        <updated>2026-01-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[如何在 Web 上渲染数学公式？首先我们需要的就是一个数学公式渲染库，比如 LaTeX、KaTeX、MathJax 等等，再开始之前，先介绍...]]></summary>
        <content type="html"><![CDATA[<h2>0.前言</h2>
<p>如何在 Web 上渲染数学公式？首先我们需要的就是一个数学公式渲染库，比如 LaTeX、KaTeX、MathJax 等等，再开始之前，先介绍一下它们的区别：</p>
<h3>TeX</h3>
<p><a href="http://tug.org/">TeX</a> 是一个由美国计算机教授高德纳（Donald Ervin Knuth）编写的排版软件。由于它是开源的，所以就诞生了许多 TeX 的派生软件。</p>
<h4>LaTeX</h4>
<p><a href="https://www.latex-project.org/">LaTeX</a> 是一种基于 TeX 的排版系统，TeX 就是它的格式化引擎。它比 Tex 更加结构化，也更易于用户使用。</p>
<h4>KaTeX</h4>
<p><a href="https://katex.org/">KaTeX</a> 与 LaTeX 类似，布局基于 TeX，但它是一个 JavaScript 库，最初由可汗学院开发。</p>
<p>相对于 MathJax，它的一个优点就是能在服务端渲染，可以用 Node.js 预先渲染再以纯 HTML 返回给客户端。</p>
<h4>MathJax</h4>
<p><a href="https://www.mathjax.org/">MathJax</a> 是一个能使用 MathML、LaTeX 和 ASCIIMathML 标记在 Web 浏览器中显示数学符号的 JavaScript 库，公式使用 JavaScript 引擎解析成 HTML、SVG 再到浏览器上显示。 （说人话就是这东西是一个可以用 latex 的公式引擎）</p>
<h3>与 Microsoft Office Word、Markdown 的区别</h3>
<p>相比于 Markdown 和 Word，以上公式渲染库就更加专业化，学习成本也更高。</p>
<h2>1.安装插件</h2>
<p>目前 WordPress 插件商店中有 <a href="https://wordpress.org/plugins/wp-katex/">WP-KaTeX</a> 和 <a href="https://wordpress.org/plugins/katex/">KaTeX</a> 这两个支持 KaTeX 的插件，这里使用 WP-KaTeX 为例（其实大同小异）。直接在商店中搜索关键词并安装即可。</p>
<h2>2.在文章中显示数学公式</h2>
<h3>使用短代码</h3>
<p>根据插件页面的介绍，我们可以知道可以在文章中插入 <code>[latex]</code> 短代码，即可显示公式。</p>
<p>&lt;img src="http://qiniu.pic.ydysd.top/img/2020/2020_how-to-use-katex-on-wordpress_1.jpg" alt="WP-KaTeX 插件在 WordPress 插件库的界面" style="zoom:50%;" /&gt;</p>
<h3>短代码属性</h3>
<table>
<thead>
<tr>
<th>属性名</th>
<th>默认值</th>
<th>可选值</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>display</code></td>
<td><code>false</code></td>
<td><code>true</code>/<code>false</code></td>
<td>值为 <code>true</code>，则公式将单行显示；值为<code>false</code>，则公式将在段落中内联显示。</td>
</tr>
</tbody>
</table>
<h3>WP-KaTeX 插件更改短代码标识</h3>
<p>这款插件的短代码用了 <code>[latex]</code>，如果要改成<code>[katex]</code>，可以参考插件评论中 WordPress 用户 <a href="https://profiles.wordpress.org/giannit">giannit</a> 的评论：</p>
<p>&lt;img src="http://qiniu.pic.ydysd.top/img/2020/2020_how-to-use-katex-on-wordpress_2.jpg" alt="WordPress 用户 giannit 的评论截图" style="zoom:50%;" /&gt;</p>
<blockquote>
<p>在 <code>wp-content\plugins\wp-katex\scripts\frontend.php</code> 在第 41 行编辑文件，更改<code>add_shortcode( 'latex', 'katex_handler' );</code>为<code>add_shortcode( 'katex', 'katex_handler' );</code>即可。</p>
<p><em>翻译自 WordPress 用户 <a href="https://profiles.wordpress.org/giannit">giannit</a> 的评论（节选）</em></p>
</blockquote>
<hr />
<h2>参考资料</h2>
<h3>Wikipedia</h3>
<p>https://zh.wikipedia.org/wiki/TeX</p>
<p>https://zh.wikipedia.org/wiki/KaTeX</p>
<p>https://zh.wikipedia.org/wiki/LaTeX</p>
<p>https://zh.wikipedia.org/wiki/MathJax</p>
]]></content>
        <author>
            <name>David Ye</name>
            <uri>https://ydysd.top/</uri>
        </author>
        <published>2020-01-27T00:00:00.000Z</published>
    </entry>
</feed>