Re: 単語カードの作成

名前: しっぽ愛好家
日時: 2004-07-14 22:16:27
IPアドレス: 211.4.121.*

>>30307 とりあえず,以下の変更を行うとそれなりに処理されるようですが,どうでしょうか. まず,次の記述を追加してください. \newtoks\@card@unprocessed@Tail %%% ↑奇数枚目の裏面の記述を一時的に保存するための \toks レジスタ 次に, \def\@frame@in@card#1{% に \long をつけて \long\def\@frame@in@card#1{% としてください(\@frame@in@card の引数には \par も入ります). さらに,\@init@card@data,\endCard,\@output@card@data などの定義を 次のものに置き換えてください. \def\@init@card@data{% \global\@card@Head{}% \global\@card@Tail{}% %%% ↑\toks レジスタへの代入なので,\gdef ではなく単に \global を使用 \global\@card@unprocessed@Tail{}% \global\@card@no\z@} \def\endCard{% \global\advance\@card@no\@ne \toks@\expandafter{\@curr@card@head}% \edef\@tempa{% \the\@card@Head \noexpand\amp \noexpand\@frame@in@card{\the\toks@}% \ifodd\@card@no\else \noexpand\ampamp \fi}% \global\@card@Head\expandafter{\@tempa}% %%% ↓裏面は“左右を逆にして”並べなければならないので, %%% 奇数枚目の裏面のデータはその次のカードの裏面のデータが %%% 与えられるまで“待機”させなければなりません. \toks@\expandafter{\@curr@card@tail}% \ifodd\@card@no \global\@card@unprocessed@Tail\expandafter{\the\toks@}% \else \edef\@tempa{% \the\@card@Tail \noexpand\amp \noexpand\@frame@in@card{\the\toks@}% \noexpand\amp \noexpand\@frame@in@card{\the\@card@unprocessed@Tail}% \noexpand\ampamp}% \global\@card@Tail\expandafter{\@tempa}% \fi \ifnum10>\@card@no\else \@output@card@data \@init@card@data \fi } \def\@output@card@data{% \ifodd\@card@no %%% この場合,最後のカードの裏面のデータが \@card@Tail に移されていない %%% (そのデータの左側に入る予定のデータ待ちになっている)ので, %%% そのデータ(\@card@unprocessed@Tail の値)を \@card@Tail に移します \edef\@tempa{% \the\@card@Tail \noexpand\amp\noexpand\amp \noexpand\@frame@in@card{\the\@card@unprocessed@Tail}% \noexpand\ampamp}% \global\@card@Tail\expandafter{\@tempa}% \global\@card@Head\expandafter{\the\@card@Head\amp\ampamp}% \fi \begingroup \def\@elt##1{\noexpand\setcounter{##1}{\number\the\csname c@##1\endcsname}}% \xdef\@restore@counters{\cl@@ckpt}% \endgroup \@BeginCardList\the\@card@Head\@EndCardList \@restore@counters \newpage \@BeginCardList\the\@card@Tail\@EndCardList \newpage } \def\@EndCardList{% \crcr %%% ←こうすると,表におけるひとつの行を終了させる %%% 必要がない場合には無視されます. \multicolumn{1}{r|}{あ}\amp \multicolumn{1}{c|}{}\amp\amp \multicolumn{1}{|l}{あ}% \end{tabular}} %%% 処理順=出力順とは限らないので,(番号部分をあらかじめ確定させるように) %%% 細工します. \def\@section@in@CardList#1#2{% \stepcounter{section}% \protected@edef\@tempa{% \noexpand\Word {\noexpand\@makesectionhead{\thesection}{#1}}% {\noexpand\@makesectionhead{\thesection}{#2}}} \@tempa} \def\@makesectionhead#1#2{\centerline{#1.~{\bfseries #2}}} [補足] 最も重要な点は,\endCard での \@card@Head,\@card@Tail の値を構成する処理です. 上記のコードそのものを考える前に, \toks0{<some text>} \def\somemacro{<other text>} \toks2\expandafter{\the\tok0 \somemacro} %%% ↑ \toks2{<some text>\somemacro} と同じ.このあと,\toks2 の値を %%% 使用するまでに \somemacro が再定義されてしまうと,\somemacro は %%% 変更後の定義で処理されます. \toks4\expandafter{\somemacro} \edef\temp{\the\toks0 \the\toks4} \toks4\expandafter{\temp}%%% \toks4{<some text><other text>} と同じ %%% ↑この場合は,“\somemacro を(1 段階だけ)展開したもの”を追加しています. という記述(問題になっている点を単純化したものです)について 考えてみるとよいでしょう. %%% なお,\amp と \ampamp の入れ方については落ち着いて考えてみてください.

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)