Как сделать unvbox при определении макроса?

Как сделать unvbox при определении макроса?

Это еще один подход к решению рассматриваемой проблемы.Как записать в файл часть текста между двумя флагами?".

Я пытаюсь «запоминать» части текста, чтобы использовать их позже. Так что я делаю

\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просто берет свой аргумент и выдает содержимое соответствующей переменной.

Связанный контент