% Conflict Resolver % Resolves Macro Name Conflict among Packages % Copyright 2013 M. Zahid Hossain % % This package resolves macro name conflict among packages with concise % approaches and user-friendly syntaxes. % % This program may be distributed and/or modified under the conditions % of the LaTeX Project Public License, either version 1.2 of this % license or (at your option) any later version. % % A macro name can be defined by many packages. In LaTeX, macro name need % to be unique for a document and thus using the packages with same macro % name causes conflict among them. In order to avoid macro name conflict % this package defines several commands to save, restore and rename macros % defined by other packages. % % PACKAGE COMMANDS % ================ % % \prefix{} % \save{} % {} % \save*{} % \restore{} % \restore* % \reinstate{} % {} % \rename{}{} % % USAGE EXAMPLE % ============= % % If package A, B and C define three macro names X, Y and Z. To avoid macro % name conflict: % % \usepackage{noconflict} % \usepackage{A} % \prefix{First} is optional % \save{X,Y,Z} % % \usepackage{B} % \save{Second}{X,Y,Z} % The above line can also be written as: \prefix{Second} and \save*{X,Y,Z} % % \usepackage{C} % \save{Third}{X,Y,Z} % % Now macro X, Y and Z of % Package A: \FirstX, \FirstY, \FirstZ % Package B: \SecondX, \SecondY, \SecondZ % Package C: \ThirdX, \ThirdY, \ThirdZ % % \restore{First} % Macros \FirstX, \FirstY and \FirstZ become \X, \Y and \Z % \restore{Second} % The above line can also be written as: \prefix{Second} and \restore* % The above line can also be written as: \reinstate{Second}{X,Y,Z} % Macros \SecondX, \SecondY and \SecondZ become \X, \Y and \Z % \restore{Third} % Macros \ThirdX, \ThirdY and \ThirdZ become \X, \Y and \Z % \rename{X}{CofX} % Macro \X becomes \CofX % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{noconflict}[2013/04/23 v1.0 Resolves macro name conflict] \def\@foreach#1#2{% \@test@foreach{#1}#2,\@end@token% } \def\@swallow#1{} \def\@test@foreach#1{% \@ifnextchar\@end@token% {\@swallow}% {\@body@foreach{#1}}% } \def\@body@foreach#1#2,#3\@end@token{% #1{#2}% \@test@foreach{#1}#3\@end@token% } \newcommand{\@save}[1]{% \expandafter\global\expandafter\let\csname \@prefix#1\expandafter\endcsname% \csname #1\endcsname \expandafter\let\csname #1\endcsname\relax } \newcommand{\@restore}[1]{% \expandafter\global\expandafter\let\csname#1\expandafter\endcsname% \csname \@prefix#1\endcsname% } \newcommand{\@prefix}{First} \newcommand{\prefix}[1]{% \gdef\@prefix{#1}% } \newcommand{\save}{\@ifstar \save@star% \save@nostar% } \newcommand{\save@star}[1]{ \expandafter\gdef\csname list@conflict\@prefix\endcsname{#1}% \@foreach{\@save}{#1}% } \newcommand{\save@nostar}[2]{ \prefix{#1} \expandafter\gdef\csname list@conflict\@prefix\endcsname{#2}% \@foreach{\@save}{#2}% } \newcommand{\restore}{\@ifstar \restore@star% \restore@nostar% } \newcommand{\restore@star}{ \edef\expand@command{\csname list@conflict\@prefix\endcsname}% \expandafter\@foreach\expandafter{\expandafter\@restore\expandafter}% \expandafter{\expand@command}% } \newcommand{\restore@nostar}[1]{ \prefix{#1} \edef\expand@command{\csname list@conflict\@prefix\endcsname}% \expandafter\@foreach\expandafter{\expandafter\@restore\expandafter}% \expandafter{\expand@command}% } \newcommand{\reinstate}[2]{ \prefix{#1} \@foreach{\@restore}{#2}% } \newcommand{\rename}[2]{ \expandafter\global\expandafter\let\csname #2\expandafter\endcsname% \csname #1\endcsname \expandafter\let\csname #1\endcsname\relax } \endinput