【问题标题】:Emacs/AUCTeX prefix argumentsEmacs/AUCTeX 前缀参数
【发布时间】:2013-01-17 20:37:16
【问题描述】:

在 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 命令 master 之前保存文档的功能。可能对你也有好处。
  • @Dualinity:仅适用于第一次确认。 C-c C-c 也要求确认操作类型,例如编译或查看。
  • 对于“view”,你可以使用C-c C-v,反正我就是这么用的。对我来说,这并不要求确认。如果这不能直接为您完成,请告诉我,因为在我的设置中的某个地方我确实有一些东西可以放弃确认。
  • @Dualinity:我收到两个确认请求:“保存”和“命令”。使用保存的文档,我只能避免第一个;它仍然要求我对文档进行 LaTeXing。
  • 你检查过C-c C-v吗,这听起来还是C-c C-c。使用v 应该直接转到“查看”

标签: emacs latex elisp auctex


【解决方案1】:

我认为这个问题的要点是“如何在没有所有按键和确认的情况下从 AUCTeX 快速编译我的 TeX 文档?”

我对此的回答是使用 latexmk 命令,而不是试图强迫 AUCTeX 这样做。

latexmk -pdf -pvc myfile.tex

latexmk 将监控有问题的文件,并在您保存后立即重建它。如果您使用好的 pdf 查看器,它会注意到 PDF 的变化并立即重新显示。在 OS X 上,skim 可以很好地解决这个问题。

【讨论】:

    【解决方案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 试图变得聪明,在正确的场合给出正确的命令,例如编译缓冲区修改,否则打开查看器。我试图对此发布答案进行补救。
    • 如何将my-run-latex绑定到C-c C-c
    【解决方案3】:

    如果您只是想在没有确认对话框的情况下编译乳胶源,只需将以下内容添加到您的 .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 来查看它。就像其他人建议的那样,您也可以对 save 命令执行相同的操作,并让它在保存时自动编译,但我的一些文档在 CVS 中,所以我避免在上面添加钩子。

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

    【讨论】:

      【解决方案4】:

      构建和查看

      同样,此解决方案不是修改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 并启动指定的构建视图过程或将其与新的键绑定相关联,例如“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 不受影响,并且会继续询问确认。

      请编辑此代码以使其更好或更易于阅读!

      【讨论】:

      • 不错,我一直在寻找那个命令!一点点:如果它编译成功,编译消息hit C-c C-l to view the log 不会消失。我用(TeX-view)替换了(TeX-view)来解决这个问题,我不需要每次编译时触发TeX-view
      • @Kevin: 抱歉,将(TeX-view) 替换为(TeX-view)?错字?
      • 确定它是一种类型,我的意思是“我将其替换为(消息“文档已成功格式化。`”)
      • @Antonio,当出现错误时,执行 C-c ` 或 C-` 不会进入调试模式。有什么解决办法吗?还是我们只是做 C-c C-c 并检查?只是想知道为什么会发生这种情况。
      【解决方案5】:

      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。但仍会要求您确认命令操作。

      【讨论】:

      • 如果您将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)))
      • +1 谢谢@Tyler。你知道是否有办法判断TeX-command "LaTeX" 何时完成?如果我们要重写TeX-command-master,我们可以通过设置构建和视图序列来更好地完成许多现代专业TeX 编辑器:TeX-command "LaTeX" -&gt; TeX-view。无论如何,TeX-view 如果立即启动(即在TeX-command "LaTeX" 完成其工作之前)会给出错误。
      【解决方案6】:

      查看Emacs' documentation 以了解前缀参数。通常,您可以向命令传递带有 C-u 的前缀参数,后跟一个数字。对于一位数字,您也可以只键入 Meta 后跟数字。因此,要将正前缀参数传递给TeX-command-master,您可以输入:

      M-1 C-c C-c

      然而,这实际上会添加另一个 minibuffer 确认,即关于用于编译 LaTeX 源的 shell 命令。如果没有前缀参数,则使用依赖于命令的默认值。

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

      (setq TeX-command-force "LaTeX")
      

      但是,这将有一个缺点,即您基本上将 Cc Cc 绑定到“latex”命令,您不能使用任何其他命令,例如“bibtex”或“view”。

      除此之外,LaTeX 模式不允许对 C-c C-c 进行任何自定义。您最好的选择是 advise 函数 TeX-command-query 或将 C-c C-c 绑定到包装函数以动态设置 TeX-command-force。如果您还想自动保存缓冲区,后者可能是首选选项。

      【讨论】:

      • 对我来说M-1 C-c C-c 不断询问确认(保存和编译/查看)。也许答案来自告诉参数必须肯定“而不是'TeX-command-list'中的条目”的帮助。从这个变量的帮助中,我读到TeX-command-list 是要在当前文档上执行的命令列表,其中每个元素都是一个列表,其第一个元素是命令的名称,因为它将呈现给用户。我一直不明白哪个是条目要求是积极的
      • 也许您可以澄清您的实际意思是什么确认。如果您通过在C-c C-c 之前输入M-1Tex-command-master 提供正前缀,您实际上添加 更多确认,即关于要使用的shell 命令,否则将使用默认值。
      • 我的意思是所有确认,我不想有任何确认,以进一步阐明C-c C-c 的工作原理。它是命令上下文驱动的。如果 TeX 文件没有保存,它会要求确认:a) 你想保存文件,b) 你想编译它。如果保存了 TeX 文件,它会询问您是否要通过默认查看器查看它。默认值总是可以的,我想覆盖确认。希望这会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2023-03-31
      • 2013-05-27
      相关资源
      最近更新 更多