Synctex:使其与访问其内容的环境一起工作(例如 environ 或 xparse +b 选项)

Synctex:使其与访问其内容的环境一起工作(例如 environ 或 xparse +b 选项)

environ如果我使用and\BODYxparseand创建环境+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。

笔记

相关内容