Synctex: заставить его работать со средой, получающей доступ к его содержимому (например, environ или xparse +b option)

Synctex: заставить его работать со средой, получающей доступ к его содержимому (например, environ или xparse +b option)

Если я создаю окружение с помощью environand \BODYили xparseand +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

Я не вижу, как это возможно в языке макрорасширения. Содержимое макроса не обрабатывается, поэтому вы можете получить только сообщения об ошибках или маркеры синтекса, где он используется, и это может быть далеко от определения. В этих случаях внутренний макрос, сохраняющий тело среды, используется близко к определению, поэтому данные синтекса близки к источнику, но для текса ваш пример выглядит так:

\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каком-то специфическом формате, который пользователь не должен трогать. Если пользователь хочет вручную манипулировать содержимым, используйте программный API пакета rescansync.

Примечание

  • пакеты не на CTANПакет теперь на CTAN:https://ctan.org/pkg/rescansync. Там есть документация по пакету.

Связанный контент