¿Cómo puedo hacer unvbox cuando defino una macro?

¿Cómo puedo hacer unvbox cuando defino una macro?

Este es otro enfoque para resolver el problema en cuestión "¿Cómo puedo escribir para archivar parte del texto entre dos banderas?".

Intento "recordar" partes del texto para utilizarlas más tarde. Así que hago

\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}

pero TeX no hace lo que quiero: \xdefdefine la macro como \aparticon unexpanded \unvbox\@tmpbox, por lo que, cuando llamo \insrt{1}, veo el contenido de la última parte del texto en lugar de la primera.

¿Cómo puedo definir esta macro para que cada una \apartXXXse expanda en la porción de texto correspondiente?

Respuesta1

Creo que quieres algo como esto; tenga en cuenta que no puede almacenar cajas en macros, pero puede almacenar tokens.

\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}

ingrese la descripción de la imagen aquí

¿Cómo funciona esto? Primero recopilamos todos los tokens entre \startsyncy \endsync, luego dividimos los elementos en \syncpoint(si aparece, lo cual es opcional).

Después de la división, cada elemento se guarda en una variable de lista de tokens, indexada por una variable entera que se incrementa en cada elemento encontrado.

La macro \insrtsimplemente toma su argumento y entrega el contenido de la variable apropiada.

información relacionada