名前: しっぽ愛好家 日時: 2004-07-13 15:36:55 IPアドレス: 211.4.121.*
>>30302 なるほど, >\begin{CardList} >\begin{Card} > \section{表見出し}{裏見出し} > \Word{表1-1}{裏1-1} > \Word{表1-2}{裏1-2} >\end{Card} >\begin{Card} > \section{表}{裏} > \Word{表2-1}{裏2-1} > \Word{表2-2}{裏2-2} >\end{Card} >\end{CardList} という(各カードに複数項目を記述している(?))状況だったわけですね. この場合,概ね >\section の番号とその内容,\Word のそれぞれの内容を >順に \@card@??H などに代入すれば良い の通りです. そのような処理には,“マクロの置換テキストに別のテキストを 追加するマクロ”を用いればよいのですが,それは下記の例の中の \@addto@macro のように \expandafter を用いて(あるいは \toks レジスタを使って)実現できます. %%% LaTeX のマクロ \g@addto@macro の定義も調べてみるとよいでしょう. 細かい書き換えが多少ありますので,いくぶん長くなりますがサンプルコードを 再び省略せずに挙げます. \documentclass[tombow]{jarticle} \newdimen\CardHeight \CardHeight 55mm %%% カードの高さ \newdimen\CardWidth \CardWidth 91mm %%% カードの幅 \newdimen\CardPadding \CardPadding 2mm %%% 上下左右の余白 \newdimen\CardSideMargin \CardSideMargin 0mm %%% 各カードの綴じしろ %%% とりあえず,表面の左端に設定 \paperwidth 2\CardWidth %%% 2 列分 \paperheight 5\CardHeight %%% 5 段分 \textwidth\paperwidth \textheight\paperheight \oddsidemargin-1in \evensidemargin-1in \topmargin-1in \headheight 0pt \headsep 0pt \footskip0pt \topskip 0pt \hoffset-.5in \voffset-.5in \pagestyle{empty} \makeatletter \newcount\@card@no \def\CardList{% \let\section\@section@in@CardList \def\thesection{\Alph{section}}% \@init@card@data} \def\endCardList{\@output@card@data} % %%% 各カードに記述する内容の初期化 %%% CardList 環境内の n 番目の \Card マクロに対応する %%% カードの表面に記載するテキストは \@card@NH %%% (ただし,N は“(n - 1 を 10 で割ったときの剰余) + 1”) %%% に保存し,裏面に記載するテキストは \@card@NT に保存. \def\@init@card@data{% \count@\z@ \@whilenum10>\count@\do{% \advance\count@\@ne \@namedef{@card@\the\count@ H}{}% \@namedef{@card@\the\count@ T}{}}% \@card@no\z@} % %%% 個々のカードに記載するテキストを収集・登録する環境 %%% (出力処理は,1 ページ分が集まるか,CardList 環境の終端に到達した際に行う) \def\Card{% \let\@curr@text@on@head\@empty%%% 表面のテキストを収めるマクロの初期化 \let\@curr@text@on@tail\@empty}%%% 裏面のテキストを収めるマクロの初期化 \def\endCard{% \global\advance\@card@no\@ne %%% 表面・裏面のテキストを Card 環境外に運び出せるように \global 指定が必要 \global\expandafter\let \csname @card@\the\@card@no H\endcsname\@curr@text@on@head \global\expandafter\let \csname @card@\the\@card@no T\endcsname\@curr@text@on@tail \ifnum10>\@card@no\else \@output@card@data \@init@card@data \fi} % %%% 各カードに記載する個々の“語”を登録するマクロ \long\def\Word#1#2{%%% #1: 表面に記載するテキスト, #2: 裏面に記載するテキスト \@addto@macro\@curr@text@on@head{\par#1}% \@addto@macro\@curr@text@on@tail{\par#2}} \long\def\@addto@macro#1#2{%%% #1: 引数をもたないマクロ, #2: テキスト \expandafter\def\expandafter#1\expandafter{#1#2}} % %%% Card(List) 環境内の \section \def\@section@in@CardList#1#2{% \Word{\@makesectionhead{#1}}{\@makesectionhead{#2}}} \def\@makesectionhead#1{% \refstepcounter{section}% \centerline{\thesection.~{\bfseries #1}}} % %%% 個々のカードの記述内容を出力する処理(配置順に注意) \newdimen\@cards@seprule%%% “切り取り線”の太さ \def\@output@card@data{% \@cards@seprule.4\p@ \begingroup \def\@elt##1{\noexpand\setcounter{##1}{\number\the\csname c@##1\endcsname}}% \xdef\@restore@counters{\cl@@ckpt}% \endgroup \vbox to\textheight{% \hbox{\@one@side@of@one@card{1H}\@cards@hsep\@one@side@of@one@card{2H}}% \@cards@vsep \hbox{\@one@side@of@one@card{3H}\@cards@hsep\@one@side@of@one@card{4H}}% \@cards@vsep \hbox{\@one@side@of@one@card{5H}\@cards@hsep\@one@side@of@one@card{6H}}% \@cards@vsep \hbox{\@one@side@of@one@card{7H}\@cards@hsep\@one@side@of@one@card{8H}}% \@cards@vsep \hbox{\@one@side@of@one@card{9H}\@cards@hsep\@one@side@of@one@card{10H}}% \vss}% \@restore@counters \newpage \@cards@seprule\z@ %%% 裏面には切り取り線は出力しない \vbox to\textheight{% \hbox{\@one@side@of@one@card{2T}\@cards@hsep\@one@side@of@one@card{1T}}% \@cards@vsep \hbox{\@one@side@of@one@card{4T}\@cards@hsep\@one@side@of@one@card{3T}}% \@cards@vsep \hbox{\@one@side@of@one@card{6T}\@cards@hsep\@one@side@of@one@card{5T}}% \@cards@vsep \hbox{\@one@side@of@one@card{8T}\@cards@hsep\@one@side@of@one@card{7T}}% \@cards@vsep \hbox{\@one@side@of@one@card{10T}\@cards@hsep\@one@side@of@one@card{9T}}% \vss}% \newpage} \def\@one@side@of@one@card#1{% \hbox to \CardWidth{% \@tempdima\CardPadding \advance\@tempdima\CardSideMargin \dimen@\CardWidth \advance\dimen@-\@tempdima \advance\dimen@-\CardPadding \ifodd\c@page \hskip\@tempdima \else \hss \fi \vbox to\CardHeight{% \vskip\CardPadding \vtop{\hsize\dimen@ \@parboxrestore \@nameuse{@card@#1}}% \vss}% \ifodd\c@page \hss \else \hskip\@tempdima \fi}} \def\@cards@hsep{% \ifdim\@cards@seprule>\z@ \kern-.5\@cards@seprule \vrule \@width \@cards@seprule \kern-.5\@cards@seprule \fi} \def\@cards@vsep{% \ifdim\@cards@seprule>\z@ \kern-.5\@cards@seprule \hrule \@height \@cards@seprule \kern-.5\@cards@seprule \else \nointerlineskip \fi} \makeatother \begin{document} \begin{CardList} \begin{Card} \section{1枚目表}{1枚目裏} \Word{表1-1}{裏1-1} \Word{表1-2}{裏1-2} \end{Card} \begin{Card} \section{2枚目表}{2枚目裏} \Word{表2-1}{裏2-1} \Word{表2-2}{裏2-2} \end{Card} \begin{Card} \section{3枚目表}{3枚目裏} \Word{表3-1}{裏3-1} \Word{表3-2}{裏3-2} \end{Card} \begin{Card} \section{4枚目表}{4枚目裏} \Word{表4-1}{裏4-1} \Word{表4-2}{裏4-2} \end{Card} \end{CardList} \end{document}
この書き込みへの返事: