Wie kann ich unvbox ausführen, wenn ich ein Makro definiere?

Wie kann ich unvbox ausführen, wenn ich ein Makro definiere?

Dies ist ein weiterer Ansatz zur Lösung des betreffenden Problems "Wie kann ich einen Textteil zwischen zwei Flaggen in eine Datei schreiben?".

Ich versuche, mir Teile des Textes zu „merken“, um sie später zu verwenden.

\newbox\@tmpbox
\def\startsync{\setbox\@tmpbox\vbox\bgroup}
\def\esync{\egroup\writepart}
\def\syncpoint{\esync\startsync}
\newcount\p@rts
\p@rts0
\long\def\writepart{
    \advance\p@rts1
    \@roman\p@rts\par
    \expandafter\xdef\csname apart\@roman\p@rts\endcsname{\unvbox\@tmpbox}
}
\def\insrt#1{\csname apart\@roman #1\endcsname}

aber TeX macht nicht, was ich will: \xdefdefiniert Makros wie \apartimit nicht erweitert \unvbox\@tmpbox, sodass ich beim Aufrufen \insrt{1}den Inhalt des letzten Textabschnitts statt des ersten sehe!

Wie kann ich dieses Makro so definieren, dass jedes \apartXXXin den entsprechenden Textabschnitt erweitert wird?

Antwort1

Ich denke, Sie möchten so etwas. Beachten Sie, dass Sie in Makros keine Boxen, aber Token speichern können.

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\seq_new:N \l_eddyem_sync_items_seq
\int_new:N \g_eddyem_sync_part_int

\cs_new_protected:Npn \startsync #1 \endsync
 {
  \seq_set_split:Nnn \l_eddyem_sync_items_seq { \syncpoint } { #1 }
  \seq_map_inline:Nn \l_eddyem_sync_items_seq
   {
    \int_gincr:N \g_eddyem_sync_part_int
    \tl_new:c { g_eddyem_sync_part \int_to_roman:n { \g_eddyem_sync_part_int} _tl }
    \tl_gset:cn { g_eddyem_sync_part \int_to_roman:n { \g_eddyem_sync_part_int} _tl } { ##1 }
    \int_to_roman:n \g_eddyem_sync_part_int\par
   }
 }

\NewDocumentCommand{\insrt}{m}
 {
  \tl_use:c { g_eddyem_sync_part \int_to_roman:n { #1 } _tl }
 }
\ExplSyntaxOff

\begin{document}

\startsync
This is the first part
\syncpoint
This is the second part
\syncpoint
This is the third part
\endsync

Some text in between

\startsync
This is the fourth part
\endsync

Some text before printing the parts

\insrt{1}

\insrt{2}

\insrt{4}

\insrt{3}

\end{document}

Bildbeschreibung hier eingeben

Wie funktioniert das? Zuerst sammeln wir alle Token zwischen \startsyncund \endsync, dann teilen wir die Elemente bei auf \syncpoint(falls es angezeigt wird, was optional ist).

Nach der Aufteilung wird jedes Element in einer Token-Listenvariable gespeichert und durch eine Integer-Variable indiziert, die bei jedem gefundenen Element erhöht wird.

Das Makro \insrtnimmt einfach sein Argument und liefert den Inhalt der entsprechenden Variable.

verwandte Informationen