完成配置,一次成功,正反向搜索正常,我的天哪,太好用了!
最近又拾起latex在空余时间写点文档,码字还是一如既往的使用Notepad++,遂想着何不趁此机会配置一下Notepad++下latex的编译环境。在实践此事之前,我一直妄自推断,觉得配置过程肯定会很繁琐,又不知会因哪里出现的报错而卡壳。当通过Google找到John Bruer的博文LaTex Editing Using Notepad++时,我告诫自己要耐心耐心再耐心,尽可能搞懂步骤中的每一点,即使出现报错也不会慌乱。
准备工作
- CTEX,我使用的是200多兆的Basic版,版本号2.9.2.164,试用过2.9.3的测试版后觉得还不稳定;
- Notepad++,由于插件NppExec不支持64位Notepad++,请安装32位版本;
- NppExec,在32位Notepad++的插件管理器中,可以轻松找到NppExec并安装;
- SumatraPDF,支持正反向搜索的轻量级PDF阅读器;
- CMCDDE,用于向SumatraPDF发送DDE命令。
pdflatex_build.bat
检查一下NppExec插件是否安装成功,可以查看插件菜单中是否已经有子菜单NppExec。
batch文件是本文的重点,插件NppExec就是通过调用该batch文件来实现对Notepad++中的.tex文件进行编译的,编译成功后调用SumatraPDF显示生成的PDF文件。我在这里直接贴上了John Bruer博文中的版本,下面集合了本文出现的batch命令的说明,很简单。
@echo off
if "%~x1"==".tex" goto pdflatex
echo "%~f1" is not a recognized type, extension is "%~x1"
pause
exit /b
:pdflatex
cd /d "%~dp1"
IF NOT EXIST "%~dp1\build" mkdir build
start "inverseSearch" /min "%PROGRAMFILES(x86)%\SumatraPDF\SumatraPDF.exe" -inverse-search "\"%PROGRAMFILES(x86)%\Notepad++\notepad++.exe\" -n%%l \"%%f\"" -reuse-instance
pdflatex.exe -draftmode -interaction=batchmode -aux-directory="%~pd1\build" -output-directory="%~pd1\build" "%~pdn1"
echo. && echo.
bibtex.exe "%~dp1\build\%~n1.aux"
echo. && echo.
pdflatex.exe -draftmode -interaction=batchmode -aux-directory="%~pd1\build" -output-directory="%~pd1\build" "%~pdn1"
echo. && echo.
pdflatex.exe -interaction=batchmode -synctex=-1 -aux-directory="%~pd1\build" -output-directory="%~pd1\build" -quiet "%~pdn1"
echo. && echo.
type "%~dp1\build\%~n1.log" | findstr Warning:
start "openPDF" "%PROGRAMFILES(x86)%\SumatraPDF\SumatraPDF.exe" "%~dp1\build\%~n1.pdf" -reuse-instance
echo SUMATRA>"%~dp1\build\cmcdde.tmp"
echo control>>"%~dp1\build\cmcdde.tmp"
echo [ForwardSearch("%~dp1\build\%~n1.pdf", "%~f1", %2, 0, 0, 0)]>>"%~dp1\build\cmcdde.tmp"
"%PROGRAMFILES(x86)%\cmcdde.exe" @"%~dp1\build\cmcdde.tmp"
del "%~dp1\build\cmcdde.tmp"
exit /b
变量
batch文件的语法可以专门研究一下,这里为节省大家的时间,我只解释上文中出现的几个要点。
首先是"%x1"、"%f1"、"%dp1"、"%pdn1"、"%~n1"这些变量代表什么。假如新建一个test.bat文件并输入下面几行简单命令。
@echo off
echo "%~x1"
echo "%~f1"
echo "%~dp1"
echo "%~pdn1"
echo "%~n1"
在同一目录下新建一个文档text.txt,然后在命令行窗口中输入test.bat text.txt
D:\batchtest>test.bat test.txt
输出如下
".txt"
"D:\batchtest\text.txt"
"D:\batchtest\"
"D:\batchtest\text"
"text"
ECHO
@echo off
echo. && echo.
@echo off 包括本行在内,所有命令不输出。
echo. 空一行。
EXIT
exit [/b] [exitcode]
/b When used in a batch script, this option will exit only the script (or subroutine) but not CMD.EXE
exitcode Sets the %ERRORLEVEL% to a numeric number. If quitting CMD.EXE, set the process exit code no.
CD
cd [/d] [drive:][path]
/d change the current DRIVE in addition to changing folder.
START
start "title" [/d path] [options] "command" [parameters]
title Text for the CMD window title bar (required).
path Starting directory.
command The command, batch file or executable program to run.
parameters The parameters passed to the command.
Options | Descriptiions |
---|---|
/min | Start window Minimized. |
/max | Start window Maximized. |
/w or /wait | Start application and wait for it to terminate.(for an internal cmd command or a batch file this runs CMD /K) |
... | ... |
TYPE
type [filename]
This batch command prints the content of a file or files to the output.
FINDSTR
findstr string(s) [pathname(s)] [/R] [/C:"string"] [/G:StringsFile] [/F:file] [/D:DirList] [/A:color] [/OFF[LINE]] [options]
string Text to search for.
pathname(s) The file(s) to search.
路径
batch文件中出现的“%PROGRAMFILES(x86)%”是环境变量,默认指向"C:\PROGRAMFILES(x86)"。由于我习惯把软件安装在D盘,所以上文中所有的路径都要改成我的本地对应。改完后是这样:
start "inverseSearch" /min "D:\Program Files\SumatraPDF\SumatraPDF.exe" -inverse-search "\"D:\Program Files (x86)\Notepad++\notepad++.exe\" -n%%l \"%%f\"" -reuse-instance
你也发现了,我安装的是64位的SumatraPDF,32位的Notepad++,原因上面也讲过了。
至此,我的batch文件就准备好了。
NppExec设置
在Notepad++中点击菜单"插件">NppExec>Execute ...,在弹出的窗口中输入如下命令:
NPP_SAVE
C:\\pdflatex_build.bat "$(FULL_CURRENT_PATH)" $(CURRENT_LINE)
第一行代码的作用是将当前的文档进行保存。第二行代码即调用之前准备好的pdflatex_build.bat文件,将当前文档的完整路径传递给它进行编译,此外将光标所在行也一并传递。
点击Save...进行保存,保存为文件名pdflatex_build。至此,已经可以试验一下,能否顺利编译.tex文件。使用Notepad++打开一份之前已经写好的.tex文件,使用快捷键F6或选择菜单“插件”>NppExec>Execute...。在弹出的窗口中,于下拉窗口中选择pdflatex_build,点击OK。
上述操作过程可以设置快捷键,方便每次编译的调用。选择菜单“插件”>NppExec>Advanced options...。在弹出的窗口中,在Item name输入框中输入一个名称,比如Run pdflatex。在Associated script下拉菜单中选择pdflatex_build。点击Add/Modify按钮,将刚刚设置的Menu item添加至上方的列表中。确定将Place to the macros submenu前的选框被选中后,点击OK退出。现在就可以在菜单“宏”下看到刚刚添加的Run pdflatex菜单了,下次编译可以直接点击该菜单,或者再给它定义一个快捷键。点击菜单“设置”>管理快捷键...,在弹出的窗口中,点击Plugin commands标签页,找到Run pdflatex并给它定义一个快捷键,延续Jhon bruer的用法,设置为“Alt + ~”。点击关闭退出设置窗口。
至此,可以愉快的使用Notepad++编辑.tex文件,可以方便的通过快捷键一键编译,编译完成会自动打开pdf文件。同时,可以快速的反向搜索,即在pdf文件中双击某一行文本,可以找到.tex文件中对应位置并高亮显示。
正向搜索
正向搜索在使用时是这样的,在.tex文件中把光标放置在需要的行,使用快捷键,跳转到pdf文件并将目标段落高亮显示。有了上面的经验,正向搜索设置起来就很容易了。
新建一个batch文件pdflatex_forward.bat,输入如下内容:
@echo off
if "%~x1"==".tex" goto doit
echo "%~f1" is not a .tex file, extension is "%~x1"
pause
exit /b
:doit
echo SUMATRA>"%~dp1\build\cmcdde.tmp"
echo control>>"%~dp1\build\cmcdde.tmp"
echo [ForwardSearch("%~dp1\build\%~n1.pdf", "%~f1", %2, 0, 0, 0)]>>"%~dp1\build\cmcdde.tmp"
"%PROGRAMFILES(x86)%\cmcdde.exe" @"%~dp1\build\cmcdde.tmp"
del "%~dp1\build\cmcdde.tmp"
将第13行中的路径改成本地放置cmcdde.exe的位置。
ForwardSearch命令一共有6个参数,它们的含义分别是:
- Full path to the PDF file
- Full path to the LaTeX source file
- Line number of the source file
- Column number of the source file (currently unused, so pass 0)
- New window? Pass 1 to open the PDF file in a new window
- Focus? Pass 1 to give SumatraPDF focus
按照上面配置NppExec插件和快捷键的方法,对pdflatex_forward.bat文件操作一遍。快捷键可以设成“Alt + A”。
结语
本文介绍的方法均建立在我个人的使用习惯基础上,不管编不编程,Notepad++都是我的装机必备,能在其中愉快地编辑编译latex,对我而言是值得花时间配置一下的。记下本文也是为了未来装机有个笔记可参考,如果能够帮到有同样需求的同学,当然就更好了。