我想动态更改latex-suite确定MainFile的方式。 主文件通常是latex头文件,其中包含其他tex文件(如章节等)。使用MainFile可以在某个章节文件上点击编译,以便latex-suite自动编译头文件。
这应该可以用g:Tex_MainFileExpression: http://vim-latex.sourceforge.net/documentation/latex-suite/latex-master-file.html
但是,表达式根本没有记录,甚至示例(imo应该反映默认行为)都不起作用。
let g:Tex_MainFileExpression = 'MainFile(modifier)'
function! MainFile(fmod)
if glob('*.latexmain') != ''
return fnamemodify(glob('*.latexmain'), a:fmod)
else
return ''
endif
endif
有人可以稍后向我指出应该如何使用它? 预计返回表达式是什么?为什么这个例子不起作用?
背景:我在项目根目录中有一个latexmain文件。我还有一个figure子目录。对于此子目录,不应忽略根latex主体,以便编译当前文件本身。
答案 0 :(得分:0)
我只是遇到了一个不知道如何设置g:Tex_MainFileExpression
的问题。我也不清楚文档和示例。事实证明,源代码定义了一个函数Tex_GetMainFileName
,该函数在执行modifier
之前根据其参数设置变量g:Tex_MainFileExpression
(请参见source code here)。因此,g:Tex_MainFileExpression
必须是一个具有参数modifier
的函数(不能以其他方式调用!)。 vim-latex文档说,该修饰符是filetype-modifier,因此您的函数需要返回fnamemodify(filename, modifier)
。因此它必须看起来像这样:
let g:Tex_MainFileExpression = 'MainFile(modifier)'
function! MainFile(fmod)
" Determine the full path to your main latex file that you want to compile.
" Store it e.g. in the variable `path`:
" let path = some/path/to/main.tex
" Apply `modifier` to your `path` variable
return fnamemodify(path, a:fmod)
endif
我在一个有两个主要乳胶文件的项目中使用了该文件,一个用于主文件,一个用于补充材料。项目结构如下:
project/
main.tex
sup.tex
.local-vimrc
main-source/
input1.tex
input2.tex
sup-source/
input1.tex
input2.tex
我(使用插件MarcWeber/vim-addon-local-vimrc加载了.local-vimrc
文件,在其中设置g:Tex_MainFileExpression
使得<leader>ll
编译main.tex
,如果当前文件位于缓冲区位于文件夹main-source
中,如果位于文件夹sup.tex
中,则编译sup-source
。以下是我的.local-vimrc
文件。我对vimscript的经验很少,所以这可能有点小题大作,但可能有助于您了解如何使用g:Tex_MainFileExpression
。另外,我对其进行了修改,以减少混乱,并且未明确测试以下代码。
let g:Tex_MainFileExpression = 'g:My_MainTexFile(modifier)'
function! g:My_MainTexFile(fmod)
" Get absolute (link resolved) paths to this script and the open buffer
let l:path_to_script = fnamemodify(resolve(expand('<sfile>:p')), ':h')
let l:path_to_buffer = fnamemodify(resolve(expand('%:p')), ':h')
" Check if the buffer file is a subdirectory of `main-source` or `sup-source`
" stridx(a, b) returns -1 only if b is not substring of a
if stridx(l:path_to_buffer, 'main-source') != -1
let l:name = 'main.tex'
elseif stridx(l:path_to_buffer, 'sup-source') != -1
let l:name = 'sup.tex'
else
echom "Don't know what's the root tex file. '".@%."' is not in 'main-source/' or 'sup-source/' directory."
return ''
endif
" Concatenate this script path with main latex file name
" NOTE: this assumes that this script is located in the same folder as the
" main latex files 'main.tex' and 'sup.tex'
let l:path = l:path_to_script.'/'.l:name
return fnamemodify(l:abs_path_main, a:fmod)
endfunction