我如何覆盖或者“伪造” synctex 位置?
假设我们有一个文件foo.tex
,其中定义了一个命令:
%% foo.tex
\newcommand{\foo}{Very much content here}
以及文件 bar.tex,其中使用以下命令:
%% bar.tex
\foo
在这种情况下,synctex 会跳转到bar.tex
,但我希望它跳转到 foo.tex。
是否有可能创建一个命令\setSynctexPosition
,其含义类似于“synctex,请将我与文件 foo.tex 同步”,如下所示:
%% foo.tex
\newcommand{\foo}{%
\setSynctexPosition{foo.tex}{line 3}%
Very much content here%
}
这可以做到吗,例如通过向.synctex
文件附加一些文本,例如\immediate\write18{echo '<some synctex commands>' >> \jobname.synctex}
?
答案1
最后,我找到了一个解决方案,它出奇的简单!
为了完整起见:
%% bar.tex
\documentclass{article}
\input{foo}
\begin{document}
\foo
\end{document}
解决方案:
%% foo.tex
\ifdefined\fakesynctexhelper\fakesynctexhelper\fi%% Does nothing at the beginning, helps later
\newcommand{\foo}{%
{%% group, so that if will not be defined later anymore
\def\fakesynctexhelper{%
Very much content here%% The actual desired content of \foo
%
\endinput%% Stop processing the file again
}%
\input{foo}%% input this file, so that the synctex information is updated.
}%
}
在 的开头foo.tex
,如果定义了辅助命令,则运行该命令。在 命令 中,\foo
我们定义辅助命令来执行\foo
应执行的操作并调用文件foo.tex
,其中此命令在开头展开,以便 synctex 知道/认为已foo.tex
处理。此外,辅助命令设置为停止对文件的进一步处理foo.tex
,以便不会再次处理其原始内容。