最小工作示例

最小工作示例

我遇到了一个问题,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命令列表前面添加命令可以以某种方式修复这个问题。

相关内容