% !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 /etc/apt/sources.list.bak
\end{lstlisting}
备份 \texttt{sources.list} 文件.
接下来执行
\begin{lstlisting}[deletekeywords = apt]
  sudo gedit /etc/apt/sources.list
\end{lstlisting}
将文件替换为以下内容%
\footnote{本段文字可至%
\href{https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/}{清华大学镜像网站}%
获取}
\begin{lstlisting}[
  morekeywords = {deb, noble, noble-updates, noble-backports, noble-security},
  alsoletter = -]
  # 默认注释了源码镜像以提高 apt update 速度, 如有需要可自行取消注释
  deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse
  # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse
  deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse
  # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse
  deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse
  # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse

  # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-security main restricted universe multiverse
  # # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-security main restricted universe multiverse

  deb http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse
  # deb-src http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse

  # 预发布软件源, 不建议启用
  # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse
  # # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse
\end{lstlisting}
保存退出.
再执行
\begin{lstlisting}
  sudo apt update && sudo apt upgrade
\end{lstlisting}
换源并更新.
若更改错误,
可执行
\begin{lstlisting}[deletekeywords = apt]
  sudo cp /etc/apt/sources.list.bak /etc/apt/sources.list
\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{sources.list} 时,
先在 \textsf{bash} 中将 \texttt{sources.list} 备份
\begin{lstlisting}[deletekeywords = apt]
  sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
\end{lstlisting}
再用 VS Code 打开文档
\begin{lstlisting}[deletekeywords = apt, morekeywords = code]
  code /etc/apt/sources.list
\end{lstlisting}
并对其中内容进行更改,
并且另存为
\begin{lstlisting}
  ~/sources.list.sav
\end{lstlisting}
执行
\begin{lstlisting}[deletekeywords = apt]
  sudo cp ~/sources.list.sav /etc/apt/sources.list
\end{lstlisting}
替换文档.
若发现文档有错误,
执行
\begin{lstlisting}[deletekeywords = apt]
  sudo cp /etc/apt/sources.list.bak /etc/apt/sources.list
\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 设置,
仅供参考,
其中注释的部分是调用外部 SumatraPDF 阅读器的设置,
用户可阅读
\href{https://github.com/OsbertWang/latex-editor-sumatrapdf}{\textsf{latex-editor-sumatrapdf}}
来了解更多内容.
\begin{lstlisting}[language = json]
  "latex-workshop.latex.tools": [
    {
      "name": "latexmkpdf",
      "command": "latexmk",
      "args":
        [
          "-synctex=1", "%DOCFILE%",
          "-halt-on-error", "-file-line-error",
          "-pdf", "-interaction=nonstopmode"
        ]
    },
    {
      "name": "latexmkxe",
      "command": "latexmk",
      "args":
        [
          "-synctex=1", "%DOCFILE%",
          "-halt-on-error", "-file-line-error",
          "-xelatex", "-interaction=nonstopmode",
        ]
    },
  ],
  "latex-workshop.latex.recipes": [
    {
      "name": "latexmkpdf",
      "tools": [ "latexmkpdf" ]
    },
    {
      "name": "latexmkxe",
      "tools": [ "latexmkxe" ]
    }
  ],
  "latex-workshop.latex.autoBuild.run": "never",
  "latex-workshop.view.pdf.viewer": "tab"
  // "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": [
  //   "-inverse-search", "%PDF%",
  //   "\"<VSCodeROOT>/bin/code.cmd\" -r -g \"%f:%l\"",
  // ],
  // "latex-workshop.view.pdf.external.synctex.command":"<SumatraPDFROOT>/SumatraPDF.exe",
  // "latex-workshop.view.pdf.external.synctex.args":[
  //   "-forward-search", "%TEX%", "%LINE%", "%PDF%"
  // ],
\end{lstlisting}

实际使用时,
用户需要结合自身安装情况更换 \path{<SumatraPDFROOT>} 和 \path{<VSCodeROOT>},
即 SumatraPDF 和 VS Code 各自的安装路径.

另外需要声明的是,
\LaTeX\ Workshop 插件并不局限在 WSL 当中,
它的配置是可以通用的.

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

考虑到一部分用户的系统盘空间有限,
且根据%
\href{https://learn.microsoft.com/zh-cn/windows/wsl/troubleshooting?source=recommendations#installation-issues}{微软官方文档},
WSL 只能安装在系统盘,
因此可以考虑迁移 WSL 的安装位置到其他盘.
本部分内容源自
\href{https://superuser.com/questions/1701175/installing-ubuntu-on-mnt-d-with-wsl}{\textsf{Stack\textbf{Exchange}}}.
方法牵扯到主系统和子系统的操作.

第一步,
建立新的位置.
假设新位置在 \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\instances\ubuntu2404
  mkdir X:\WSL\images
  cd X:\WSL\images
\end{lstlisting}
%\begin{lstlisting}
%  New-Item -ItemType Directory -Path "X:\WSL\instances\Ubuntu2204" -Force
%  Set-Location (New-Item -ItemType Directory -Path "X:\WSL\images" -Force)
%\end{lstlisting}
创建新的位置.
这里起名 \texttt{ubuntu2404} 是因为 Ubuntu 实际版本为 24.04,
也可以起其他名字.

第二步,
导出原 WSL 分发并导入新位置.
在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl --export Ubuntu ubuntu.tar
  wsl --import ubuntu2404 X:\WSL\instances\ubuntu2404 ubuntu.tar --version 2
\end{lstlisting}
第一行的 \texttt{Ubuntu} 指的是系统默认的 WSL 分发,
这条命令将原本的分发导出为一个压缩包.
第二行的 \texttt{ubuntu2404} 是未来指定的 WSL 分发,
也就是将前面导出的压缩包导入成新的 WSL 分发.

第三步,
启动新的分发并且设置为默认.
在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl ~ -d ubuntu2404
\end{lstlisting}
进入 \texttt{ubuntu2404} 分发的 WSL 系统,
在当前 \textsf{bash} 中执行
\begin{lstlisting}[deletekeywords = wsl]
  sudo -e /etc/wsl.conf
\end{lstlisting}
输入以下内容
\begin{lstlisting}
  [user]
  default=<your_username>
\end{lstlisting}
"<your_username>" 是用户自定义的 WSL 的用户名,
个人用了原本 \texttt{Ubuntu} 分发内的用户名.
然后依次 \keys{\ctrl + X}, \keys{Y}, \keys{\enter} 保存退出.
退出 \textsf{bash},
在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl --terminate ubuntu2404
  wsl ~ -d ubuntu2404
\end{lstlisting}
这时如果一切正常,
就可以将 \texttt{ubuntu2404} 设置为默认 WSL 分发,
即在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl --set-default ubuntu2404
\end{lstlisting}
这时在 \textsf{bash} 中执行
\begin{lstlisting}
  echo $WSL_DISTRO_NAME
\end{lstlisting}
返回结果
\begin{lstlisting}
  ubuntu2404
\end{lstlisting}
就表明一切正常.

第四步,
删除旧分发.
在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl --unregister Ubuntu
\end{lstlisting}
就将旧分发 \texttt{Ubuntu} 删除了.
这时在 \textsf{cmd} 中执行
\begin{lstlisting}
  wsl -l
\end{lstlisting}
将看到
\begin{lstlisting}
  适用于 Linux 的 Windows 子系统分发:
  ubuntu2404 (默认)
\end{lstlisting}

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