\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}]{\}{\} \end{texcode} % and % \begin{texcode} \cmd[syntax,2]{newcommand}*{command}{definition} \end{texcode} % is equivalent to % \begin{texcode} \cmd[3]{newcommand}[]{\}{\} \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}