マクロを定義するときに unvbox を実行するにはどうすればよいでしょうか?

マクロを定義するときに unvbox を実行するにはどうすればよいでしょうか?

これは、問題の問題を解決するための別のアプローチです。2 つのフラグ間のテキストの一部をファイルに書き込むにはどうすればよいでしょうか?「」。

私はテキストの一部を「覚えておいて」後で使えるようにしています。

\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\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引数を受け取り、適切な変数の内容を返すだけです。

関連情報