I realize that the title might be not understandable. I want to have a command \printit{} which takes 1 arguments and display it after some test. Inside \printit I would like to test if #1 is just a piece of text, or if it is itself a macro. For simplicity, I could assume the following cases :

#1 is just some text, like hallo

#1 has the form \mycomA{content}

#1 has the form \mycomB{content}

where \mycomA{} and \mycomB{} are commands defined by myself. Depending on the case, I want \printit{} to typeset hallo, or content with some formatting depending on the case.
For simplicity I could also assume that the arguments of \mycomA and \mycomB are simple text.

How should I proceed ? Here is the empty MWE :)

\documentclass{article}
\newcommand{\mycomA}[1]{\textbf{#1}}% just for the example
\newcommand{\mycomB}[1]{\textit{#1}}% just for the example
\newcommand{\printit}[1]{%
% If #1 has the form mycomA(...) THEN
case A : content = % extract the content of mycomA
% ElseIf #1 has the form mycomB(...) THEN
case B : content = % extract the content of mycomB
% Else THEN
case C : content = #1
\begin{document}
\printit{hallo}
\printit{\mycomA{123}}
\printit{\mycomB{qweqwe}}
\printit{hallo}
\end{document}

It is not clear to me why not to write \newcommand{\printit}[1]{#1}. The special formatting is in the definition of \mycomA and \mycomB, respectively, isn't it? Please elaborate what exactly you wish to achieve.
–
Stephan LehmkeMar 28 '12 at 13:42

no, the formatting is not in the definition of mycomA. For example, say, if the argument of \printit is \mycomA, then print it in red.
–
nicolas royMar 28 '12 at 14:02

This works because after the group the commands will regain their former definition and \@firstofone simply strips off the braces from the argument.

If there's less control on the macros that can appear a more complicated approach must be taken.

Edit

Let me do some guesswork. You want to have \printit treat differently the argument passed to it with respect to the "outer" definition of \mycomA and \mycomB. Let's say that it has to change \mycomA into "print in red" and return "status A", and \mycomB to print its argument in green and return "status B":

no, the replacement text of my \mycomA is more complicated. But why not using the same trick, by redefining, in roy@disable, \mycomA by something like \let\mycomA{\gdef\case{A}\gdef\content{\@firstofone}} , in order to store the content in \content and the information about which command was used in \case ?
–
nicolas royMar 28 '12 at 14:00

@nicolasroy Of course you're right: what must be disabled are just the "wrapper" macros. Please, make clearer whether your aim is not simply to print the argument.
–
egregMar 28 '12 at 14:02

ok. But how can i store \case{A} ? I can't put the \@firstofone in braces ...
–
nicolas royMar 28 '12 at 14:10

You can redefine \mycomA to be whatever you like. It's hard to say more without knowing more of what you want to do. Please, state clearly your problem.
–
egregMar 28 '12 at 14:12

1

@nicolasroy The correct syntax is \renewcommand\mycomA[1]{\gdef\case{A}\gdef\content{##1}}. But as @egreg says, it is incomprehensible what your're getting at with this.
–
Stephan LehmkeMar 28 '12 at 15:41