![Synctex: Sorgen Sie dafür, dass es mit der Umgebung funktioniert, die auf den Inhalt zugreift (z. B. environ oder xparse +b-Option)](https://rvso.com/image/449631/Synctex%3A%20Sorgen%20Sie%20daf%C3%BCr%2C%20dass%20es%20mit%20der%20Umgebung%20funktioniert%2C%20die%20auf%20den%20Inhalt%20zugreift%20(z.%20B.%20environ%20oder%20xparse%20%2Bb-Option).png)
Wenn ich eine Umgebung mit environ
und \BODY
oder xparse
und erstelle +b
, funktioniert die Synctex-Funktionalität nicht mehr: Anstatt zur entsprechenden Zeile zu springen, springt es ans Ende der Umgebung. Ich vermute, dass die Tatsache, dass \BODY
in ein Makro eingefügt wird, LaTeX stört, aber ich bin neugierig, ob ich das irgendwie lösen kann (eventuell in Lualatex).
MWE
\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}
BEARBEITEN
Die von user202729 vorgeschlagene Lösung funktioniert gut für das obige MWE (und sie beantwortet definitiv einen Teil meiner Frage und wird sich sicherlich als nützlich erweisen, wenn ich keine allgemeinere Antwort finden kann). Hier ist jedoch ein weiteres MWE, das ich lösen möchte, bei dem die von user202729 vorgeschlagene Lösung nicht mehr funktioniert:
Ich dupliziere einen Text zwischen zwei Abschnitten (indem ich den Inhalt zuerst in eine Datei schreibe, bevor ich diese Datei eingebe). Leider unterbricht dies Synctex: nicht nur für den kopierten Text (er geht in die Dummy-Datei statt in die Hauptdatei), sondern auch für den ursprünglichen Text (er geht an das Ende der Umgebung).
Wäre es möglich, Synctex zumindest für den Text im ersten Abschnitt zum Laufen zu bringen? Und wenn Sie es auch für den Text im zweiten Abschnitt zum Laufen bringen könnten … wäre das großartig.
MWE:
\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}
Antwort1
Ich sehe nicht, wie das in einer Makroerweiterungssprache möglich wäre. Der Inhalt eines Makros wird nicht verarbeitet, sodass Sie nur Fehlermeldungen oder Synctex-Markierungen erhalten, wo es verwendet wird, und das kann weit weg von der Definition sein. In diesen Fällen wird das interne Makro, das den Umgebungskörper speichert, zufällig nahe der Definition verwendet, sodass die Synctex-Daten nahe an der Quelle sind, aber für Tex ist Ihr Beispiel wie
\def\abc{
some text
XXX
that gets saved here
}
multiple pages of arbitrary document source
\abc
und Sie verlangen, dass Synctex XXX mit Zeile 4 in der Mitte der Definition verknüpft, \abc
nicht mit einer Zeile „mehrere Seiten später“, wo \abc
verwendet wird.
Antwort2
Okay, die Lösung.
Bei der Kompilierung mit Lualatex bleibt Synctex in beiden Abschnitten erhalten, andernfalls nur im ersten Abschnitt.
%! 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}
Der Inhalt wird nicht wirklich in eine Datei geschrieben, sondern in einem speziellen Format gespeichert, \savedcontent
das der Benutzer nicht berühren darf. Wenn der Benutzer den Inhalt manuell bearbeiten möchte, verwenden Sie die programmgesteuerte API des rescansync
Pakets.
Notiz
Pakete, die nicht auf CTAN sindPaket ist jetzt auf CTAN:https://ctan.org/pkg/rescansync. Dort gibt es Paketdokumentation.