背景:
我目前正在编写的文档变得相当大,所以我决定将其拆分。
我已经尝试过\include
和\input
命令,但问题仍然未解决。
我已将第一章file 1.tex
从主文档中分离出来,并将其包含在所提到的命令中(两种命令都尝试过)。
主文件被标记为 Master。
我在不同部分之间有交叉引用(方程式、标签等等)。
问题
在中file 1.tex
,我引用了labels
主equations
文档的不同部分(命令之前和之后)\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
将主文档放在当前编辑窗口中。现在选择选项-将当前文档定义为“主文档”。这将完成您所要求的操作,我刚刚这样做了。此外,现在您可以从任何文件进行编译,并且它将正常工作。