이는 문제의 문제를 해결하기 위한 또 다른 접근 방식입니다."두 플래그 사이의 텍스트 일부를 파일에 쓰려면 어떻게 해야 합니까?".
나는 나중에 사용하기 위해 텍스트의 일부를 "기억"하려고 노력합니다. 그래서 나는 그렇습니다
\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
인수를 취하고 적절한 변수의 내용을 전달합니다.