我遇到了一个问题,Texstudio 只运行命令列表中的第一个命令,我想知道我是否做错了什么。这是一个最小的工作示例,您可以明白我的意思。
最小工作示例
首先,我将配置 texstudio 使其产生错误,然后我将按照步骤产生奇怪的行为。
配置 texstudio
创建新文件夹并创建包含内容的test
文件test.tex
\documentclass{article}
\begin{document}
test
\end{document}
现在test.tex
使用 texstudio 打开,在 texstudio 菜单中,转到选项>配置 texstudio...,单击左侧窗格中的命令选项卡,然后将 PdfLatex 的命令(对我来说是命令列表中的第二个)更改为
ls | pdflatex -synctex=1 -interaction=nonstopmode %.tex
此命令与默认的 texstudio 的默认 pdflatex 命令不同,因为添加了ls |
。当然,ls
这是您通常在终端中输入的内容。它在这里没有任何用处,只是作为一个虚拟命令。|
用于分隔多个命令(如果您有要运行的命令列表,如所述)这里在第二段第三句。
要测试所有配置是否正确,请在 texstudio 菜单中转到工具>命令>PDFLaTeX。在我的系统上,文件照常编译,并且您会得到预期的输出。在消息输出中,您应该看到
进程已启动:ls
进程正常退出
进程已启动:pdflatex -synctex=1 -interaction=nonstopmode "texTemplate".tex
进程正常退出
你会看到有两个进程:一个用于ls
,一个用于pdflatex
产生奇怪的行为
现在一切都已配置完毕,我们准备产生奇怪的行为。这里的第一步表现出正常行为,但对于产生奇怪的行为是必要的。在 中test.tex
,将“test”更改为“te\st”,这样 text.tex 现在看起来像这样
\documentclass{article}
\begin{document}
te\st
\end{document}
就像您在配置部分中所做的那样,运行工具>命令> PDFLaTeX。这次源文件包含错误,因此我们期望Texstudio会告诉我们有关错误的信息,事实确实如此,所以这里没有什么奇怪的。从texstudio中的“消息”中,我们看到
进程已启动:ls
进程正常退出
进程已启动:pdflatex -synctex=1 -interaction=nonstopmode "texTemplate".tex
进程因错误而退出
现在,去恢复text.tex
到其原始内容(即,将“te\st”改回“test”)。然后,运行工具>命令>PDFLaTeX。现在事情变得有趣了。它向我们显示了日志,就好像我们没有改回“test”一样。查看 textstudio 中的“消息”,我们明白了为什么 texstudio 会这样做。“消息”输出是
进程已启动:ls
进程正常退出
仅ls
运行。pdflatex
从未运行,因此日志文件从未更改。现在,如果您删除除 之外的所有文件test.tex
,然后重新启动 texstudio,您当然可以使用 texstudio 编译该文件。事实上,只需删除日志文件并重新启动 texstudio 即可。
所以我的问题是,无论源文件中是否有错误,如何让 texstudio 运行所有命令?是我做错了什么还是这是 texstudio 的一个错误。
答案1
您设置的构建系统处于一个灰色区域,无法保证其行为:命令面板上的命令应该只是单一构建系统命令。请注意,|
chains 构建系统命令(参见手册)。
背景:为什么会失败?
txs:///pdflatex
在内部标记为编译命令,即它会检查日志文件中的错误,如果有错误则停止。由于技术原因,这会在每个子命令上执行(我们预计只有一个子命令,即 pdflatex 调用)。对于您来说,一旦您的日志运行中出现错误ls
,编译就会中止,并且您永远不会得到新的 pdflatex 调用来更新日志。
你应该做什么:
您可以通过多种方式来修复配置:
- 不要在 TeXstudio 中链接命令,而是在 shell 中:
sh -c "ls & pdflatex ..."
,或者将所有命令放在 shell 脚本中并调用它。 - 通过创建用户命令链接构建系统(“构建”页面)中的命令:
这两种变体在自动重新编译的行为上略有不同:TXS 检查日志是否包含需要重新运行的信息,然后再次运行 pdflatex(可在 中配置Build -> Build Options
,默认启用)。第一种情况ls
每次重新运行时都会运行,即ls pdflatex ls pdflatex ...
,第二种情况ls
只运行一次ls pdflatex pdflatex
。
- 根据您实际想要对占位符执行的操作
ls
,还有其他变体,例如Build -> Meta Commands -> Precompile
。每次构建仅运行一次(请注意,如果有参考书目,则编译运行两次:)compile bibliography compile
。
答案2
可以通过删除 周围的空格来避免此行为|
。然后命令变为
ls|pdflatex -synctex=1 -interaction=nonstopmode %.tex
但是,此解决方案有局限性:如果第一个命令中有空格(例如,带有诸如 之类的标志的命令ls -l
),则此解决方案不起作用。在这种情况下,您可以将 添加ls
到命令列表的前面,这样就会得到正确的行为。因此,例如,以下操作不起作用
ls -l|pdflatex -synctex=1 -interaction=nonstopmode %.tex
但下面这样做,并达到了同样的效果
ls|ls -l|pdflatex -synctex=1 -interaction=nonstopmode %.tex
(请注意,第一个命令ls
与第二个命令无关ls
。在实际应用中,第一个命令始终是ls
(或任何其他“不适用“命令(只要它没有空格),但第二个命令将是应用程序所需的任何命令,例如创建目录或移动文件或链接文件。)
至于问题中是否存在什么错误,我并不确定,但我猜测这种行为是由于 texstudio 中的一个错误造成的,尤其是考虑到在ls
命令列表前面添加命令可以以某种方式修复这个问题。