environ
如果我使用and\BODY
或xparse
and创建环境+b
,synctex 功能就会中断:它不会转到相应的行,而是转到环境的末尾。我猜想将\BODY
放入宏中会干扰 LaTeX,但我很想知道我是否可以以某种方式解决这个问题(最终在 lualatex 中)
平均能量损失
\documentclass[]{article}
\usepackage{environ}% http://ctan.org/pkg/environ
%% The +b is needed because in real life the text may be moved to another file
\NewDocumentEnvironment{testSynctex}{s+b}{
\IfBooleanTF{#1}{}{#2}%
}{}
\NewEnviron{testSynctexEnviron}{%
\BODY
}
\begin{document}
\section{xparse}
\begin{testSynctex}
This
is
a
long
text
try
to synctex
me !
\end{testSynctex}
\section{xparse*}
\begin{testSynctex}*
This
text
should
be
hidden
\end{testSynctex}
\section{environ}
\begin{testSynctexEnviron}
This
is
a
long
text
try
to synctex
me !
\end{testSynctexEnviron}
\end{document}
编辑
user202729 提出的解决方案对于上述 MWE 非常有效(它确实回答了我的部分问题,如果我找不到更通用的答案,它肯定会很有用)。但是,这里有另一个我想解决的 MWE,其中 user202729 提出的解决方案不再有效:
我在两个部分之间复制文本(通过先将内容写入文件,然后再输入该文件)。不幸的是,这会破坏 synctex:不仅对于复制的文本(它会进入虚拟文件而不是主文件),而且对于初始文本(它会进入环境的末尾)也是如此。
能否让 synctex 至少对第一部分的文本起作用?如果您能让它对第二部分的文本也起作用……那就太棒了。
梅威瑟:
\documentclass{article}
\def\nameOfFile{mydummyfile.tex}
%% Write to a file
\newwrite\appendwrite
\NewDocumentCommand\writetofile{m+m}{%
%% Open the file
\immediate\openout\appendwrite #1\relax%
%% Write the text to the file
\immediate\write\appendwrite{#2}%
%% Close the file
\immediate\closeout\appendwrite%
}
\NewDocumentEnvironment{duplicateContentKeepSynctex}{+b}{%
#1%
\writetofile{\nameOfFile}{#1}%
}{}
\begin{document}
\section{Main body}
\begin{duplicateContentKeepSynctex}
This content is duplicated to another section.
However synctex does not work in both sections.
Ideally I'd love to make synctex work in both sections (in such a way that it always links to the main file, NOT mydummyfile).
But I guess it's impossible.
But at least, is it possible to make it work for the first section?
\end{duplicateContentKeepSynctex}
\section{Duplicated section}
\input{\nameOfFile}
\end{document}
答案1
我不明白在宏扩展语言中如何实现这一点。宏的内容不会被处理,因此您只能在使用它的地方获得错误消息或 synctex 标记,而这些标记可能离定义很远。在这些情况下,保存环境主体的内部宏恰好在定义附近使用,因此 synctex 数据靠近源,但对于 tex 来说,您的示例就像
\def\abc{
some text
XXX
that gets saved here
}
multiple pages of arbitrary document source
\abc
并且您要求 synctex 将 XXX 与定义中间的第 4 行关联,而不是与使用\abc
“多页之后”的行关联。\abc
答案2
好的,解决方案。
如果使用 lualatex 进行编译,则两个部分都会保留 synctex,否则仅保留第一部分。
%! TEX program = pdflatex
\documentclass{article}
\usepackage{saveenv}
\usepackage{currfile}
\usepackage{rescansync}
\ExplSyntaxOn
\NewDocumentEnvironment{duplicateContentKeepSynctex}{}{%
\rescansyncSaveenvghostPacked \savedcontent
}{
\endrescansyncSaveenvghostPacked
}
\ExplSyntaxOff
\begin{document}
\section{Main body}
\begin{duplicateContentKeepSynctex}
This content is duplicated to another section.
However synctex does not work in both sections.
Ideally I'd love to make synctex work in both sections (in such a way that it always links to the main file, NOT mydummyfile).
But I guess it's impossible.
But at least, is it possible to make it work for the first section?
\end{duplicateContentKeepSynctex}
\section{Duplicated section}
\rescansyncPacked \savedcontent
\end{document}
\savedcontent
它实际上并不将内容写入文件,内容以某种用户不应该触碰的特殊格式存储。如果用户想要手动操作内容,请使用rescansync
包的编程 API。
笔记
不在 CTAN 上的软件包软件包现已在 CTAN 上:https://ctan.org/pkg/rescansync。那里有包文档。