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: \xdef
define la macro como \aparti
con 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 \apartXXX
se 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}
¿Cómo funciona esto? Primero recopilamos todos los tokens entre \startsync
y \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 \insrt
simplemente toma su argumento y entrega el contenido de la variable apropiada.