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
|
% Copyright 2003 Sascha Herpers
%
% This file can be redistributed and/or modified under the terms
% of the LaTeX Project Public License Distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
% version 1 of the License, or any later version.
%
%
% 2003-05-22
% Sascha Herpers
% herpers@wiso.uni-koeln.de
%
%------------------------------------------------------------------------------
% History
% (mm/dd/yy) change
% -----------------------------------------------------------------------------
% 05/26/03 + added new options trim and notrim
% If 'trim' is set, each first token is stripped from leading and
% trailing spaces. 'notrim' is the default and leaves the token as
% is.
% + added new public command \TrimSpaces{<Token>}
%------------------------------------------------------------------------------
\ProvidesPackage{tokenizer}[2003/05/26]
\RequirePackage{ifthen}
%
% local variables
%------------------------------------------------------------------------------
\def\SH@true{true} % used with trim/notrim
\def\SH@false{false} % used with trim/notrim
%
% Options
%------------------------------------------------------------------------------
\DeclareOption{trim}{\edef\SH@trimtokens{\SH@true}} % trim tokens
\DeclareOption{notrim}{\edef\SH@trimtokens{\SH@false}} % do not trim tokens
\ProcessOptions
%
% \SH@GetTokens<Token1>,<Token2>
% Saves <Token1> and <Token2> in two commands. The names of the commands
% are derived from the value of \SH@FirstArgName and \SH@SecondArgName.
%------------------------------------------------------------------------------
\def\SH@GetTokens#1,#2\@empty{%
\def\SH@token{#1}
\ifx\SH@trimtokens\SH@true % strip spaces if requested
\TrimSpaces\SH@token
\fi
\SH@DefineCommand{\SH@FirstArgName}{\SH@token}
\SH@DefineCommand{\SH@SecondArgName}{#2}
}
%
% \SH@CheckTokenSep<Token1>,<Token2>
% Checks the arguments for the existence of a token separator.
% This Command must be called with a trailing comma!
% If a comma was found \SH@TokenValid is set to true, false otherwise.
% Example 1: <t1>,<t2>,
% This is split into <t1> and <t2>, and because the second token is
% not empty \SH@TokenValid is set to true.
% Example 2: <t1>,
% This is split into <t1> and an empty second token and thus evaluates
% to false.
% Remark: If you omit the trailing comma when calling \SH@CheckTokenSep
% example 2 will fail to compile.
%------------------------------------------------------------------------------
\def\SH@CheckTokenSep#1,#2\@empty{%
\def\SH@CTSArgTwo{#2}%
\ifx\SH@CTSArgTwo\@empty
\edef\SH@TokenValid{\SH@false}
\else
\edef\SH@TokenValid{\SH@true}
\fi
}
%
% \GetTokens{<Target1>}{<Target2>}{<Source>}
% Splits <Source> into two tokens at the first encounter of a comma.
% The first token is saved in a newly created command with the name passed
% as <Target1> and the second token likewise.
%------------------------------------------------------------------------------
\newcommand\GetTokens[3]%
{%
% save the names of the commands to receive the separated tokens
\def\SH@FirstArgName{#1}%
\def\SH@SecondArgName{#2}%
% check for the token separator
\expandafter\SH@CheckTokenSep#3,\@empty%
\ifx\SH@TokenValid\SH@true
% separator found, split the source string
\expandafter\SH@GetTokens#3\@empty%
\else
% there was no separator, return the complete source string as
% first token
\def\SH@token{#3}
\ifx\SH@trimtokens\SH@true % strip spaces if requested
\expandafter\TrimSpaces\SH@token
\fi
\SH@DefineCommand{\SH@FirstArgName}{\SH@token}
\SH@DefineCommand{\SH@SecondArgName}{}
\fi
}
%
% \DefineCommand{<Name>}{<Value>}
% Creates a new command \<Name> with the value passed as second parameter.
%------------------------------------------------------------------------------
\def\SH@DefineCommand#1#2{%
\expandafter\def\csname #1\endcsname{#2}%
}
%
% \TrimSpaces{<Token>}
% This command removes leading and trailing spaces from <Token>. I found
% the original code on the web. The original author was Michael Downes, who
% provided the code as an answer to 'around the bend' question #15.
%------------------------------------------------------------------------------
\catcode`\Q=3
\def\TrimSpaces#1{%
\begingroup
\aftergroup\toks\aftergroup0\aftergroup{%
\expandafter\trimb\expandafter\noexpand#1Q Q}%
\global\edef#1{\the\toks0}%
}
\def\trimb#1 Q{\trimc#1Q}
\def\trimc#1Q#2{\afterassignment\endgroup \vfuzz\the\vfuzz#1}
\catcode`\Q=11
|