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: \xdef
define macro como \aparti
unexpanded \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 \apartXXX
seja 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}
Como é que isso funciona? Primeiro coletamos todos os tokens entre \startsync
e e \endsync
depois 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 \insrt
apenas pega seu argumento e entrega o conteúdo da variável apropriada.