這是解決該問題的另一種方法”如何寫入兩個標誌之間的文件部分文字?」。
我嘗試“記住”部分文字以便以後使用它們。所以,我願意
\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 沒有做我想要的事情:像unexpanded\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
僅接受其參數並傳遞適當變數的內容。