# Using a macro to pass parameters to a command

I am trying to pass some tags to the command \iftagged from the package tagging. See the MWE below.

From what I understand, my macro \mytags does not get expanded. I found a lot of similar questions here, but still cannot figure it out. Please help!

\documentclass[10pt]{article}

\usepackage{tagging}

\begin{document}

\newcommand{\mytags}{%
tagone,
tagtwo,
tagthree
}

\usetag{tagone}

% Command
\iftagged{\mytags}{Tags passed to the command successfully!}{Tags not passed to the command!}

% Environment
\begin{taggedblock}{\mytags}
Tags passed to the environment successfully!
\end{taggedblock}

\begin{taggedblock}{tagone,tagtwo,tagthree}
Tags passed directly successfully!
\end{taggedblock}

\end{document}


The result I get:

Tags not passed to the command!
Tags passed directly successfully!


Edit:

\iftagged and \begin{taggedblock} are commands from the package tagging.

Basically, I need to have \iftagged{\mytags} replaced with \iftagged{tagone,tagtwo,tagthree} during compilation. The same with \begin{taggedblock}{\mytags}.

• You need to specify the number of variables passed, and use their "names" #1, #2, ... See here for details: en.wikibooks.org/wiki/LaTeX/Macros . It's still a macro-system, which does not use (undeclared!) variable names as we are used to from (some) programming languages. Apr 27 at 8:40
• @MS-SPO Thank you! Tried adding the [num] argument, but it did not help. And this argument seems to be optional. I just need to pass the string of tags as one variable. Apr 27 at 8:48
• Please update your code using the Edit button, perhaps you still miss a point. Unlike in other fori here is little room for discussions ;) Apr 27 at 9:41
• Sorry, I am not sure what you mean. Maybe the title confused you. I just need to have \mytags replaced with the string tagone,tagtwo,tagthree. I don't need to pass variables as #1, #2 anywhere. If I am still missing your point, can you please provide an answer? :) Apr 27 at 10:12

The command \iftagged does no expansion on its first argument.

You might want to do

\expandafter\iftagged\expandafter{\mytags}{...}{...}


or take a bigger step and do the expansion right away (it should not be risky, because tags are simple strings of characters). Do the same also to \taggedblock.

\documentclass[10pt]{article}

\usepackage{tagging}
\usepackage{etoolbox}

% replace \docsvlist in \iftagged with \xdocsvlist
\patchcmd{\iftagged}{\docsvlist}{\xdocsvlist}{}{}
\patchcmd{\taggedblock}{\docsvlist}{\xdocsvlist}{}{}
% \xdocsvlist fully expands its argument before passing it to \docsvlist
\newcommand{\xdocsvlist}[1]{%
\expandafter\docsvlist\expandafter{\expanded{#1}}%
}

\begin{document}

\newcommand{\mytags}{%
tagone,
tagtwo,
tagthree
}

\usetag{tagone}

% Command
\iftagged{\mytags}{Tags passed to the command successfully!}{Tags not passed to the command!}

% Environment
\begin{taggedblock}{\mytags}
Tags passed to the environment successfully!
\end{taggedblock}

\begin{taggedblock}{tagone,tagtwo,tagthree}
Tags passed directly successfully!
\end{taggedblock}

\end{document}


• \iftagged works! Now I am not sure how to apply this approach to \begin{taggedblock}{\mytags} ... \end{taggedblock}. Is it possible? Apr 27 at 11:14
• @f-hollow Added as requested Apr 27 at 11:47
• Everything works perfectly! I will try to wrap my head around it. Thank you so much! Apr 27 at 12:11
• For future references: When using \begin{taggedblock}{\mytags} ... \end{taggedblock}, LaTeX throws an error 'not enough arguments for \begin{taggedblock} sometimes. My solution was to switch from the taggedblock environment to the command \tagged{\mytags}{...}. May 5 at 5:20