Re: 条件の違う表現方法について

名前: .
日時: 2005-07-05 00:23:32
IPアドレス: 220.214.19.*

>>36746 とりあえず,実装例のみ挙げます. # 用いている道具は, # (1) \@namedef/\@namedef を用いた(連想)配列 # (2) \@elt を用いた LaTeX のリスト # (3) (pLaTeX における \fenc@list などのような)リストの亜種 # といった標準的あるいは基本的なものですから,それらの取り扱いは # マクロ作成に関する(教科書的な)解説には取り上げてあるでしょう. # 処理のアルゴリズムについては,特筆すべきことはありません(単に # 必要なデータを力技で加工しているのみです). # # 以前クイックハックで作ったものを手直ししただけですから, # # 上手な方がまじめにやればもっとエレガントにできると思います. # これを超えることを無償で行ったのでは私の顧客に対して不公平と # なりますので,この件に関して私から何かお話しできるのはこれが最後です. # ただし,これは私個人の事情で,このような問題を抱えていない他の方が # 何かお力を貸してくださるということはあるかもしれません. \documentclass{jarticle} \makeatletter \let\@jtitle\@empty \let\@jsubtitle\@empty \let\@etitle\@empty \let\@esubtitle\@empty \def\jtitle#1{\gdef\@jtitle{#1}} \def\jsubtitle#1{\gdef\@jsubtitle{#1}} \def\etitle#1{\gdef\@etitle{#1}} \def\esubtitle#1{\gdef\@esubtitle{#1}} \let\@jauthorlist\@empty \let\@eauthorlist\@empty \newcount\@affilcnt \global\@affilcnt\z@ \def\authorlist#1{% #1% \@check@addresses} % \authorentry[address]{jname}{ename}{label} % \@addresslist@label: label に対応する address のリスト \def\authorentry{\@testopt\@authorentry{}} \def\@authorentry[#1]#2#3#4{% \expandafter\ifx\csname @addresslist@#4\endcsname\relax \global\advance\@affilcnt\@ne \expandafter\xdef\csname @affilno@#4\endcsname{\the\@affilcnt}% \global\@namedef{@affillabel@\the\@affilcnt}{#4}% \global\expandafter\let\csname @addresslist@#4\endcsname\@empty \edef\@currid{\the\@affilcnt}% \else \edef\@currid{\@nameuse{@affilno@#4}}% \fi \def\@tempa{#1}% \ifx\@tempa\@empty \@cons\@jauthorlist{{#2}{\@currid}{*}}% \@cons\@eauthorlist{{#3}{\@currid}{*}}% \else \@cons\@jauthorlist{{#2}{\@currid}{}}% \@cons\@eauthorlist{{#3}{\@currid}{}}% \expandafter\@cons\csname @addresslist@#4\endcsname{% {#1}{\@currid}{}}% \fi} \def\@check@addresses{% \let\@@elt\@elt \@tempswafalse \@tempcnta\z@ \def\@elt##1##2##3{\advance\count@\@ne}% \@whilenum\@tempcnta<\@affilcnt\do{% \advance\@tempcnta\@ne \count@\z@ \@nameuse{@addresslist@\@nameuse{@affillabel@\the\@tempcnta}}% \ifnum\count@>\@ne \@tempswatrue \fi}% \if@tempswa% 所属が同じ(でメールアドレスが異なる)著者が複数いる場合 \def\@elt##1##2##3{% \if##3*\relax \@cons\@templist{{##1}{##2}{}}% \else \advance\count@\@ne \@cons\@templist{{##1}{##2}{\the\count@}}% \fi}% \let\@templist\@empty \count@\z@ \@jauthorlist \let\@jauthorlist\@templist \let\@templist\@empty \count@\z@ \@eauthorlist \let\@eauthorlist\@templist \let\@elt\@reduce@addresses@elt \@tempcnta\z@ \@tempcntb\z@%%% メールアドレスに対する注釈記号の番号 \count@\z@%%% 個々のメールアドレスの通し番号 \@whilenum\@tempcnta<\@affilcnt\do{% \advance\@tempcnta\@ne \let\@templist\@empty \let\@domainlist\@empty \edef\@tempa{@addresslist@\@nameuse{@affillabel@\the\@tempcnta}}% \@nameuse\@tempa \expandafter\let\csname\@tempa\endcsname\@templist \@domainlist}% \else \def\@elt##1##2##3{\@cons\@templist{{##1}{##2}{}}}% \let\@templist\@empty \@jauthorlist \let\@jauthorlist\@templist \let\@templist\@empty \@eauthorlist \let\@eauthorlist\@templist \fi \let\@elt\@@elt} \def\@reduce@addresses@elt#1#2#3{% \advance\count@\@ne \@split@address{#1}% \expandafter\@check@domain\expandafter{\@tempc}% \ifx\@tempx\@empty%%% #1 のドメイン名が,同じ所属先に対応するメールアドレスの %%% 中で初出現のドメイン名の場合 \advance\@tempcntb\@ne \edef\@currid{\the\@tempcntb}% \edef\@tempx{% \toks@{\noexpand\@domain@elt<\@tempc>{\@tempb}{\@currid}{}}}% \@tempx \@temptokena\expandafter{\@domainlist}% \edef\@domainlist{\the\@temptokena\the\toks@}% \@cons\@templist{{#1}{}{\the\count@}}% \else \edef\@tempx{{\@tempc}{\@tempb}}% \expandafter\@addto@domainlist\@tempx \@cons\@templist{{#1}{}{}}% \fi \global\expandafter\let\csname @addressno@\the\count@\endcsname\@currid} \def\@check@domain#1{% \def\@tempx{\def\@tempx####1}% \@tempx<#1>##2\@nil{\def\@tempx{##2}}% \expandafter\@tempx\@domainlist<#1>\@nil} \def\@addto@domainlist#1#2{% \def\@tempx{\def\@tempx####1}% \@tempx\@domain@elt<#1>##2##3##4##5\@nil{% \def\@currid{##3}% \def\@domainlist{% ##1% \@domain@elt<#1>{##2,#2}{##3}{*}% ##5}}% \expandafter\@tempx\@domainlist\@nil} \def\@domain@elt<#1>#2#3#4{% #1: ドメイン名, #2: ユーザ名, #3: #1 の識別番号, %%% #4: * または空文字列(空文字列になるのは,#2 がただ 1 名のとき) \global\@namedef{@domain@#3}{#1}% \if *#4\relax \global\@namedef{@names@#3}{\{#2\}}% \else \global\@namedef{@names@#3}{#2}% \fi} \let\@affillist\@empty % \affiliate[label]{affiliation} \def\affiliate{\@testopt\@affiliate{}} \def\@affiliate[#1]#2{% \expandafter\ifx\csname @addresslist@#1\endcsname\relax \@latex@warning@no@line{No \string\authorentry\space for ``#1''}% \else \protected@edef\@tempa{#2}% \expandafter\protected@xdef\csname @affiltext@#1\endcsname{% \expandafter\@affiliate@cutoff\@tempa\hskip\@nil% 単に #2 でよい? }% \fi} \def\@affiliate@cutoff#1\hskip#2\@nil{#1} \def\maketitle{% \par \begingroup \if@twocolumn \ifnum \col@number=\@ne \@maketitle \else \twocolumn[\@maketitle]% \fi \else \newpage \global\@topnum\z@ \@maketitle \fi \thispagestyle{plain}% \@thanks \endgroup \setcounter{footnote}{0}% \global\let\maketitle\relax} \def\@maketitle{% \begingroup\centering \normalsize \ifx\@jtitle\@empty\else {\Large\bfseries \@jtitle\par}% \fi \ifx\@jsubtitle\@empty\else \vskip3mm {\bfseries \@jsubtitle\par}% \fi \ifx\@jauthorlist\@empty\else \vskip1.5mm \let\@elt\@put@author@elt \@jauthorlist \unskip\par \fi \ifnum\@affilcnt>\z@ \vskip1.5mm \@tempcnta\z@ \@whilenum\@tempcnta<\@affilcnt\do{% \advance\@tempcnta\@ne \@make@affilmark\@tempcnta\kern\z@ \@nameuse{@affiltext@\@nameuse{@affillabel@\the\@tempcnta}}% \hskip1zw}% \unskip\par \vskip1.5mm \let\@elt\@put@address@elt \@tempcnta\z@ \@whilenum\@tempcnta<\@affilcnt\do{% \advance\@tempcnta\@ne \let\@tempa\@empty \@nameuse{@addresslist@\@nameuse{@affillabel@\the\@tempcnta}}}% \unskip\par \fi % \ifx\@etitle\@empty\else % \vskip3mm % {\large\bfseries \@etitle\par}% % \fi % \ifx\@esubtitle\@empty\else % \vskip3mm % {\small\bfseries \@esubtitle\par}% % \fi % \ifx\@eauthorlist\@empty\else % \vskip1.5mm % \let\@elt\@put@author@elt % \@eauthorlist\par % \fi \par\endgroup} \def\@put@author@elt#1#2#3{% #1: name, #2: affil-id, #3: address-id or empty #1\kern\z@ \@make@affilmark{#2}% \if\relax#3\relax\else \,% \edef\@tempa{\noexpand\@make@emailmark{\@nameuse{@addressno@#3}}}% \@tempa \fi \hskip1zw\relax} \def\@make@affilmark#1{% \textsuperscript{% \ifcase#1\relax \or \textdagger \or \textdagger\textdagger \or \textdagger\textdagger\textdagger \or \textdagger\textdagger\textdagger\textdagger \or \textdagger\textdagger\textdagger\textdagger\textdagger \or \textdagger\textdagger\textdagger \textdagger\textdagger\textdagger \or \textdagger\textdagger\textdagger\textdagger \textdagger\textdagger\textdagger \or \textdagger\textdagger\textdagger\textdagger \textdagger\textdagger\textdagger\textdagger \or \textdagger\textdagger\textdagger\textdagger\textdagger \textdagger\textdagger\textdagger\textdagger \or \textasteriskcentered \or \textasteriskcentered\textasteriskcentered \or \textasteriskcentered\textasteriskcentered\textasteriskcentered \or \textasteriskcentered\textasteriskcentered \textasteriskcentered\textasteriskcentered \or \textasteriskcentered\textasteriskcentered\textasteriskcentered \textasteriskcentered\textasteriskcentered \or \textasteriskcentered\textasteriskcentered\textasteriskcentered \textasteriskcentered\textasteriskcentered\textasteriskcentered \or \textasteriskcentered\textasteriskcentered\textasteriskcentered \textasteriskcentered\textasteriskcentered\textasteriskcentered \textasteriskcentered \or \textasteriskcentered\textasteriskcentered\textasteriskcentered \textasteriskcentered\textasteriskcentered\textasteriskcentered \textasteriskcentered\textasteriskcentered \or \textasteriskcentered\textasteriskcentered\textasteriskcentered \textasteriskcentered\textasteriskcentered\textasteriskcentered \textasteriskcentered\textasteriskcentered\textasteriskcentered \fi}} \def\@make@emailmark#1{% \if\relax#1\relax\else \textsuperscript{\@alph{#1})}% \fi} \def\@put@address@elt#1#2#3{% #1: メールアドレス, %%% #2: affil-id または空文字列(空文字列になるのは所属とメールアドレスが 1 対 1 に対応しない場合) %%% #3: address-id または空文字列(#2 と #3 がともに空文字列になるのは, %%% 所属が同じでメールアドレスのドメイン部分も同じエントリの 2 個目以降の場合 %%% (この場合は先に現れるエントリとまとめて記述するので,省略)) \advance\count@\@ne \if\relax#2\relax \if\relax#3\relax\else \edef\@tempa{\@nameuse{@addressno@#3}}% \@make@emailmark{\@tempa}% \@nameuse{@names@\@tempa}@% \@nameuse{@domain@\@tempa}% \hskip1zw\relax \fi \else \@make@affilmark{#2}#1\hskip1zw\relax \fi} \edef\@split@address#1{% \noexpand\@split@address@#1\string @\string @\relax} \begingroup \makeatother \def\:{\expandafter\def \csname @split@address@\endcsname##1@##2@##3\relax}% \expandafter\endgroup\:{% \def\@tempb{#1}%%% user name \def\@tempc{#2}}%%% domain name \makeatother \jtitle{テンプレート (タイトル)} \jsubtitle{− (サブタイトル)−} \etitle{pLaTeX Template (Title)} \esubtitle{−(Subtitle)−} \authorlist{% \authorentry[TARO@abc.co.jp]{日本 太郎}{Taro nihon}{Tokyo}% \authorentry[jiro@def.co.jp]{日本 次郎}{jiro nihon}{Osaka}% \authorentry[ichiro@hij.co.jp]{日本 一郎}{ichiro nihon}{test}% \authorentry[youko@hij2.co.jp]{日本一 陽子}{Youko Nippon'ichi}{test}% \authorentry[hanako@hij.co.jp]{日本 花子}{hanako nihon}{test}% } \affiliate[Tokyo]{工学部\hskip1zw 〒999--9999 東京都世田谷区x--x--x} \affiliate[Osaka]{開発部\hskip1zw 〒888--8888 大阪府吹田市x--x--x} \affiliate[test]{営業部\hskip1zw 〒777--7777 xxx県xx市x--xx--xx} \begin{document} \maketitle% \maketitle を用いてタイトル部分を出力するものと仮定しました. \end{document}

この書き込みへの返事:

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