From 38b404935da1517d414a99cb996804cb778fa887 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 27 Apr 2013 22:20:47 +0000 Subject: noconflict (27apr13) git-svn-id: svn://tug.org/texlive/trunk@30140 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/noconflict/noconflict.sty | 154 +++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/noconflict/noconflict.sty (limited to 'Master/texmf-dist/tex/latex/noconflict') diff --git a/Master/texmf-dist/tex/latex/noconflict/noconflict.sty b/Master/texmf-dist/tex/latex/noconflict/noconflict.sty new file mode 100644 index 00000000000..a99bbf97f77 --- /dev/null +++ b/Master/texmf-dist/tex/latex/noconflict/noconflict.sty @@ -0,0 +1,154 @@ +% 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 + + -- cgit v1.2.3