\documentclass{article}

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

\setcounter{secnumdepth}{-\maxdimen}

\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

\newcommand*{\pack}{\textsf}

\title  {The \pack{xnewcommand} package}
\author {Josselin Noirel\\\url{http://www.jnoirel.fr/}}
\date   {%
  \getfileinfo{xnewcommand.sty}%
  \expandafter \setdate \filedate
  \today\ (\fileversion)}

\begin{document}

\maketitle

\tableofcontents

\begin{abstract}
  For most purposes, the features of \cmd{newcommand} suffice.
  Nonetheless, \cmd{newcommand} lacks some interesting features like
  the ability to make definition global or to use the \cmd{protected}
  prefix supplied by \eTeX.  This---surprisingly small---package makes
  possible to pass an~optional argument \cmd{newcommand} so that is
  becomes possible to use the \cmd{global} and \cmd{protected}
  prefixes.
\end{abstract}

\section{Usage}

Load the package with
%
\begin{texcode}
  \cmd[1]{usepackage}{xnewcommand}
\end{texcode}
%
Then \cmd{newcommand} can take an additional optional argument:
%
\begin{texcode}
  \cmd[syntax,5]{newcommand}[prefix]{command}[number][default]{definition}
\end{texcode}
%
where \meta{prefix} can be any valid prefix or combination of them:
%
\begin{description}
\item [\cmd{long}]       The command will accept `long arguments', in
                         other words, its arguments may contain ends
                         of paragraph (explicit \cmd{par} or empty
                         lines);

\item [\cmd{global}]     The command is defined globally, in other
                         words, the definition won't be confined to
                         the current group;

\item [\cmd{protected}]  The command will be robust in moving
                         arguments and won't undergo systematic
                         expansion at the beginning of tabular cells;

\item [\cmd{outer}]      Makes the macro \cmd{outer} (not very useful,
                         but included for the sake of completeness).
\end{description}

The same syntax applies to the commands \cmd{renewcommand},
\cmd{DeclareRobustCommand}, \cmd{newenvironment} and
\cmd{renewenvironment}.

\section{Remarks}

It should not break anything.  The normal syntax is preserved:
%
\begin{texcode}
\cmd[syntax,2]{newcommand}{command}{definition}
\end{texcode}
%
is equivalent to
%
\begin{texcode}
\cmd[3]{newcommand}[\cmd{long}]{\<command\>}{\<definition\>}
\end{texcode}
%
and
%
\begin{texcode}
\cmd[syntax,2]{newcommand}*{command}{definition}
\end{texcode}
%
is equivalent to
%
\begin{texcode}
\cmd[3]{newcommand}[]{\<command\>}{\<definition\>}
\end{texcode}
%
Any macro that uses \cmd{star@or@long} will inheritate the features
described above.

\section{Examples}

Global definition:
%
\begin{texcode}
\cmd{newcommand}[\cmd{global}]\marg{command}\marg{definition}
\end{texcode}
%
Protected definition:
%
\begin{texcode}
\cmd{newcommand}[\cmd{protected}]\marg{command}\marg{definition}
\end{texcode}
%
Combination of both:
%
\begin{texcode}
\cmd{newcommand}[\cmd{global} \cmd{protected}]\marg{command}\marg{definition}
\end{texcode}

\end{document}
