summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/noconflict/noconflict.sty
blob: a99bbf97f776ca5f09958582b0f5efa619bf37d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
% Conflict Resolver <noconflict.sty>
% 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{<prefix added to the macro name>}
% \save{<prefix added to the macro name>}
%      {<comma separated list of macro name>}
% \save*{<comma separated list of macro name>}
% \restore{<prefix added to the macro name>}
% \restore*
% \reinstate{<prefix added to the macro name>}
%           {<comma separated partial list of macro name>}
% \rename{<old name>}{<new name>}
%
% 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