Это еще один подход к решению рассматриваемой проблемы.Как записать в файл часть текста между двумя флагами?".
Я пытаюсь «запоминать» части текста, чтобы использовать их позже. Так что я делаю
\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}
но TeX не делает то, что мне нужно: \xdef
определяет макрос как \aparti
с unexpanded \unvbox\@tmpbox
, поэтому, когда я вызываю \insrt{1}
, я вижу содержимое последней части текста вместо первой!
Как мне определить этот макрос так, чтобы каждый из них \apartXXX
был расширен до соответствующей части текста?
решение1
Думаю, вам нужно что-то вроде этого; обратите внимание, что в макросах нельзя хранить ящики, но можно хранить токены.
\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}
Как это работает? Сначала мы собираем все токены между \startsync
и \endsync
, затем разделяем элементы по \syncpoint
(если он есть, что необязательно).
После разделения каждый элемент сохраняется в переменной списка токенов, индексированной целочисленной переменной, которая увеличивается с каждым найденным элементом.
Макрос \insrt
просто берет свой аргумент и выдает содержимое соответствующей переменной.