TexMaker - 处理多个 tex 文件时,自动完成功能不起作用

TexMaker - 处理多个 tex 文件时,自动完成功能不起作用

背景

我目前正在编写的文档变得相当大,所以我决定将其拆分。

我已经尝试过\include\input命令,但问题仍然未解决。

我已将第一章file 1.tex从主文档中分离出来,并将其包含在所提到的命令中(两种命令都尝试过)。

主文件被标记为 Master。

我在不同部分之间有交叉引用(方程式、标签等等)。

问题

在中file 1.tex,我引用了labelsequations文档的不同部分(命令之前和之后)\include

但是,自动完成功能只对命令之前提到的labels有效,而对命令之后插入主文件中的无效。equations\include\include

有没有什么办法解决这一问题?

梅威瑟:

主文本:

\documentclass{article}
\begin{document}
\section{1st}
\begin{equation}
    a=1
    \label{eq:1}
\end{equation}
all the equations of the paper: \ref{eq:1}, \ref{eq:2}, \ref{eq:3}

\include{2}

\section{3rd}
\begin{equation}
    a=3
    \label{eq:3}
\end{equation}
all the equations of the paper: \ref{eq:1}, \ref{eq:2}, \ref{eq:3}
\end{document}

2.tex:

\section{2st}
\begin{equation}
    a=2
    \label{eq:2}
\end{equation}
all the equations of the paper: \ref{eq:1}, \ref{eq:2}, \ref{eq:3}

在 Main.tex 中,自动完成功能对所有 3 个方程式都有效(当写入 \ref... 时),但在 2.tex 中,自动完成功能仅对第二个方程式有效。

答案1

将主文档放在当前编辑窗口中。现在选择选项-定义当前>文档为“主文档”。这将完成您所要求的操作,我刚刚这样做了。此外,现在您可以从任何文件进行编译,并且它将正常工作。

对我来说很有用,非常感谢。这真的让我很烦。现在开心多了……

答案2

据我所知,这是 TM 和 TS 的主要缺点之一。我猜是它在.aux当前文件的文件里查找。如果有的话\@input{file.aux} 它也会在那里查找。

但这意味着,当你在2.tex文档的其余部分时并没有引用这一特定的.aux

.aux然后设置主文档,TM在寻找标签等时确实应该返回主文件。

如果不使用会发生什么情况\include

编辑:

刚刚用最新的 TM 测试了一下。没运气。情况似乎更糟。它直接查看了\label中的2.tex

尝试添加

\newcommand\test[1]{\label{#1}}

并将其2.tex替换\label{eq:2}\test{eq:2}。现在 TM 找不到任何标签。

正如前面提到的,它确实应该查找文件.aux。它会错过label=key等等listings

我个人使用 Emacs,实际上我不太清楚它从哪里获取标签信息,但它确实可以很好地处理多个文件(它可能也在寻找\label)。

答案3

正如前面所回答的,Texmaker 似乎没有引用文档结构中包含的文件中声明的标签。

但是,您可以使用的一种解决方法是使用 Texmaker 检测现有标签的方式,欺骗它认为您正在文档内声明标签,而事实上并非如此。

让我通过重复使用您的 MWE 来解释。

主.tex:

\documentclass{article}
\def\ProvideLabels#1{}
\def\LabelsAvailable#1{}
\begin{document}
\section{1st}
\begin{equation}
    a=1
    \label{eq:1}
\end{equation}
all the equations of the paper: \ref{eq:1}, \ref{eq:2}, \ref{eq:3}

\include{2}\ProvideLabels{\label{eq:2}}

\section{3rd}
\begin{equation}
    a=3
    \label{eq:3}
\end{equation}
all the equations of the paper: \ref{eq:1}, \ref{eq:2}, \ref{eq:3}
\end{document}

2.tex:

\LabelsAvailable{\label{eq:1}\label{eq:3}}
\section{2st}
\begin{equation}
    a=2
    \label{eq:2}
\end{equation}
all the equations of the paper: \ref{eq:1}, \ref{eq:2}, \ref{eq:3}

在文档的序言中添加\def\ProvideLabels#1{}\def\LabelsAvailable#1{}将创建两个命令,您可以向它们传递参数,但它们不会执行任何操作。换句话说,无论您在其中写入什么,只有 Texmaker 才会对其感兴趣,因为它不依赖于正确的 latex 编译来查看\label{stuff}您编写的是否真正被 latex 使用。

现在,您可以\ProvideLabels{\label{label1} \label{label2}}在调用 后在主文档中使用\include来向 Texmaker 解释在所包含的文档中创建了哪些标签。按照同样的逻辑,您可以\LabelsAvailable{\label{label1} \label{label2}}在所包含的文档中使用 来向 Texmaker 解释在主文档或其他所包含的文档中创建了哪些标签。

您可以使用相同的逻辑向Texmaker解释文档本身的结构,但通常在编写文档时这不太重要。

我确实意识到这个解决方案维护起来非常麻烦,非常不合理,而且绝对不理想,但我自己找不到更好的解决方案。当然,理想情况下,Texmaker 应该在这类事情上更聪明一些。

答案4

将主文档放在当前编辑窗口中。现在选择选项-将当前文档定义为“主文档”。这将完成您所要求的操作,我刚刚这样做了。此外,现在您可以从任何文件进行编译,并且它将正常工作。

相关内容