<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% 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{&lt;Token&gt;}
%------------------------------------------------------------------------------
 \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&lt;Token1&gt;,&lt;Token2&gt;
%     Saves &lt;Token1&gt; and &lt;Token2&gt; 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&lt;Token1&gt;,&lt;Token2&gt;
%     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: &lt;t1&gt;,&lt;t2&gt;,
%        This is split into &lt;t1&gt; and &lt;t2&gt;, and because the second token is
%        not empty \SH@TokenValid is set to true.
%     Example 2: &lt;t1&gt;,
%        This is split into &lt;t1&gt; 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{&lt;Target1&gt;}{&lt;Target2&gt;}{&lt;Source&gt;}
%     Splits &lt;Source&gt; 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 &lt;Target1&gt; 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{&lt;Name&gt;}{&lt;Value&gt;}
%     Creates a new command \&lt;Name&gt; with the value passed as second parameter.
%------------------------------------------------------------------------------
\def\SH@DefineCommand#1#2{%
  \expandafter\def\csname #1\endcsname{#2}%
}

%
% \TrimSpaces{&lt;Token&gt;}
%     This command removes leading and trailing spaces from &lt;Token&gt;. 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
</pre></body></html>