TeXpresso + VS Code + WSL 實時預覽 LaTeX

Samuel Ho 2026-10-26 10:14 1

1. 前言


今年自从 Clemens Lode 在 TUG 上演讲后,诞生了很多实时 LaTeX 编辑器:



  • ClemensLode - texlode

  • louisqli - Texpile

  • Yendric - TeXyoN (FlashTeX)

  • Jaysen Tsao - FlashTeX

  • HenryXiaoYang - realtime-tex (rtex)


当中 texlode、TeXyoN 迟迟未公开,Texpile、rtex 用了一阵下来觉得仍然不稳定,而且也只有TeXyoN和rtex会提供VS Code插件。顺带一提,macOS 可以用 Texifier,但是我还是喜欢 VS Code。


因为上课要抄笔记实在无法忍受不稳定,我始终都要用回 let-def - TeXpresso,而且前几天 DominikPeters - TeXpresso VS Code Extension 终于更新,对接七月的 e8df770。


问题是,每次安装和设置 TeXpresso 都总会踩一些坑,所以写一篇教程给我自己。


2. 安装 WSL 2


TeXpresso 暂未直接支援 Windows,我们要依赖 WSL 2(或 3)。官方文档




  1. 以 Administrator 打开 PowerShell,运行


    wsl --install



  2. 安装 Ubuntu 22.04 LTS


    wsl --install -d Ubuntu-22.04

    坑:其他 Ubuntu 版本会导致 TeXpresso 不能实时更新。




*3. 安装 GWSL


WSL 现在其实已经自带 WSLg,但是为了追求美观,我使用 GWSL,要自行 build,嫌麻烦可以直接买已经 build 好的 Microsoft Store 付费版。 官方文档





  • 编译GWSL(付费版跳过)






  1. 准备 Python 环境,安装 PyManager 以便和其他版本共存。




  2. 自行下载安装 Python 3.7 (python-3.7.9-amd64.exe)

    坑:不可以直接用py install 3.7,因为这样不附带 tkinter。



    (不选Add to PATH也行,因为已经有 PyManager 提供的py指令。)




  3. 测试 tkinter


    py -3.7 -m tkinter



    (看到这个界面即表示 tkinter 可用)




  4. 拉取GWSL-Source仓库(需时约 3 分钟)


    git clone https://github.com/Opticos/GWSL-Source.git
    cd GWSL-Source



  5. 安装virtualenv,创建(build_env)并进入


    py -3.7 -m pip install virtualenv

    py -3.7 -m virtualenv build_env
    .\build_env\Scripts\activate



  6. 在(build_env)内安装 dependencies 并 build


    pip install pygame pywin32 winshell Pillow imtools keyboard pyinstaller==3.5 pyxdg psutil

    py build.py



  7. 成功的话会产生dist/GWSL_'version'/,复制到%AppData%/GWSL/bin/(反正 GWSL 资料目录就在%AppData%/GWSL/),在 cmd 运行


    cd dist
    for /d %i in (GWSL_*) do @if /i not "%~nxi"=="GWSL_service" xcopy "%i\*" "%AppData%\GWSL\bin\" /E /H /C /I /Q



  8. 打开%AppData%/GWSL/bin/GWSL.exe,成功的话就可以删除原来的GWSL-Source







  • 配置 GWSL 显示器






  1. 修改GWSL_Helper.sh,在 PowerShell 运行


    $f="$env:AppData\GWSL\GWSL_helper.sh"; cp $f "$f.bak"; [io.file]::WriteAllText($f, (gc $f -raw).Replace('(cat /etc/resolv.conf | grep nameserver | awk ''{print \$2; exit;}'')', '(ip route | grep default | awk ''{print \$3}'')'))



    解释

    坑:根据 #11698 的做法,把~/.bashrc和~/.profile中每个


    $(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0 #GWSL

    改成


    $(ip route | grep default | awk '{print $3}'):0.0 #GWSL

    而GWSL_helper.sh就是在修改~/.bashrc和~/.profile





  2. 打开 GWSL,选GWSL Distro Tools > Display/Audio Auto-Exporting





    暂时切换 WSLg / GWSL 方法



    • 转回 WSLg:在 WSL 运行


      export DISPLAY=:0



    • 转回 GWSL:在 WSL 运行


      export DISPLAY=$(ip route | grep default | awk '{print $3}'):0.0






  3. 用 xclock 测试 GWSL 显示器,在 WSL 运行


    sudo apt install x11-apps -y

    xclock




    直接在 cmd 运行的问题

    如果想直接在 cmd 运行


    wsl xclock

    会发现 WSL 仍然用 WSLg,因为wsl xxx没有加载~/.profile。如果要用 GWSL 要运行


    wsl bash -l -c "xclock"






  • 把 GWSL 加到 startup


    Microsoft Store 版本:


    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "GWSL" /t REG_EXPAND_SZ /d "\"%%LocalAppData%%\Microsoft\WindowsApps\gwsl.exe\" --r --startup" /f

    自行编译版本:


    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "GWSL" /t REG_EXPAND_SZ /d "\"%%AppData%%\GWSL\bin\GWSL.exe\" --r --startup" /f

    移除:


    reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "GWSL" /f



3. 安装 TeXpresso




  • 安裝 Tectonic


    坑:snap 的 Tectonic 会导致make fill-tectonic-cache不成功



  1. 下载并解压缩x86_64-unknown-linux-musl.tar.gz
    url="$(
    curl -fsSL \
    https://api.github.com/repos/tectonic-typesetting/tectonic/releases/latest |
    grep browser_download_url |
    grep 'x86_64-unknown-linux-musl.tar.gz' |
    cut -d '"' -f 4
    )"

    curl -fL "$url" -o /tmp/tectonic-musl.tar.gz
    mkdir -p /tmp/tectonic-musl
    tar -xzf /tmp/tectonic-musl.tar.gz -C /tmp/tectonic-musl


  2. 安装 Tectonic
    sudo install -m 755 /tmp/tectonic-musl/tectonic /usr/local/bin/tectonic
    hash -r


  3. 测试 Tectonic
    tectonic --version





  • 编译 TeXpresso






  1. 在 WSL 里创建/opt/texpresso并拉取仓库


    sudo mkdir -p -m 755 /opt/texpresso
    sudo chown "$USER":"$(id -gn)" /opt/texpresso
    cd /opt/texpresso

    git clone https://github.com/let-def/texpresso.git .



    要求特定版本

    如果未来 TeXpresso 写烂了,要求特定版本例如七月的e8df7709077b2f86f6e16e6c86ceefb86de06f8d,可以额外运行


    git reset --hard e8df7709077b2f86f6e16e6c86ceefb86de06f8d




  2. 安装依赖套件


    sudo apt update
    sudo apt install build-essential libsdl2-dev libmupdf-dev libmujs-dev libfreetype-dev libgumbo-dev libjbig2dec0-dev libjpeg-dev libopenjp2-7-dev cargo libssl-dev libfontconfig-dev libleptonica-dev libharfbuzz-dev -y



  3. 修改engine.h,把<mupdf/fitz/display-list.h>改成<mupdf/fitz.h>


    sed -i 's|#include <mupdf/fitz/display-list.h>|#include <mupdf/fitz.h>|g' src/frontend/engine.h

    坑:否则编译texpresso会报错:



    /usr/include/mupdf/fitz/separation.h:81:80: error: unknown type name ‘fz_colorspace’

    81 | void fz_add_separation(fz_context *ctx, fz_separations *sep, const char *name, fz_colorspace *cs, int cs_channel);

    | ^~~~~~~~~~~~~





  4. 编译texpresso和texpresso-xetex,并fill-tectonic-cache


    make texpresso
    make texpresso-xetex
    make fill-tectonic-cache



  5. 测试 TeXpresso


    build/texpresso test/simple.tex





  • 配置 VS Code






  1. 安装 TeXpresso VS Code Extension




  2. 坑:因为 VS Code 用的是 non-interactive, non-login shell,要弄个 wrapper 加载 env


    cd /opt/texpresso
    touch texpresso-vscode.sh
    chmod +x texpresso-vscode.sh
    nano texpresso-vscode.sh

    在 nano 里贴上(提示:Ctrl + S储存、Ctrl + X离开)


    #!/bin/bash
    export DISPLAY=$(ip route | grep default | awk '{print $3}'):0.0 #GWSL
    /opt/texpresso/build/texpresso "$@"



  3. 在VS Code按Ctrl+Shift+P呼叫command palette,选Preferences: Open User Settings (JSON)


    在settings.json里贴上


    "texpresso.useWSL": true,
    "texpresso.command": "/opt/texpresso/texpresso-vscode.sh",
    "texpresso.packageProvider": "tectonic",
    "texpresso.useChangeRangeMode": true,
    "texpresso.streamFiles": true,
    "texpresso.syncTeXForwardOnSelection": true,

    然后储存






  • 运行 TeXpresso





  1. 在 VS Code 打开.tex档案,按Ctrl + Shift + P呼叫 command palette,选TeXpresso: Start Document



    (第一次开启.tex较多包下载,会黑屏几分钟)



4. LaTeX Workshop 配置(题外话)




  1. Recipes, Tools


    "latex-workshop.latex.recipe.default": "lastUsed",
    "latex-workshop.latex.recipes": [
    {
    "name": "latexmk (pdflatex)",
    "tools": [
    "pdflatexmk"
    ]
    },
    {
    "name": "latexmk (xelatex)",
    "tools": [
    "xelatexmk"
    ]
    },
    {
    "name": "latexmk (lualatex)",
    "tools": [
    "lualatexmk"
    ]
    },
    ],
    "latex-workshop.latex.tools": [
    {
    "name": "pdflatexmk",
    "command": "latexmk",
    "args": [
    "-synctex=1",
    "-interaction=nonstopmode",
    "-file-line-error",
    "-pdf",
    "-outdir=%OUTDIR%",
    "-auxdir=%OUTDIR%/.aux",
    "%DOC%"
    ],
    "env": {}
    },
    {
    "name": "lualatexmk",
    "command": "latexmk",
    "args": [
    "-synctex=1",
    "-interaction=nonstopmode",
    "-file-line-error",
    "-lualatex",
    "-outdir=%OUTDIR%",
    "-auxdir=%OUTDIR%/.aux",
    "%DOC%"
    ],
    "env": {}
    },
    {
    "name": "xelatexmk",
    "command": "latexmk",
    "args": [
    "-synctex=1",
    "-interaction=nonstopmode",
    "-file-line-error",
    "-xelatex",
    "-outdir=%OUTDIR%",
    "-auxdir=%OUTDIR%/.aux",
    "%DOC%"
    ],
    "env": {}
    },
    ],



  2. PDF Viewer, SyncTeX


    "latex-workshop.synctex.afterBuild.enabled": true,
    "latex-workshop.synctex.indicator": "circle",
    "latex-workshop.view.pdf.internal.synctex.keybinding": "double-click",
    "latex-workshop.view.pdf.reload.transition": "none",
    "latex-workshop.view.outline.sync.viewer": true,



  3. SumatraPDF, SyncTeX


    "latex-workshop.view.pdf.viewer": "external",
    "latex-workshop.view.pdf.external.viewer.command": "C:/Program Files/SumatraPDF/SumatraPDF.exe",
    "latex-workshop.view.pdf.external.viewer.args": [
    "-reuse-instance",
    "-forward-search",
    "%TEX%",
    "%LINE%",
    "%PDF%"
    ],
    "latex-workshop.view.pdf.external.synctex.command": "C:/Program Files/SumatraPDF/SumatraPDF.exe",
    "latex-workshop.view.pdf.external.synctex.args": [
    "-reuse-instance",
    "-forward-search",
    "%TEX%",
    "%LINE%",
    "%PDF%"
    ],



  4. ChkTeX, Logging


    "latex-workshop.message.badbox.show": "none",
    "latex-workshop.message.latexlog.exclude": [
    "too small"
    ],
    "latex-workshop.linting.chktex.enabled": true,
    "latex-workshop.linting.chktex.exec.args": [
    "-wall",
    "-n3", // ab_c -> {ab}_c
    "-n6", // Italic correction
    "-n9", // Half open/closed intevals
    "-n17", // Number of ( needs to be equal to number of )
    "-n21",
    "-n22",
    "-n25", // x^Tx -> x^T x
    "-n30",
    "-n36", // Requires space in front of (
    "-n40", // Prohibits punctuation inside \(\), including factorial !
    "-e16",
    "-q",
    "-n1"
    ],


最新回复 (2)
  • TingMaple 10-26 23:27
    1楼

    GWSL



    请问一下 GWSL在高分辨率下的清晰度如何呀,我用wslg糊的不行,完全用不了

  • Samuel Ho 楼主 10-26 23:31
    2楼

    我用 WSLg 的时候也不觉得糊,所以我也不能比较,但是 GWSL 里面可以设置高 DPI

* 帖子来源Linux.do
返回