![Synctex: заставить его работать со средой, получающей доступ к его содержимому (например, environ или xparse +b option)](https://rvso.com/image/449631/Synctex%3A%20%D0%B7%D0%B0%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B5%D0%B3%D0%BE%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C%20%D1%81%D0%BE%20%D1%81%D1%80%D0%B5%D0%B4%D0%BE%D0%B9%2C%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D0%B5%D0%B3%D0%BE%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%BC%D1%83%20(%D0%BD%D0%B0%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%2C%20environ%20%D0%B8%D0%BB%D0%B8%20xparse%20%2Bb%20option).png)
Если я создаю окружение с помощью 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
Я не вижу, как это возможно в языке макрорасширения. Содержимое макроса не обрабатывается, поэтому вы можете получить только сообщения об ошибках или маркеры синтекса, где он используется, и это может быть далеко от определения. В этих случаях внутренний макрос, сохраняющий тело среды, используется близко к определению, поэтому данные синтекса близки к источнику, но для текса ваш пример выглядит так:
\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. Там есть документация по пакету.