Como posso fazer o unvbox ao definir a macro?

Como posso fazer o unvbox ao definir a macro?

Esta é outra abordagem para resolver o problema em questão "Como posso escrever no arquivo parte do texto entre duas bandeiras?".

Tento "lembrar" partes do texto para usá-las mais tarde. Então eu faço

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

mas o TeX não faz o que eu quero: \xdefdefine macro como \apartiunexpanded \unvbox\@tmpbox, então, quando eu chamo \insrt{1}, vejo o conteúdo da última parte do texto em vez do primeiro!

Como posso definir esta macro para que cada uma \apartXXXseja expandida na parte de texto correspondente?

Responder1

Eu acho que você quer algo assim; observe que você não pode armazenar caixas em macros, mas pode armazenar 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}

insira a descrição da imagem aqui

Como é que isso funciona? Primeiro coletamos todos os tokens entre \startsynce e \endsyncdepois dividimos os itens em \syncpoint(se aparecer, o que é opcional).

Após a divisão, cada item é salvo em uma variável de lista de tokens, indexada por uma variável inteira que é incrementada a cada item encontrado.

A macro \insrtapenas pega seu argumento e entrega o conteúdo da variável apropriada.

informação relacionada