2010-03-08 5 views
14

Je suis en train de construire une commande qui est similaire à LaTeX \cite{}, qui accepte une liste de paramètres séparés par des virgules comme ceparamètres séparés par des virgules Split en LATEX

\cite{Wall91, Schwartz93}

Je voudrais passer chaque item dans la liste séparée par des virgules que le paramètre représente à une autre commande et renvoie la concaténation des résultats individuels. J'imagine que ce soit quelque chose comme ceci:

\newcommand{\mycite}[1]{% 
    \@for\var:=\split{#1} do{% 
    \processCitation{\var}% 
    }% 
} 

Littérature sur la manipulation chaîne, variables et boucle dans LATEX serait génial!

En outre: existe-t-il un moyen de joindre les résultats individuels en utilisant à nouveau des virgules?

Merci!

Répondre

17

En utilisant le lien de Roberto Je suis arrivé à cette solution:

\makeatletter 

% Functional foreach construct 
% #1 - Function to call on each comma-separated item in #3 
% #2 - Parameter to pass to function in #1 as first parameter 
% #3 - Comma-separated list of items to pass as second parameter to function #1 
\def\foreach#1#2#3{% 
    \@[email protected]{#1}{#2}#3,\@[email protected]% 
} 

% Internal helper function - Eats one input 
\def\@swallow#1{} 

% Internal helper function - Checks the next character after #1 and #2 and 
% continues loop iteration if \@[email protected] is not found 
\def\@[email protected]#1#2{% 
    \@ifnextchar\@[email protected]% 
    {\@swallow}% 
    {\@foreach{#1}{#2}}% 
} 

% Internal helper function - Calls #1{#2}{#3} and recurses 
% The magic of splitting the third parameter occurs in the pattern matching of the \def 
\def\@foreach#1#2#3,#4\@[email protected]{% 
    #1{#2}{#3}% 
    \@[email protected]{#1}{#2}#4\@[email protected]% 
} 

\makeatother 

Exemple d'utilisation:

% Example-function used in foreach, which takes two params and builds hrefs 
\def\makehref#1#2{\href{#1/#2}{#2}} 

% Using foreach by passing #1=function, #2=constant parameter, #3=comma-separated list 
\foreach{\makehref}{http://stackoverflow.com}{2409851,2408268} 

% Will in effect do 
\href{http://stackoverflow.com/2409851}{2409851}\href{http://stackoverflow.com/2408268}{2408268} 
+0

Et comment l'utilise-t-on? Pouvez-vous donner un exemple? – AVB

+0

Merci pour l'exemple! +1 pour la question et répondre aux deux. Cela vous dérange jeter un coup d'oeil ici: http://stackoverflow.com/questions/2389081/ Peut-être que vous aurez une idée. – AVB

+0

Pas de problème. Merci pour le vote. Jetez un oeil à la solution que j'ai donné dans votre message! –

-3

Vous pouvez utiliser le package cite comme

\usepackage{cite} 
... 
\cite{citation1, citation2, citation3} 

Cocher cette link.

+3

Désolé, mais la question est de savoir comment construire une commande telle que vous citer. –

Questions connexes