Emacs / AUCTeX 前缀参数

3
在LaTeX模式下,C-c C-c 绑定了以下功能:
(TeX-command-master &optional OVERRIDE-CONFIRM)

通常,此交互功能运行命令,例如LaTeX编译,并“要求确认”。在tex-buf.el中,它读取:
如果给定了前缀参数OVERRIDE-CONFIRM,则确认将取决于它是否为正,而不是“TeX-command-list”中的条目。
这对我来说有点晦涩,阅读C-h v TeX-command-list也没有帮助。
如何将前缀参数传递给“TeX-command-master”,以避免所有确认请求?

我自己做的是,在调用tex命令主函数之前,编写了一个保存文档的函数。你也可以这样做,这可能会对你有好处。 - PascalVKooten
@Dualinity:仅适用于第一次确认。C-c C-c 也会要求对操作类型进行确认,例如编译或查看。 - antonio
对于“view”,您可以使用C-c C-v,这是我使用的方式。对我来说,它不会要求确认。如果这对您没有直接起作用,请告诉我,因为那么在我的设置中我有一些可以取消确认的东西。 - PascalVKooten
@Dualinity:我收到两个确认请求:“保存”和“命令”。对于已保存的文档,我只能避免第一个请求;它仍会要求我对文档进行LaTeX处理。 - antonio
你检查过 C-c C-v 了吗?这听起来仍然像是 C-c C-c。使用 v 应该直接进入“查看”模式。 - PascalVKooten
@Dualinity:抱歉,我没写清楚。C-c C-v 运行得很好。问题不是很严重,只是要避免编译时的确认提示。 - antonio
6个回答

2
请查看Emacs文档,了解前缀参数。通常情况下,您可以使用C-u后跟一个数字来向命令传递前缀参数。对于一位数,您也可以输入 Meta 后跟该数字。因此,要将正的前缀参数传递给 TeX-command-master,您可以输入:

M-1 C-c C-c

然而,这实际上会在小型缓冲区中再次确认关于用于编译LaTeX源的shell命令。如果没有前缀参数,则使用与命令相关的默认值。

如果您想避免有关要使用的命令的问题,可以通过以下方式将未记录的变量 TeX-command-force 绑定到“LaTeX”:

(setq TeX-command-force "LaTeX")

然而,这样做的缺点是会将C-c C-c键绑定到“latex”命令,不能使用其他命令,如“bibtex”或“view”。
除此之外,LaTeX模式不允许对C-c C-c进行任何自定义。你最好的选择是要么建议函数TeX-command-query,要么将C-c C-c键绑定到包装函数以动态设置TeX-command-force。如果你还想自动保存缓冲区,后一种方法可能是首选。

对我来说,M-1 C-c C-c 一直在询问两个确认(保存和编译/查看)。也许答案来自于帮助文档,告诉我们参数必须是“正数”,而不是“TeX-command-list”中的条目。从这个变量的帮助文档中,我读到 TeX-command-list 是一个要在当前文档上执行的命令列表,其中每个元素都是一个列表,其第一个元素是命令的名称,如它将呈现给用户的那样。我仍然不明白所需的“条目”是什么,需要是“正数”。 - antonio
也许您可以澄清一下您实际指的确认是什么。如果您在 C-c C-c 之前键入 M-1Tex-command-master 添加一个正前缀,您实际上会添加更多的确认,即关于要使用哪个shell命令,否则将使用默认值。 - Thomas
我只是想说,我希望没有任何确认,以进一步澄清C-c C-c的工作方式。它是一个命令上下文驱动的功能。如果TeX文件没有保存,则会询问确认:a)您是否要保存文件和b)是否要进行编译。如果TeX文件已保存,则会询问确认是否要通过默认查看器查看。默认值始终是OK的,我希望覆盖这些确认。希望这有所帮助。 - antonio

2

构建和查看

与其修改TeX-command-master的行为,这个解决方案将其重写。命名为build-view的重写命令遵循一个相当简单的逻辑。

  1. 如果LaTeX文件缓冲区未修改,则运行默认查看器;
  2. 如果缓冲区已更改,则运行默认的LaTeX编译器,并在编译后在默认查看器中打开输出。

以下是代码:

(defun build-view ()
  (interactive)
  (if (buffer-modified-p)
      (progn  
    (let ((TeX-save-query nil)) 
    (TeX-save-document (TeX-master-file)))
    (setq build-proc (TeX-command "LaTeX" 'TeX-master-file -1))
    (set-process-sentinel  build-proc  'build-sentinel))
    (TeX-view)))

(defun build-sentinel (process event)    
  (if (string= event "finished\n") 
      (TeX-view)
    (message "Errors! Check with C-`")))

现在您可以输入M-x build-view并启动所述的build-view进程,或将其与新的键位绑定(例如“F2”)关联起来。
(add-hook 'LaTeX-mode-hook '(lambda () (local-set-key (kbd "<f2>") 'build-view)))

注意:如Tyler所建议,TeX-save-query变量被本地更改,因此旧的C-c C-c/ TeX-command-master不受影响,仍会保持询问确认。请编辑此代码以使其更好或更易于阅读!

不错,我已经寻找那个命令有一段时间了!只有一个小问题:如果编译成功,编译消息“按C-c C-l查看日志”将不会消失。我用(TeX-view)替换了(TeX-view)来解决这个问题,我不需要每次编译都触发TeX-view - Kevin
@Kevin:抱歉,是将(TeX-view)替换为(TeX-view)吗?打错字了吗? - antonio
当然这是一种类型,我指的是“我已将其替换为(消息“文档成功格式化。”)”。 - Kevin
@Antonio,当出现错误时,按C-c或C-不会进入调试模式。有什么解决办法吗?还是只能按C-c C-c并检查?我只是想知道为什么会发生这种情况。 - Anusha

2

我曾经对 OVERRIDE-CONFIRM 位有些困惑,无法理解它应该如何工作。如果您想自动运行Latex文件,而不需要先保存文件或确认您需要的是Latex(而不是查看、Bibtex等),您可以使用以下函数:

(defun my-run-latex ()
  (interactive)
  (TeX-save-document (TeX-master-file))
  (TeX-command "LaTeX" 'TeX-master-file -1))

将此绑定到某个方便的东西上,您仍然可以使用C-c C-c来使用默认处理命令。如果“Latex”不是您想要调用的处理器,则可能需要修改 TeX-command 行。


问题在于,除非设置了某些特定选项,否则(TeX-save-document (TeX-master-file))也会要求确认。此外,TeX-command-master试图变得聪明,为正确的场合提供正确的命令,例如,对于已修改的缓冲区进行编译,否则打开查看器。我尝试通过发布答案来解决这个问题。 - antonio
我该如何将“my-run-latex”绑定到“C-c C-c”上? - alper

2
似乎 OVERRIDE-CONFIRM 的奥秘仍在持续。与此同时,有人建议,如果我们无法管理 TeX-command-master,那么我们可以简单地重写它。
在我的版本中,基于他的版本,如果缓冲区没有修改,则启动外部查看器;如果缓冲区已被修改,则运行编译器。一切都不需要确认保存或运行给定命令。
(defun my-run-latex ()
  (interactive)
  (if (buffer-modified-p)
      (progn  
        (setq TeX-save-query nil) 
        (TeX-save-document (TeX-master-file))
        (TeX-command "LaTeX" 'TeX-master-file -1))
    (TeX-view)))

当然,可以将my-run-latex绑定到任何按键上。
从用户的角度来看,这是我自己问题的解决方案。我是否点击了关闭标签?好吧,在好奇的人的角度上,我仍然对理解神秘的TeX-command-master技术很感兴趣。
如果有人知道...
附言:是的,TeX-save-query覆盖了保存文件请求,也与TeX-command-master一样,即C-c C-c。但您仍将被要求确认命令操作。

1
如果您将TeX-save-query的赋值放在(let ...)语句中,您的更改将仅在本地生效,并不会更改此变量的默认值:(defun my-run-latex () (interactive) (if (buffer-modified-p) (let ((TeX-save-query nil)) (TeX-save-document (TeX-master-file)) (TeX-command "LaTeX" 'TeX-master-file -1)) (TeX-view))) - Tyler
+1 感谢,@Tyler。你知道有没有办法判断 TeX-command "LaTeX" 何时完成?如果我们要重写 TeX-command-master,我们可以像许多现代专业的 TeX 编辑器一样设置构建和查看序列:TeX-command "LaTeX" -> TeX-view。无论如何,如果立即启动 TeX-command "LaTeX"(即在其工作完成之前),TeX-view 就会出错。 - antonio

0

我认为这个问题的要点是“如何在AUCTeX中快速编译我的TeX文档,而不需要进行所有按键和确认?”

我的答案是使用latexmk命令,而不是试图强制AUCTeX执行它。

latexmk -pdf -pvc myfile.tex

latexmk将监视所涉及的文件,并在您保存它后立即重新构建它。如果您使用一个好的PDF查看器,它会注意到PDF中的更改并立即重新显示它。在OS X上,skim很适合这个任务。


0
如果您只想编译 LaTeX 源代码而不需要确认对话框,请将以下内容添加到您的 .emacs 文件中:
(setq TeX-command-force "")

你可以使用 C-c C-c 编译源代码,而且不会再询问确认。这种解决方案唯一的问题是你不能再更改命令了,但对于大多数文档来说,你可能也不需要更改。我建议同时将以下内容添加到你的 .emacs 文件中,以获得更大的灵活性,并提供一个等同于以前行为的 C-c C-c 快捷键:
(define-key LaTeX-mode-map "\C-c\C-a"   
   ;;; 'a' for ask, change to anything you want 
  (lambda (arg) (interactive "P") 
    (let ((TeX-command-force nil)) 
      (TeX-command-master arg)))) 

然后您可以继续编辑文档,按下C-x C-s、C-c C-c和C-c C-v查看它。正如其他人建议的那样,您也可以对保存命令执行相同的操作,并在保存时自动编译,但我的一些文档在CVS中,因此我避免在其上放置钩子。

感谢Ivan在这方面提供的帮助-不知道他是否在StackOverflow上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接