<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">%%
%% substr.sty
%%
%% This package provides commands to deal with substrings in strings:
%% Determine if a string contains a substring, count appearances of a
%% substring in a string.
%%
%%
%% Commands:
%%
%% \IfSubStringInString{substring}{string}{true part}{false part}
%% This command searches &lt;substring&gt; in &lt;string&gt; and executes the 
%% &lt;true part&gt; if it is and else the &lt;else part&gt;
%%
%% \IfCharInString{char}{string}{true part}{false part}
%% Actualy the same as \IfSubStringInString.
%%
%% \BehindSubString{substring}{string}
%% Returns the part of &lt;string&gt; that is on the behind
%% &lt;substring&gt;. Always the first appearance of &lt;substring&gt; is taken.
%%
%% \BeforeSubString{substring}{string}
%% Returns the part of &lt;string&gt; that is on the before
%% &lt;substring&gt;. Always the first appearance of &lt;substring&gt; is taken.
%%
%% \CountSubStrings{substring}{string}
%% Counts the number of appearances of &lt;substring&gt; in &lt;string&gt; and
%% returns it as text.
%%
%% \SubStringsToCounter{counter}{substring}{string}
%% Counts the number of appearances of &lt;substring&gt; in &lt;string&gt; and
%% sets the counter &lt;counter&gt; to that value.
%%
%% \IfBeforeSubStringEmpty{substring}{string}{true part}{false part}
%% Calls &lt;true part&gt; if &lt;substring&gt; is equal to the beginning of &lt;string&gt;.
%% Else call &lt;false part&gt;.
%%
%% \IfBehindSubStringEmpty{substring}{string}{true part}{false part}
%% Calls &lt;true part&gt; if &lt;substring&gt; is equal to the end of &lt;string&gt;.
%% Else call &lt;false part&gt;.
%%
%%
%% History of this package:
%%
%% The package arises from a posting of me in the newsgroup
%% de.comp.text.tex in which I asked how to find out if a substring
%% is included in a string. Heiko Oberdiek
%% &lt;oberdiek@ruf.uni-freiburg.de&gt; posted the commands
%% \IfSubStringInString and \IfCharInString and suggested to write a
%% command which counts the appearances in a string. So, I wrote the
%% commands \CountSubStrings and \SubStringsToCounter.
%% After I wrote this package I sent it to Heiko Oberdiek
%% who improved and rewrote many parts of it.
%%
%%
%% ChangeLog
%%
%% 2009/10/20  v1.2  Uwe LÃ¼ck
%% 	- Fix \IfSubStringInString which did not work if the string was contained in the substring
%% 
%% 2005/11/29  v1.1  Harald Harders
%% 	- Add \IfBeforeSubStringEmpty and \IfBehindSubStringEmpty.
%%
%%
%%
%% Copyright 2000, 2005, 2009 Harald Harders
%%
%% This program 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.
%%
%%
%% 2009-10-20
%% Harald Harders
%% h.harders@tu-bs.de
%%
\ProvidesPackage{substr}[2009/10/20  v1.2  Handle substrings]
%%
% expands the first and second argument with
% \protected@edef and calls #3 with them:
\newcommand\su@ExpandTwoArgs[3]{%
  \protected@edef\su@SubString{#1}%
  \protected@edef\su@String{#2}%
  \expandafter\expandafter\expandafter#3%
  \expandafter\expandafter\expandafter{%
    \expandafter\su@SubString\expandafter
  }\expandafter{\su@String}%
}
%%
%% tests if #1 in #2. If yes execute #3, else #4
\newcommand*\IfSubStringInString[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@IfSubStringInString
}
%%
\newcommand*\su@IfSubStringInString[2]{%
  \def\su@compare##1#1##2\@nil{%
    \def\su@param{##2}%
    \ifx\su@param\@empty
      \expandafter\@secondoftwo
    \else
      \expandafter\@firstoftwo
    \fi
  }%
  \su@compare#2\@nnil#1\@nil
}
%%
%% tests if #1 in #2. If yes execute #3, else #4
\newcommand\IfCharInString{}
\let\IfCharInString\IfSubStringInString
%%
%% returns the part of the string behind the found substring
\newcommand*\BehindSubString[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@BehindSubString
}
\newcommand*\su@BehindSubString[2]{%
  \def\su@rest##1#1##2\@nil{##2}%
  \IfSubStringInString{#1}{#2}{\su@rest#2\@nil}{}%
}
%%
%% returns the part of the string before the found substring
\newcommand*\BeforeSubString[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@BeforeSubString
}
\newcommand*\su@BeforeSubString[2]{%
  \def\su@rest##1#1##2\@nil{##1}%
  \IfSubStringInString{#1}{#2}{\su@rest#2\@nil}{#2}%
}
%%
%% calls #3 if part of string before substring is empty, otherwise calls #4.
\newcommand*\IfBeforeSubStringEmpty[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@IfBeforeSubStringEmpty
}
%%
\newcommand*\su@IfBeforeSubStringEmpty[4]{%
  \def\su@rest##1#1##2\@nil{##1}%
  \IfSubStringInString{#1}{#2}{%
    \edef\su@resta{\su@rest#2\@nil}%	
    \ifx\@empty\su@resta #3\else #4\fi
  }{#4}%
}
%%
%% calls #3 if part of string after substring is empty, otherwise calls #4.
\newcommand*\IfBehindSubStringEmpty[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@IfBehindSubStringEmpty
}
%%
\newcommand*\su@IfBehindSubStringEmpty[4]{%
  \def\su@rest##1#1##2\@nil{##2}%
  \IfSubStringInString{#1}{#2}{%
    \edef\su@resta{\su@rest#2\@nil}%	
    \ifx\@empty\su@resta #3\else #4\fi
  }{#4}%
}
%%
%% counter for counting appearances
\newcounter{su@anzahl}
%%
% #1: String
% #2: Substring
% #3: Counter
\newcommand*\su@StringSubstringCounter[3]{%
  \su@IfSubStringInString{#2}{#1}{%
    \stepcounter{#3}%
    \def\su@rest##1#2##2\@nil{##2}%
    \expandafter\su@StringSubstringCounter\expandafter
    {\su@rest#1\@nil}{#2}{#3}%
  }{}%
}
%%
\newcommand*\CountSubStrings[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@CountSubStrings
}
\newcommand*\su@CountSubStrings[2]{%
  \setcounter{su@anzahl}{0}%
  \su@StringSubstringCounter{#2}{#1}{su@anzahl}%
  \thesu@anzahl
}
% #1: counter
% #2: substring
% #3: string
\newcommand*\SubStringsToCounter[3]{%
  \su@ExpandTwoArgs{#2}{#3}\su@SubStringsToCounter{#1}%
}
% #1: substring
% #2: string
% #3: counter
\newcommand*\su@SubStringsToCounter[3]{%
  \setcounter{#3}{0}%
  \su@StringSubstringCounter{#2}{#1}{#3}%
}
%%
\endinput
%% EOF
</pre></body></html>