背景(vscode中的latex环境配置)
关于在vscode中基于扩展功能(extensions)“LaTeX Workshop”将tex文件编译成pdf,网上已经有很多教程,如:
【1】Visual Studio Code (vscode)配置LaTeX - 知乎 (zhihu.com)
就很详细地介绍了“下载texlive-安装LaTeX Workshop扩展+settings.json文件编写”的一整套流程,本人就是基于这套流程成功在本地进行了相关配置,将tex文件编译并生成了pdf文件。
【注】该教程关于sumatraPDF反向搜索的配置有些问题,可参考下述资料修复:
【2】Sumatra PDF 找不到 设置反向搜索命令行_sumatrapdf反向搜索命令行不显示-CSDN博客
(如果你下载好SumatraPDF却没有在“设置-选项”中找到“设置反向搜索命令行”的选项,可通过在“设置-高级选项”里面把EnableTeXEnhancements改为True来修复)
【3】VS Code+Sumatra PDF正反向搜索_sumatrapdf反向搜索-CSDN博客
(在“设置-选项-设置反向搜索命令行”中输入:
"C:\Users\AppData\Local\Programs\Microsoft VS Code\Code.exe" "C:\Users\AppData\Local\Programs\Microsoft VS Code\resources\app\out\cli.js" --ms-enable-electron-run-as-node -r -g "%f":"%l"
,注意,要把双引号也要输入,且需要将C:\Users\AppData\Local\Programs\Microsoft VS Code改成本地的实际安装路径)
问题描述
在正确配置完成后,确实可以按照知乎教程里展示地那样基于tex文件输出pdf文本:

但编译器产生的所有文件都输出到了tex文件的同一文件夹下,不便管理。于是希望
(1)编译器可以将所有文件(包括pdf文件)都生成到tex路径下的由用户自己创建的文件夹里(如图中我自己创建的./tmp文件夹);
(2)对于生成在新路径下的pdf文件,sumatraPDF仍然能正确地找到并打开。
解决方案

最终在chatGPT的帮助下,我找到了如下解决方案:
1)如图所示,先按ctrl+shift+P,找到“首选项:打开用户设置(JSON)/Preferences: Open User Settings(JSON)”。【注】这一步及后续都是对LaTeX Workshop的设置代码做修改,主体代码已经在遵照知乎教程【1】配置latex环境时写好。


2)如下图所示,将xelatex配置中的"command": "xelatex"修改成"command": "xelatex -output-directory=tmp" 。配置了这一步,编译器就会将中间文件和pdf文件输出到./tmp路径。但是sumatraPDF仍然只会在tex文件那一级的路径下查找对应的pdf文件,因此还需进一步设置,使其能够在tmp文件夹下搜索新生成的pdf文件。
【注】必须提前在tex文件的同级路径下创建tmp文件夹。如果没有tmp文件夹就开始编译,编译器不会帮你新建,而是会报错。

3)在"latex-workshop.latex.recipes":[\\一段无关的代码],后增加:"latex-workshop.latex.outDir": "%DIR%/tmp",,如同我和chatGPT的对话中提到的,加上这句话,LaTeX Workshop就知道了编译器新的输出路径,从而会在调用sumatraPDF.exe时将%PDF%占位符替换成正确的pdf文件输出路径/存放路径。

4)完成上述配置并开始编译,就发现新生成的全部文件都会放到./tmp路径下,点击预览按钮也可以顺利通过sumatraPDF进行预览:

最后是我的settings.json文件内容,涉及latex的部分主要来自最开始提到的知乎文章[1]。
{
"explorer.confirmDragAndDrop": false,
"editor.fontFamily": "Terminal, 'Courier New', monospace",
"workbench.colorTheme": "Visual Studio 2017 Dark - C++",
"editor.minimap.enabled": false,
"cmake.configureOnOpen": true,
"explorer.confirmDelete": false,
"intel-corporation.oneapi-environment-configurator.SETVARS_CONFIG": [
"/opt/intel/oneapi/setvars.sh"
],
"markdown-preview-enhanced.previewTheme": "none.css",
"markdown-preview-enhanced.codeBlockTheme": "darcula.css",
"markdown-preview-enhanced.revealjsTheme": "none.css",
"window.zoomLevel": 3,
//------------------------------LaTeX 配置----------------------------------
// 设置是否自动编译
"latex-workshop.latex.autoBuild.run":"onSave",
//右键菜单
"latex-workshop.showContextMenu":true,
//从使用的包中自动补全命令和环境
"latex-workshop.intellisense.package.enabled": true,
//编译出错时设置是否弹出气泡设置
"latex-workshop.message.error.show": false,
"latex-workshop.message.warning.show": false,
// 编译工具和命令
"latex-workshop.latex.tools": [
{
"name": "xelatex",
//"command": "xelatex",
"command": "xelatex -output-directory=tmp", //添加编译的参数
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOCFILE%"
]
},
{
"name": "pdflatex",
"command": "pdflatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOCFILE%"
]
},
{
"name": "latexmk",
"command": "latexmk",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"-outdir=%OUTDIR%",
"%DOCFILE%"
]
},
{
"name": "bibtex",
"command": "bibtex",
"args": [
"tmp/%DOCFILE%"
]
}
],
// 用于配置编译链
"latex-workshop.latex.recipes": [
{
"name": "XeLaTeX",
"tools": [
"xelatex"
]
},
{
"name": "PDFLaTeX",
"tools": [
"pdflatex"
]
},
{
"name": "BibTeX",
"tools": [
"bibtex"
]
},
{
"name": "LaTeXmk",
"tools": [
"latexmk"
]
},
{
"name": "xelatex -> bibtex -> xelatex*2",
"tools": [
"xelatex",
"bibtex",
"xelatex",
"xelatex"
]
},
{
"name": "pdflatex -> bibtex -> pdflatex*2",
"tools": [
"pdflatex",
"bibtex",
"pdflatex",
"pdflatex"
]
}
],
"latex-workshop.latex.outDir": "%DIR%/tmp",
//文件清理。此属性必须是字符串数组
"latex-workshop.latex.clean.fileTypes": [
"*.aux",
"*.bbl",
"*.blg",
"*.idx",
"*.ind",
"*.lof",
"*.lot",
"*.out",
"*.toc",
"*.acn",
"*.acr",
"*.alg",
"*.glg",
"*.glo",
"*.gls",
"*.ist",
"*.fls",
"*.log",
"*.fdb_latexmk"
],
//设置为onFaild 在构建失败后清除辅助文件
"latex-workshop.latex.autoClean.run": "onFailed",
// 使用上次的recipe编译组合
"latex-workshop.latex.recipe.default": "lastUsed",
// 用于反向同步的内部查看器的键绑定。ctrl/cmd +点击(默认)或双击
"latex-workshop.view.pdf.internal.synctex.keybinding": "double-click",
//使用 SumatraPDF 预览编译好的PDF文件
// 设置VScode内部查看生成的pdf文件
"latex-workshop.view.pdf.viewer": "external",
// PDF查看器用于在\ref上的[View on PDF]链接
"latex-workshop.view.pdf.ref.viewer":"auto",
// 使用外部查看器时要执行的命令。此功能不受官方支持。
"latex-workshop.view.pdf.external.viewer.command": "C:/Program Files/SumatraPDF/SumatraPDF.exe", // 注意修改路径
// 使用外部查看器时,latex-workshop.view.pdf.external.view .command的参数。此功能不受官方支持。%PDF%是用于生成PDF文件的绝对路径的占位符。
"latex-workshop.view.pdf.external.viewer.args": [
"%PDF%"
],
// 将synctex转发到外部查看器时要执行的命令。此功能不受官方支持。
"latex-workshop.view.pdf.external.synctex.command": "C:/Program Files/SumatraPDF/SumatraPDF.exe", // 注意修改路径
// latex-workshop.view.pdf.external.synctex的参数。当同步到外部查看器时。%LINE%是行号,%PDF%是生成PDF文件的绝对路径的占位符,%TEX%是触发syncTeX的扩展名为.tex的LaTeX文件路径。
"latex-workshop.view.pdf.external.synctex.args": [
"-forward-search",
"%TEX%",
//"%PDF%",
"%LINE%",
"-reuse-instance",
"-inverse-search",
"\"D:/Software/Vscode/Microsoft VS Code/Code.exe\" \"D:/Software/Vscode/Microsoft VS Code/resources/app/out/cli.js\" -r -g \"%f:%l\"", // 注意修改路径
"%PDF%"
],
"git.openRepositoryInParentFolders": "always"
}