使用makefile和子目录中的sty文件将Rmarkdown moderncv编织为pdf

时间:2018-09-29 20:28:45

标签: makefile latex r-markdown knitr

我正在使用moderncv类在Rmarkdown中创建CV。为了使cv具有可重现性,我在根目录中包括了.cls和.sty文件。但是,为了使根目录整洁,我希望将所有与moderncv相关的文件保留在一个子目录(assets / tex /)中。我可以使用yaml前端问题中的相对路径访问.cls文件,但是除非它们位于根目录中,否则我无法访问.sty文件。

搜索关于stackoverflow的先前问题,我学到了以下几点:(1)不建议将.cls和.sty文件保留在嵌套目录中。我理解这一点,并且无论如何都希望这样做,以便其他人可以分叉我的项目并能够编织简历,而不必处理查找其texmk文件夹的问题。 (2)解决我的问题的方法似乎涉及使用Makefile设置TEXINPUTS(请参见this threadanother thread

我对Makefiles不太满意,但是只要.sty文件仍在根目录中,我就设法使我的.Rmd文件无问题地编织为pdf。这是当前的样子:

PDF_FILE=my_cv.pdf

all : $(PDF_FILE)
    echo All files are now up to date

clean : 
    rm -f $(PDF_FILE) 

%.pdf : %.Rmd
    Rscript -e 'rmarkdown::render("$<")'

我的理解是,我可以使用以下方式设置TEXINPUTS

export TEXINPUTS=".:./assets/tex:"

其中“ assets / tex”表示.sty文件所在的子目录。我不知道如何将上述代码合并到我的makefile中,以便在子目录中识别.sty文件,而将.Rmd编织为PDF。在当前状态下,如果我从根目录中删除.sty文件,然后将其放在上述子目录中,则会出现以下错误:

! LaTeX Error: Command \fax already defined.
           Or name \end... illegal, see p.192 of the manual.
我认为之所以发生

是因为moderncv类需要-并且无法找到-相关的.sty文件。

1 个答案:

答案 0 :(得分:1)

您可以尝试在make规则中定义环境变量:

%.pdf : %.Rmd
    export TEXINPUTS=".:./assets/tex:"
    Rscript -e 'rmarkdown::render("$<")'

或者您可以在Rmd文件的设置块中设置环境变量:

```{r setup, include = FALSE}
Sys.setenv(TEXINPUTS=".:./assets/tex:")
```

注意:由于缺少最少的示例,因此未经过测试。