% !TeX root = ../install-latex-guide-zh-cn.tex

\chapter{有关 Ubuntu 和 WSL 的补充}\label{chp:appendix:addition}

\section{更换 Ubuntu 24.04 源}\label{sec:addition:source}

鉴于大陆网络现状,
建议更换 Ubuntu 24.04 源至国内,
例如更换至清华大学.
在 \textsf{Terminal} 中执行
\begin{lstlisting}[deletekeywords = apt]
  sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
\end{lstlisting}
备份 \texttt{ubuntu.sources} 文件.
接下来执行
\begin{lstlisting}[deletekeywords = apt]
  sudo gedit /etc/apt/sources.list.d/ubuntu.sources
\end{lstlisting}
将文件替换为以下内容%
\footnote{本段文字可至%
\href{https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/}{清华大学镜像网站}%
获取}
\begin{lstlisting}[
  morekeywords = {deb, noble, noble-updates, noble-backports, noble-security},
  alsoletter = -]
  Types: deb
  URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
  Suites: noble noble-updates noble-backports
  Components: main restricted universe multiverse
  Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
  
  # 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释
  # Types: deb-src
  # URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
  # Suites: noble noble-updates noble-backports
  # Components: main restricted universe multiverse
  # Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
  
  # 以下安全更新软件源包含了官方源与镜像站配置，如有需要可自行修改注释切换
  Types: deb
  URIs: http://security.ubuntu.com/ubuntu/
  Suites: noble-security
  Components: main restricted universe multiverse
  Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
  
  # Types: deb-src
  # URIs: http://security.ubuntu.com/ubuntu/
  # Suites: noble-security
  # Components: main restricted universe multiverse
  # Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
  
  # 预发布软件源，不建议启用
  
  # Types: deb
  # URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
  # Suites: noble-proposed
  # Components: main restricted universe multiverse
  # Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
  
  # # Types: deb-src
  # # URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
  # # Suites: noble-proposed
  # # Components: main restricted universe multiverse
  # # Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
\end{lstlisting}
保存退出.
再执行
\begin{lstlisting}
  sudo apt update && sudo apt upgrade
\end{lstlisting}
换源并更新.
若更改错误,
可执行
\begin{lstlisting}[deletekeywords = apt]
  sudo cp /etc/apt/sources.list.d/ubuntu.sources.bak /etc/apt/sources.list.d/ubuntu.sources
\end{lstlisting}
恢复文件.

\section{安装字体}\label{sec:addition:font}

有用户指出,
Ubuntu 中安装字体比较麻烦.
这里给出一些常用的方法,
可供参考%
\footnote{关于此处字体的更多讨论请见%
  \href{https://github.com/OsbertWang/install-latex-guide-zh-cn/issues/75}{这里}.}.

\subsection{获取字体}

获取需要安装的字体文件,
可以分为两种情况.

\subsubsection{个人用户}

若只对个人用户开放字体使用,
可将字体文件保存在 \path{~/.local/share/fonts/} 路径下,
若路径不存在,
可以使用以下命令创建
\begin{lstlisting}
  mkdir -p ~/.local/share/fonts/
\end{lstlisting}
推荐将不同的字体文件保存在 \path{~/.local/share/fonts/} 的不同子路径中,
方便管理字体.
下述涉及路径的内容均类似,
不再重复.

WSL 用户甚至可以将字体文件保存在主系统路径中,
例如 \path{C:\ Users\ admin\ somefont },
然后对字体路径做链接
\begin{lstlisting}
  ln -s /mnt/c/Users/admin/somefont ~/.local/share/fonts/windows-fonts
\end{lstlisting}

\subsubsection{所有用户}

若对所有用户开放字体使用,
可将字体文件保存在 \path{/usr/local/share/fonts/} 路径下.
同样地,
可能需要创建目录
\begin{lstlisting}
  sudo mkdir -p /usr/local/share/fonts
\end{lstlisting}
再次推荐将不同的字体文件保存在不同的子路径中.
值得注意的是,
此时字体文件需要具有足够的读取权限,
例如对字体文件 "fontname" 和字体文件路径 "fontdirectory" 分别设置权限如下
\begin{lstlisting}
  sudo chmod 644 /usr/local/share/fonts/fontname
  sudo chmod -R 755 /usr/local/share/fonts/fontdirectory
\end{lstlisting}
这里设置 "644" 和 "755" 只为后续使用更便利,
严格来讲,
如果只涉及字体读取,
"444" 和 "555" 即可.

WSL 用户若要将主系统路径中的字体文件对所有用户开放字体使用,
可以做如下链接
\begin{lstlisting}
  sudo ln -s /mnt/c/Users/admin/somefont /usr/local/share/fonts/windows-somefonts
\end{lstlisting}

\subsection{使用 fontconfig}

对于绝大多数现代 TrueType (TTF),
OpenType (OTF) 等字体,
"fontconfig" 是唯一需要的工具.
在当代的 Ubuntu 系统中,
它已经默认安装,
若系统内没有安装它,
只需执行
\begin{lstlisting}
  sudo apt install fontconfig
\end{lstlisting}

在获取字体后,
使用 "fontconfig" 非常简单,
只需执行
\begin{lstlisting}
  fc-cache -fv
\end{lstlisting}
即可建立字体缓存,
注意刷新 \path{/usr/local/share/fonts/} 内的字体缓存时需要添加 "sudo".
随后执行
\begin{lstlisting}
  fc-list
\end{lstlisting}
即可见到目前可用的字体.

若不再需要已经安装的字体,
只需要直接删除,
例如
\begin{lstlisting}
  rm ~/.local/share/fonts/fontname
  sudo rm /usr/local/share/fonts/fontname
\end{lstlisting}
随后刷新缓存
\begin{lstlisting}
  fc-cache -fv
\end{lstlisting}
查看字体是否已经删除
\begin{lstlisting}
  fc-list
\end{lstlisting}

\subsection{使用 xfonts-utils}

此处介绍 "xfonts-utils" 只为补充,
它主要用于处理非常旧的 X11 位图字体 (pcf, bdf) 或某些特定的 Type1 字体场景,
普通用户安装现代字体几乎不需要它.

在当前版本的 Ubuntu 中,
"xfonts-utils" 并没有默认安装.
可直接使用以下命令安装
\begin{lstlisting}
  sudo apt install xfonts-utils
\end{lstlisting}

获取字体后,
通过以下命令建立字体缓存
\begin{lstlisting}
  mkfontscale
  mkfontdir
\end{lstlisting}
再次强调,
对于如今大部分字体文件而言,
已不再推荐使用 "xfonts-utils".

\subsection{直接安装源内字体}

实际上有部分字体可直接使用源进行安装,
如安装字体 Noto CJK
\begin{lstlisting}
  sudo apt install fonts-noto-cjk
  sudo apt install fonts-noto-cjk-extra
\end{lstlisting}
安装 Windows 系统中常见的字体 Andale Mono,
Arial Black,
Arial (Bold, Italic, Bold Italic),
Comic Sans MS (Bold),
Courier New (Bold, Italic, Bold Italic),
Georgia (Bold, Italic, Bold Italic),
Impact,
Times New Roman (Bold, Italic, Bold Italic),
Trebuchet (Bold, Italic, Bold Italic),
Verdana (Bold, Italic, Bold Italic),
Webdings
\begin{lstlisting}
  sudo apt install ttf-mscorefonts-installer
\end{lstlisting}
安装字体文泉驿正黑,
文泉驿微米黑,
文泉驿等宽微米黑,
文泉驿点阵宋体,
文泉驿点阵楷体
\begin{lstlisting}
  sudo apt install ttf-wqy-zenhei
\end{lstlisting}

\section{反向代理 PPA}\label{sec:addition:proxy}

这里介绍中科大的\href{https://mirrors.ustc.edu.cn/}{反向代理},
将
\begin{lstlisting}[deletekeywords = apt]
  /etc/apt/sources.list.d/
\end{lstlisting}
中文件的内容
\begin{lstlisting}
  http(s)://ppa.launchpad.net
\end{lstlisting}
改为
\begin{lstlisting}
  https://launchpad.proxy.ustclug.org
\end{lstlisting}
而后再
\begin{lstlisting}
  sudo apt update
\end{lstlisting}
即完成换源.
有时地址太多而逐个换太麻烦,
可以直接使用如下命令直接替换%
\footnote{参见 \url{https://mogeko.me/zh-cn/posts/zh-cn/035/}}
\begin{lstlisting}[deletekeywords = apt]
  sudo find /etc/apt/sources.list.d/ -type f -name "*.list" -exec  sed  -i.bak -r  's#deb(-src)?\s*http(s)?://ppa.launchpad.net#deb\1 https\2://launchpad.proxy.ustclug.org#ig' {} \;
\end{lstlisting}

\section{用 VS Code 作为 WSL 中的编辑器}\label{sec:addition:wsl-editor}

微软最近频繁推荐 WSL 作为开发工具,
详情阅读%
\href{https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-vscode}{微软文档}.
本手册在此基础上,
借助 \href{https://code.visualstudio.com/download}{VS Code} 的 \href{https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack}{Remote Development}
插件实现若干功能.
若非特别指明,
以下操作均在 WSL 中用 \textsf{bash} 执行.

VS Code 的插件权限有限,
当更改 \texttt{ubuntu.sources} 时,
先将 \texttt{ubuntu.sources} 备份
\begin{lstlisting}[deletekeywords = apt]
  sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
\end{lstlisting}
再用 VS Code 打开文档
\begin{lstlisting}[deletekeywords = apt, morekeywords = code]
  code /etc/apt/sources.list.d/ubuntu.sources
\end{lstlisting}
并对其中内容进行更改,
并且另存为
\begin{lstlisting}
  ~/ubuntu.sources.sav
\end{lstlisting}
执行
\begin{lstlisting}[deletekeywords = apt]
  sudo cp ~/ubuntu.sources.sav /etc/apt/sources.list.d/ubuntu.sources
\end{lstlisting}
替换文档.
若发现文档有错误,
执行
\begin{lstlisting}[deletekeywords = apt]
  sudo cp /etc/apt/sources.list.d/ubuntu.sources.bak /etc/apt/sources.list.d/ubuntu.sources
\end{lstlisting}
恢复文档.

更改 \texttt{.bashrc} 相对简单,
将 \texttt{.bashrc} 备份
\begin{lstlisting}
  cp ~/.bashrc ~/.bashrc.bak
\end{lstlisting}
用 VS Code 打开文档
\begin{lstlisting}[morekeywords = code]
  code ~/.bashrc
\end{lstlisting}
并对其中内容进行更改并保存.
若更改错误,
可以执行
\begin{lstlisting}
  cp ~/.bashrc.bak ~/.bashrc
\end{lstlisting}
恢复文档.

利用
\href{https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop}{\LaTeX\ Workshop}
插件可以将 VS Code 作为 \LaTeX\ 编辑器,
难点在于如何设置.
这里还是建议用户阅读插件
\href{https://github.com/James-Yu/LaTeX-Workshop/wiki}{Wiki}
了解更多内容.
以下 VS Code 设置的 \texttt{json} 文件内容为个人自用的 \LaTeX\ Workshop 设置,
仅供参考.
\begin{lstlisting}[language = json]
  "latex-workshop.latex.tools": [
  {
    "name": "latexmkpdf",
    "command": "latexmk",
    "args":
    [
      "-pdf",
      "-synctex=1",
      "-halt-on-error",
      "-file-line-error",
      "-interaction=nonstopmode",
      "%DOCFILE%",
    ]
  },
  {
    "name": "latexmkxe",
    "command": "latexmk",
    "args":
    [
      "-pdfxe",
      "-synctex=1",
      "-halt-on-error",
      "-file-line-error",
      "-interaction=nonstopmode",
      "%DOCFILE%"
    ]
  },
  ],
  "latex-workshop.latex.recipes": [
  {
    "name": "latexmkpdf",
    "tools": ["latexmkpdf"]
  },
  {
    "name": "latexmkxe",
    "tools": ["latexmkxe"]
  }
  ],
  "latex-workshop.latex.autoBuild.run": "never",
  "latex-workshop.view.pdf.viewer": "tab"
\end{lstlisting}

需要声明的是,
\LaTeX\ Workshop 插件并不局限在 WSL 当中,
它的配置是通用的.
\LaTeX\ Workshop 允许调用外部 PDF 阅读器.
这里提供一份在 Windows 系统内调用外部 SumatraPDF 阅读器的设置方法,
虽然 \LaTeX\ Workshop 官方的 \href{https://github.com/James-Yu/LaTeX-Workshop/wiki/View#using-synctex-with-an-external-viewer}{Wiki} 已声明不再支持外部 PDF 阅读器,
但这套方法依然可以使用.
\begin{lstlisting}[language = json]
  "latex-workshop.view.pdf.viewer": "external",
  "latex-workshop.view.pdf.ref.viewer": "external",
  "latex-workshop.view.pdf.external.viewer.command": "<SumatraPDFROOT>/SumatraPDF.exe",
  "latex-workshop.view.pdf.external.viewer.args": [
    "-reuse-instance",
    "-inverse-search",
    "wscript.exe \"<SumatraPDFROOT>/sumatra-inverse.vbs\" \"%f\" %l",
    "%PDF%"
  ],
  "latex-workshop.view.pdf.external.synctex.command": "<SumatraPDFROOT>/SumatraPDF.exe",
  "latex-workshop.view.pdf.external.synctex.args": [
    "-reuse-instance",
    "-forward-search",
    "%TEX%",
    "%LINE%",
    "-inverse-search",
    "wscript.exe \"<SumatraPDFROOT>/sumatra-inverse.vbs\" \"%f\" %l",
    "%PDF%"
  ]
\end{lstlisting}
实际使用时,
用户需要结合自身安装情况更换 \path{<SumatraPDFROOT>},
即 SumatraPDF 的安装路径,
并且在 \path{<SumatraPDFROOT>} 内写入 \texttt{sumatra-inverse.vbs} 文件,
文件内容是
\begin{lstlisting}[language = VBScript]
  Set WshShell = CreateObject("WScript.Shell")
  If WScript.Arguments.Count < 2 Then WScript.Quit
  filePath = WScript.Arguments(0)
  lineNum  = WScript.Arguments(1)
  gotoArg = Chr(34) & filePath & ":" & lineNum & Chr(34)
  cmdLine = Chr(34) & "<VSCodeROOT>\bin\code.cmd" & Chr(34) & " -r -g " & gotoArg
  WshShell.Run cmdLine, 0, False
\end{lstlisting}
这里 \path{<VSCodeROOT>} 是 VS Code 的安装路径.

\section{迁移 WSL 的安装位置}

考虑到一部分用户的系统盘空间有限,
结合%
\href{https://learn.microsoft.com/en-us/windows/wsl/faq#how-can-i-move-my-wsl-distribution-to-a-different-drive-or-location-}{微软官方文档}%
和
\href{https://superuser.com/questions/1701175/installing-ubuntu-on-mnt-d-with-wsl}{\textsf{Stack\textbf{Exchange}}},
可以考虑迁移 WSL 的安装位置到其他盘.
在操作前首先执行以下 \textsf{cmd} 命令,
保证 WSL 已经关闭
\begin{lstlisting}
  wsl --shutdown
\end{lstlisting}

第一步,
建立新的位置.
假设新位置在 \path{X:\} 盘.
在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl -l
\end{lstlisting}
可以查到当前已经安装的 WSL 分发,
例如
\begin{lstlisting}
  适用于 Linux 的 Windows 子系统分发:
  Ubuntu (默认)
\end{lstlisting}
在 \textsf{bash} 中执行
\begin{lstlisting}
  lsb_release -a
\end{lstlisting}
查到实际 WSL 内 Ubuntu 的版本,
例如
\begin{lstlisting}[language = {}]
  No LSB modules are available.
  Distributor ID: Ubuntu
  Description:    Ubuntu 24.04.2 LTS
  Release:        24.04
  Codename:       noble
\end{lstlisting}
然后在 \textsf{cmd} 中执行
\begin{lstlisting}
  mkdir X:\WSL\ubuntu2404
\end{lstlisting}
%\begin{lstlisting}
%  New-Item -ItemType Directory -Path "X:\WSL\instances\Ubuntu2204" -Force
%\end{lstlisting}
创建新的位置.
这里起名 \texttt{ubuntu2404} 是因为 Ubuntu 实际版本为 24.04,
也可以起其他名字.

第二步,
将现有的 Linux 发行版打包成一个虚拟硬盘 (VHDX) 文件.
在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl --export Ubuntu X:\WSL\ubuntu2404\ext4.vhdx --format vhd
\end{lstlisting}
这里的 \texttt{Ubuntu} 指的是系统默认的 WSL 分发,
这条命令将原本的分发打包为一个 .vhdx 文件.

第三步,
删除旧分发.
需要注意的是,
此步骤是破坏性的,
它会删除原分发及所有数据.
执行这一步前,
务必确认已经生成的 .vhdx 文件已成功保存.
在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl --unregister Ubuntu
\end{lstlisting}
就将旧分发 \texttt{Ubuntu} 删除了.
这时在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl -l
\end{lstlisting}
应该看不到任何 \texttt{Ubuntu} 的分发内容.

第四步,
导入新分发.
将保存的 .vhdx 文件重新注册回 WSL 系统,
在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl --import-in-place Ubuntu X:\WSL\ubuntu2404\ext4.vhdx
\end{lstlisting}
这时在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl -l
\end{lstlisting}
将看到
\begin{lstlisting}
  适用于 Linux 的 Windows 子系统分发:
  Ubuntu (默认)
\end{lstlisting}
至此迁移成功.

实际上,
将整个 WSL 的安装位置迁移还有一个好处.
根据%
\href{https://learn.microsoft.com/zh-cn/windows/wsl/filesystems#file-storage-and-performance-across-file-systems}{微软官方文档},
将项目文件直接存储在 WSL 的驱动器上,
性能速度会提高.
