我使用 emacs+latexmk 编译文档,使用 okular 查看。Okular 会在 pdf 发生更改时自动更新,但问题是,由于 pdf 正在创建,因此在编译过程中 Okular 会显示黑色文档。因此,在编译过程中,这意味着我无法查看我的文件,这有点烦人,因为我经常想同时继续阅读我的文档。
在 latexmk 中,有什么更简单的方法可以在另一个文件夹中编译文档,并在完全编译后复制回最终的 pdf?这样,okular 就会让我在编译过程中阅读我的 pdf。
编辑
关于 John 提出的解决方案,当我运行此命令时:
$ latexmk main.tex
Rc files read:
/home/me/.latexmkrc
Latexmk: This is Latexmk, John Collins, 29 September 2020, version: 4.70b.
Set environment variable BIBINPUTS='build:'
Set environment variable TEXINPUTS='build:.:/home/me/.emacs.d/.local/straight/build-27.2/auctex/latex:'
Latexmk: applying rule 'pdflatex'...
Rule 'pdflatex': The following rules & subrules became out-of-date:
'pdflatex'
------------
Run number 1 of rule 'pdflatex'
------------
------------
Running 'pdflatex -recorder -output-directory="." -aux-directory="build" "main.tex"'
------------
/nix/store/hr2wphv47rqnrckmcjavn1r5yq7a8ks0-texlive-combined-full-2021.20210408/bin/pdflatex: unrecognized option '-aux-directory=build'
This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021/NixOS.org) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./main.tex
LaTeX2e <2020-10-01> patch level 4
[...]
文件并不是在最后被复制的。事实上,如果我在编译过程中定期检查 pdf 的大小,我会发现它的大小增加了:
$ md5sum main.pdf; ls -alh main.pdf
58e69aead33520a0228f797773ff0030 main.pdf
-rw-r--r-- 1 me users 1,1M sept. 30 09:52 main.pdf
$ md5sum main.pdf; ls -alh main.pdf
42ad0da92fc621c7106101b21ad60a96 main.pdf
-rw-r--r-- 1 me users 18K sept. 30 09:52 main.pdf
$ md5sum main.pdf; ls -alh main.pdf
0cbf954ce5a1723304561673088bec65 main.pdf
-rw-r--r-- 1 me users 115K sept. 30 09:52 main.pdf
$ md5sum main.pdf; ls -alh main.pdf
59ee8e1ac1c2aa785b0f4b3444b5f0b3 main.pdf
-rw-r--r-- 1 me users 148K sept. 30 09:52 main.pdf
$ md5sum main.pdf; ls -alh main.pdf
1f15aff8cb79793a9a0b31495e5a7c21 main.pdf
-rw-r--r-- 1 me users 178K sept. 30 09:52 main.pdf
我尝试强制将输出放在另一个文件夹中,然后使用$pdf_update_command
如下方法将其复制回来:
$emulate_aux = 1;
$out_dir = 'out';
$aux_dir = 'build';
$pdf_previewer = '';
$pdf_update_method = 4;
$pdf_update_command = 'cp out/*.pdf .';
$pdf_mode = 1; # Default to pdf.
但更新命令没有运行,不知道为什么。
编辑
因此,正如评论中指出的那样,$pdf_update_command
仅在模式下运行-pvc
。因此我尝试了:
$out_dir = 'out';
$pdflatex = 'pdflatex %O %S && cp %D .';
$pdf_mode = 1; # Defaults to pdf.
现在升级效果很好(每次迭代都会刷新,没有任何闪烁),但参考书目存在问题,现已无法找到:
梅威瑟:
\documentclass{article}
\usepackage{filecontents}
\usepackage[style=trad-alpha]{biblatex}
\begin{filecontents}{myrefs.bib}
@Book{Knuth:1990,
author = {Knuth, Donald E.},
title = {The {\TeX}book},
year = {1990},
isbn = {0-201-13447-0},
publisher = {Addison\,\textendash\,Wesley},
}
@Book{Lamport:94,
author = {Lamport, Leslie},
title = {\LaTeX: A Document Preparation System},
year = {1994},
isbn = {0-021-52983-1},
publisher = {Addison\,\textendash\,Wesley},
}
\end{filecontents}
\addbibresource{myrefs.bib}
\begin{document}
\section{Main Body}
{\LaTeX} is a Turing-complete (procedural) markup language and typesetting processor~\cite{Lamport:94}.
\printbibliography
\end{document}
答案1
如果您不介意将 aux、log 等文件放在一个目录中,将 pdf 文件放在另一个目录中,则 latexmk 的最新版本(至少 4.73)可以完全满足您的要求。以下是 latexmkrc 文件中的合适代码:
$emulate_aux = 1;
$out_dir = 'output';
$aux_dir = 'aux';
关键的是第一个。它告诉 latexmk 它不能向 pdflatex(或您使用的任何程序)提供 -aux-directory 选项,但必须模拟其效果。编译本身会在 aux 目录中生成 pdf 文件,然后 latexmk 将其移动到输出目录,这是一个快速的操作。(它还会移动 fls 文件和任何 synctex 文件。)
latexmk 之所以有这种可能性,是因为只有在 MiKTeX 实现中,tex 程序才支持 -aux-directory 选项。TeXLive 的程序不支持。TeXLive 的官方立场是,这类事情应该由 latexmk 之类的程序来处理。所以这正是现在实现的。
答案2
看起来我的版本太旧了,latexmk
John Collins 的解决方案无法使用,而且配置out
似乎build
会破坏 biblatex。所以我找到了两个我不太喜欢的解决方案(因为我需要禁用 okular 自动更新功能),但它们工作得很好:
解决方案 1(emacs 在最后一次编译后重新加载 okular)
在 emacs 中使用 latexmk + 禁用 Okular 中的自动重新加载(配置 > 配置 Okular > 当文件更新时重新加载文档(选项卡常规、近似翻译)),emacs 会在编译结束时自动调用 Okular。
为了配置 emacs,我实际上使用 doom emacs(带有选项(latex +latexmk)
),并且我的.config
包含类似的东西(应该可以与 emacs 一起使用,但我的实际配置有点不同,所以如果失败请告诉我):
(after! latex
;; you can get the list of builtin viewers using C-h v TeX-view-program-list-builtin RET
;; But for some reasons, the default Okular viewer is broken due to a "file:"...
(add-to-list 'TeX-view-program-list '("Okular" ("okular --unique %o"
(mode-io-correlate "#src:%n%a"))))
(setq TeX-view-program-selection '((output-pdf "Okular")))
解决方案 2(latexmk 在每次编译时重新加载 okular)
在 Okular 中禁用自动重新加载(配置 > 配置 Okular > 文件更新时重新加载文档(选项卡常规、近似翻译)),并添加~/.latexmkrc
:
$pdflatex = 'pdflatex %O %S && okular --unique %D';
使用此解决方案,okular 将在每次新编译时直接由 latexmk 重新加载(即使从命令行运行)(最好有增量预览)。