Peut-on construire un appel de macro dans une macro ?

Par exemple une macro (macroUn) avec deux arguments, le premier pour le nom d'une autre macro (macroDeux) et le second pour l'argument de cette seconde macro.

\newcommand\macroUn[2]{\#1{#2}} % (Ca ne fonctionne pas)

Est-il possible de faire en sorte que l'appel à macro 1

Ouvrir dans l'éditeur Overleaf
\macroUn{macroDeux}{argument macroDeux}

se traduise par un appel à macro 2 avec son argument : \macroDeux{argument macroDeux}

Ouvrir dans l'éditeur Overleaf
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\newcommand\macroDeux[1]{#1}
\newcommand\macroUn[2]{\textbackslash#1\{#2\}}
\begin{document}
Testing \verb|\macroUN{macroDeux}{789}|: \macroUn{macroDeux}{789} % Ne fonctionne pas, c'est du texte non interprété

Ca ne fonctionne pas, \verb|\macroDeux{789}| est du texte non interprété.

\end{document}

alt text

Posée 05 Nov '17, 15:01

idefix's gravatar image

idefix
95594051
Taux d'acceptation : 14%

Modifiée 05 Nov '17, 16:10

1

Il y a-t-il une raison à ne pas appeler macroDeux avec la contre oblique? (\macroUn{\macroDeux}{argument macroDeux})

(05 Nov '17, 15:25) Nikopol Nikopol's gravatar image

Non aucune raison. Du coup cela va fonctionner merci

(05 Nov '17, 16:20) idefix idefix's gravatar image

Il y a deux façons pour réaliser ça :

  • \newcommand{\macroUn}[2]{#1{#2}} et (c'est #1 et non pas \#1). Dans ce cas il faut utiliser la commande avec la syntaxe \macroUn{\macroDeux}{foo}.

ECM

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\newcommand{\macroDeux}[1]{**#1**}
\newcommand{\macroUn}[2]{#1{#2}}

\begin{document}
\macroUn{\macroDeux}{foo}

\macroUn{\emph}{foo}
\end{document}
  • \newcommand{\macroUn}[2]{\csname #1\endcsname{#2}}. Dans ce cas la commande à utiliser avec la syntaxe \macroUn{macroDeux}{foo}.

ECM

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\newcommand{\macroDeux}[1]{**#1**}
\newcommand{\macroUn}[2]{\csname #1\endcsname{#2}}

\begin{document}
\macroUn{macroDeux}{foo}

\macroUn{emph}{foo}
\end{document}
Lien permanent

Publiée 05 Nov '17, 16:22

touhami's gravatar image

touhami
9.7k410
Taux d'acceptation : 51%

Modifiée 05 Nov '17, 21:52

A quoi sert \CMD et \cmd ? Tel quel (avec CMD et cmd) la compilation ne fonctionne pas. Merci pour les deux solutions possibles. Exactement ce que je voulais. Et ça fonctionne très bien.

(05 Nov '17, 16:48) idefix idefix's gravatar image

Désolé c'est ma faute, j'ai oublié de substituer, chez moi \cmd=\macroDeux et \CMD=\macroUn.

(05 Nov '17, 21:50) touhami touhami's gravatar image

Résumé des possibilités (j'ai tenté une dernière, mais qui ne fonctionne pas)

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
%% macro appelée
\newcommand{\macroDeux}[1]{**#1**}

%% Pour appel AVEC DEUX arguements et AVEC backslach
\newcommand{\macroUn}[2]{#1{#2}}
%% Pour appel AVEC DEUX arguements et SANS backslach
\newcommand{\macroUnBis}[2]{\csname #1\endcsname{#2}}
%% Pour appel avec UN SEUL argument et AVEC backslash
\newcommand{\macroUnTer}[1]{#1}
%% Pour appel avec UN SEUL argument et SANS backslash (ne fonctionne pas)
\newcommand{\macroUnFour}[1]{\csname #1\endcsname}

\begin{document}

% Appel DEUX arguments et AVEC backslach
Testing appel de \verb|\macroUn{\macroDeux}{foo}| : \macroUn{\macroDeux}{foo}

% Appel DEUX arguments et SANS backslash
Testing appel de \verb|\macroUnBis{macroDeux}{foo}| : \macroUnBis{macroDeux}{foo}

% Autre solution avec UN SEUL argument et appel AVEC backslash
Testing appel de \verb|\macroUnTer{\macroDeux{foo}}| : \macroUnTer{\macroDeux{foo}}

% Autre solution avec UN SEUL argument et appel SANS backslash (ne fonctionne pas)
Testing appel de \verb|\macroUnFour{macroDeux{foo}}| : \macroUnFour{macroDeux{foo}}

Cette derni\`ere que j'ai essay\'e d'adapter ne fonctionne pas
%\CMD{\cmd}{foo}
%\CMD{\emph}{foo}
\end{document}

On obtient :

alt text

Lien permanent

Publiée 05 Nov '17, 17:52

idefix's gravatar image

idefix
95594051
Taux d'acceptation : 14%

Modifiée 05 Nov '17, 18:15

Vous pouvez aussi définir la commande avec \newcommand{\macroUn}[1]{\csname #1\endcsname} et l'utiliser avec deux arguments \macroUn{emph}{foo}

(05 Nov '17, 21:57) touhami touhami's gravatar image
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.