Emacs latexmk函数将我放入一个空缓冲区

Emacs latexmk函数将我放入一个空缓冲区,emacs,auctex,latexmk,Emacs,Auctex,Latexmk,这是一个后续行动 我正在使用Emacs中的一个函数,用latexmk编译LaTeX文档,但它的行为并不完全符合我的要求。我使用的功能是: (defun运行latexmk() (互动) (let((TeX保存查询nil) (TeX进程异步零) (主文件(TeX主文件))) (TeX保存文档“”) (TeX运行TeX“latexmk”“latexmk”主文件) (如果(plist get TeX错误报告开关(实习生主文件)) (TeX下一个错误t) (小缓冲区消息“latexmk done”)) (

这是一个后续行动

我正在使用Emacs中的一个函数,用
latexmk
编译LaTeX文档,但它的行为并不完全符合我的要求。我使用的功能是:

(defun运行latexmk()
(互动)
(let((TeX保存查询nil)
(TeX进程异步零)
(主文件(TeX主文件)))
(TeX保存文档“”)
(TeX运行TeX“latexmk”“latexmk”主文件)
(如果(plist get TeX错误报告开关(实习生主文件))
(TeX下一个错误t)
(小缓冲区消息“latexmk done”))
(添加挂钩“乳胶模式挂钩”
(lambda()(本地设置键(kbd“C-0”)#“run-latexmk)))
主要问题是,当我使用该函数时(通过按
C-0
),它有时会将我扔进一个名为TeX Live 2011的空缓冲区

再现此问题的一种方法是尝试编译以下内容(vc.tex不存在并不重要):

\immediate\write18{sh./vc}
\输入{vc}
\documentclass{article}
\开始{document}
\结束{document}
复制它的另一种方法是尝试编译以下内容:

\documentclass{article}
\纽科曼{foo}{
\开始{document}
\结束{document}
一个次要的(装饰性的)问题是,当
运行latexmk
时,minibuffer的高度有时会从一行扩展到两行,运行后会弹回到一行高度。我很难找到一个简单的例子来重现这种行为(我只针对非常大的文档重现了它)

我想为这两个问题找到一个解决方案。我还对在Emacs中与latexmk交互的其他方式感兴趣


下面是上一个示例中的
*…output*buffer
(缺少关闭方括号
\newcommand
的示例):

Running `latexmk' on `test' with ``latexmk''
Latexmk: This is Latexmk, John Collins, 10 October 2011, version: 4.27a.
**** Report bugs etc to John Collins <collins at phys.psu.edu>. ****
Rule 'pdflatex': File changes, etc:
   Changed files, or newly in use since previous run(s):
      'test.tex'
------------
Run number 1 of rule 'pdflatex'
------------
------------
Running 'pdflatex -recorder -halt-on-error -interaction=nonstopmode -shell-escape -synctex=1  -recorder  "test.tex"'
------------
Latexmk: applying rule 'pdflatex'...
This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011)
 \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, ge
rman-x-2011-07-01, ngerman-x-2011-07-01, afrikaans, ancientgreek, ibycus, arabi
c, armenian, basque, bulgarian, catalan, pinyin, coptic, croatian, czech, danis
h, dutch, ukenglish, usenglishmax, esperanto, estonian, ethiopic, farsi, finnis
h, french, galician, german, ngerman, swissgerman, monogreek, greek, hungarian,
 icelandic, assamese, bengali, gujarati, hindi, kannada, malayalam, marathi, or
iya, panjabi, tamil, telugu, indonesian, interlingua, irish, italian, kurmanji,
 lao, latin, latvian, lithuanian, mongolian, mongolianlmc, bokmal, nynorsk, pol
ish, portuguese, romanian, russian, sanskrit, serbian, serbianc, slovak, sloven
ian, spanish, swedish, turkish, turkmen, ukrainian, uppersorbian, welsh, loaded
.
(/usr/local/texlive/2011/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/local/texlive/2011/texmf-dist/tex/latex/base/size10.clo)))
Runaway argument?
{ \begin {document} \end {document} 
! File ended while scanning use of \@argdef.
<inserted text> 
                \par 
<*> test.tex

!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on test.log.
Collected error summary (may duplicate other messages):
  pdflatex: Command for 'pdflatex' gave return code 256
Latexmk: Use the -f option to force complete processing.
Latexmk: Errors, so I did not complete making targets

latexmk exited at Thu Oct 27 08:11:07

我很久以前就遇到过这个问题,我对此进行了研究。这是因为AUCTeX解析输出的方式试图确定错误所在的文件。当TeX开始读取文件时,它会输出
(/path/to/the/file
,当它读取完文件后,它会打印
。AUCTeX可能会有很多误解。它读取的第一个“文件”是TeX Live 2011,然后不管出于什么原因,它认为关闭的文件比打开的文件多,最终你回到了TeX Live 2011

在您给出的简短示例中,问题是输出包含

(./auctex-bug2.texsh: ./vc: No such file or directory
而且它不承认这是一个新文件,因为(我猜想)它包含一个
。当然,它无论如何都是错误的文件,但这既不在这里也不在那里。在运行
TeX next error
(这不可能使用您的
C-0
,因为它会自动调用
TeX next error
,但可以通过
C-C-C-latexmk RET C-C C-l
“手动”运行)

然而,由于我怀疑这个例子是你的实际问题,你需要找出它实际上是什么

对我来说,一个常见的问题是AUCTeX错误地将“满盒”行粘贴在一起。你可以阅读我发现这一点的地方以及修复程序(这是CVS最新的AUCTeX版本,但不是最新的11.86版本)

我最近也遇到了同样的问题,我决定再次深入研究。这次是因为一条线

Package hyperref Message: Driver (autodetected): hpdftex.
它没有将
(自动检测到
)识别为一个文件,但它确实认为
标记了一个文件的结尾。无论如何,我重写了
TeX parse error
,对输出缓冲区进行着色,这对跟踪它有很大帮助。如何修复它当然取决于问题是什么

下面是我用来着色输出的内容。只需计算函数定义,然后正常运行LaTeX

(defun-TeX解析错误(旧)
“转到下一个错误。如果没有找到更多错误,则弹出到旧缓冲区。”
(let((regexp
(康卡特)
特克斯误差
"^\\(!\\|\\(.*?\\):[0-9]+:\\) \\|"
新文件
"(\\(\"[^\"]*?\"\\|/*\
\\(?:\\.+[^()\r\n{}\\/]*\\\\\\\;[^()\r\n{}.\\/]+\
\\(?:[^()\r\n{}.\/]+\\)*\(?:\\.-0-9a-zA-Z.]*\)?\)\
\\(?:[\/]+\\(?:\.+[^()\r\n{}\/]*\\\\\\\\;[^()\r\n{}.\/]+\
\\(?:[^()\r\n{}.\/]+\\)*\(?:\\.-0-9a-zA-Z.]*\)?\)?\)*\)\
)*\\(?:\\\\\r?$\\)\\\\\\”
文件末尾
"\\()\\))*\\|"
挂勾以更改行号
“!\\(?:偏移量(\\([--0-9]+\\)\ \ \”
;钩子以更改文件名
“名称(\\([^)]+\\)\\)\\\\\\\\”
坏盒子
“^\\\(?:过满\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\(?:过满\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\.*?[0-9]+--[0-9]+\\)\\|"
乳胶警告
“^\\(LaTeX[A-Za-z]*\\\\\\包[A-Za-z]+\\)警告:.*))
(而
(续)
((空)
(重新搜索远期regexp nil t))
不再犯错误。
(信息“无更多错误”)
(嘟嘟声)
(TeX pop到缓冲区旧)
零)
特克斯误差
((比赛开始1)
(何时(比赛开始2)
(除非TeX错误文件
(推送nil TeX错误文件)
(推零特克斯误差偏移量))
(除非(汽车特克斯误差偏移)
(rplaca TeX错误文件(TeX匹配缓冲区2)))
(如果(查看“预览”)
T
(TeX错误)
(零)
坏盒子
((比赛开始7)
(如果TeX调试坏框
(项目
(特克斯警告(特克斯匹配缓冲器7))
零)
(向前重新搜索“\r?\n\
\\(?:.\{79\\}\r?\n\
\\)*(*\r?$))
t) )
乳胶警告
((比赛开始8)
(如果TeX调试警告
(项目
(特克斯警告(特克斯匹配缓冲器8))
零)
t) )
;新文件--推送堆栈
((m)
Package hyperref Message: Driver (autodetected): hpdftex.