\documentclass{article}

\usepackage{etex}
\usepackage{xifthen}
\usepackage[ascii]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[warn]{textcomp}
\usepackage[a4paper, pdftex, margin=1.5in]{geometry}
\usepackage{lmodern}
\usepackage{typetex}
\usepackage{cmdstring}
\usepackage{microtype}
\usepackage{xcolor}
\usepackage{url}
\usepackage[bottom,hang]{footmisc}
\usepackage[babel]{csquotes}
\usepackage[british]{babel}
\usepackage{hyperref}

\setcounter{secnumdepth}{-\maxdimen}

\newcommand*{\pack}{\textsf}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand*{\setdate}{}
\def \setdate #1/#2/#3#4{%
  \year  = #1
  \month = #2
  \day   = #3#4
}

\makeatletter
\newcommand*{\getfileinfo}[1]{%
  \def \filename {#1}%
  \def \@tempb ##1 ##2 ##3\relax ##4\relax {%
    \def \filedate    {##1}%
    \def \fileversion {##2}%
    \def \fileinfo    {##3}%
  }%
  \edef \@tempa {\csname ver@#1\endcsname}%
  \expandafter \@tempb \@tempa \relax ? ? \relax \relax
}
\makeatother

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\title  {The \pack{cmdstring} Package}
\author {Josselin Noirel}
\date   {%
  \getfileinfo{cmdstring.sty}
  \expandafter \setdate \filedate
  \today\ (\fileversion)}

\begin{document}

\maketitle

\begin{abstract}
  For programmers, it is quite common to use the \emph{name} of a~macro
  (for instance `foo' for the macro \cmd{foo}, in other words, the letters
  \emph{f}, \emph{o}, and~\emph{o}).  For this purpose, it is customary
  to call \cmd{string} which does this sort of things\dots\ except that it
  prepends the escape character, controlled by the counter \cmd{escapechar},
  in front of the name.  The traditional ways of getting rid of it, is to
  set \cmd{escapechar} to~$-1$ (without forgetting to restore the proper
  value at the end of the process) or to make use of \cmd{@gobble}.
  The former has the drawback not to be expandible while the second isn't
  completely reliable.  Here we extend the expandible methods to make it
  reliable.
\end{abstract}

Use this package with
%
\begin{texcode}
\cmd[1]{usepackage}{cmdstring}
\end{texcode}
or
\begin{texcode}
\cmd[1]{RequirePackage}{cmdstring}
\end{texcode}
%
Then whatever the value of \cmd{escapechar},
\tex{\cmd{cmdstring} {\meta{command}}} will give correct result.  For
instance `\tex{\cmd{cmdstring}~\cmd{documentclass}}' gives `\cmdstring
\documentclass'; `\tex{\cmd{cmdstring}~\cmd{\\}}' gives `\cmdstring \\;
`\tex{\cmd{cmdstring}~\cmd{\SPACE}}' gives `\cmdstring \ ', i.e., the
command name without the escape~character.

\newpage

A~small test can be performed for all representative values of
\cmd{escapechar}
%
\begin{texcode}
\cmd{count}255 = -11 \newline
\cmd{loop} \cmd{escapechar} = \cmd{count}255 \newline
\ \ [\cmd{cmdstring} \cmd{documentclass}]    \newline
\ \ [\cmd{cmdstring} \cmd{\\}]               \newline
\ \ [\cmd{cmdstring} \cmd{\ }]               \newline
\ \ \cmd{ifnum} \cmd{count}255 < 300 \cmd{advance} \cmd{count}255 by 1 \newline
\cmd{repeat}
\end{texcode}
%
which gives
%
\begin{list}{}{}
\item \font \tempfonta = ec-lmtt8 at 5pt
            \tempfonta \baselineskip = 5.5pt \raggedright
\count255 = -11
\loop
  \escapechar = \count255
  [\cmdstring \documentclass]\nobreak\ %
  [\cmdstring \\]\nobreak\ %
  [\mbox{\cmdstring \ }]
  \ifnum \count255 < 300
  \advance \count255 by 1
\repeat \par
\end{list}

\end{document}
