解决方案 1(emacs 在最后一次编译后重新加载 okular)

解决方案 1(emacs 在最后一次编译后重新加载 okular)

我使用 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

看起来我的版本太旧了,latexmkJohn 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 重新加载(即使从命令行运行)(最好有增量预览)。

相关内容