summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/thmtools/parseargs.dtx
blob: 2ce98271bf4d743ffa0967db56e6386780b59b53 (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
% \iffalse meta-comment
%
% Copyright (C) 2008 by Ulrich M. Schwarz
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3a.
% The license can be obtained from
% http://www.latex-project.org/lppl/lppl-1-3a.txt
%
% \fi
%
%\iffalse (hide this from DocInput)
%<*driver>
\documentclass{ltxdoc}

\usepackage[T1]{fontenc}
\usepackage{fourier}
\usepackage[scaled=0.8]{helvet}
\usepackage{luximono}

\usepackage{amsmath, amsthm}
\usepackage{parseargs}
\newtheorem{lemma}{Lemma}
\providecommand\pkg{\textsf}
\GetFileInfo{parseargs.sty}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \newcommand\ParseArgs{\textsf{ParseArgs}}
  \title{The \ParseArgs\ package\thanks{%
    This file documents version~\fileversion\ of~\filedate,
    RCS ${}$Id: parseargs.dtx,v 1.2 2008/06/22 12:09:33 ulmi Exp ulmi ${}$.
  }}
  \author{Ulrich M. Schwarz\thanks{ulmi@absatzen.de}}

  \maketitle

 \begin{abstract}
 A command like |\newtheorem| with its gazillion different argument
 possibilities is difficult to parse manually. And then, you add beamer
 support and you have to wade through a maze of twisty call indirections, 
 all alike.

 This package provides a generic argument parser similar to the one that
 will be in \LaTeX3.
 \end{abstract}

  \DocInput{thm-autoref.dtx}
\end{document}
%</driver>
%<*parseargs>
%\fi
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
% Digits \0\1\2\3\4\5\6\7\8\9
% Exclamation \! Double quote \" Hash (number) \#
% Dollar \$ Percent \% Ampersand \&
% Acute accent \' Left paren \( Right paren \)
% Asterisk \* Plus \+ Comma \,
% Minus \- Point \. Solidus \/
% Colon \: Semicolon \; Less than \<
% Equals \= Greater than \> Question mark \?
% Commercial at \@ Left bracket \[ Backslash \\
% Right bracket \] Circumflex \^ Underscore \_
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
% \CheckSum{160}
%
% \DoNotIndex{\@for,\addtocounter,\arabic,\csname,\endcsname,\cup,\CurrentOption}
% \DoNotIndex{\{,\},\do,\define@key,\def,\DeclareOption,\else,\ensuremath,\expandafter}
% \DoNotIndex{\hspace,\fi,\rule,\ifcase,\ifx,\in,\InputIfFileExists,\leq,\let,\mathpalette}
% \DoNotIndex{\NeedsTeXFormat,\ldots,\ldotp,\newcommand,\newcounter,\or}
% \DoNotIndex{\PackageInfo,\PackageWarning,\parm,\ProcessOptions,\protected@edef}
% \DoNotIndex{\providecommand,\ProvidesPackage,\relax,\renewcommand,\RequirePackage}
% \DoNotIndex{\setcounter,\setkeys,\rlap,\setminus,\widthof,\mathrm}
%
%\section{Usage}
%
% The main command provided by the package is |\parse|\marg{spec}.
% \emph{spec} consists of groups of commands. Each group should set up the
% command |\@parsecmd| which is then run. The important point is that
% |\@parsecmd| will pick up its arguments from the running text, not from
% the rest of \emph{spec}. When it's done storing the arguments,
% |\@parsecmd| must call |\@parse| to continue with the next element of
% \emph{spec}. The process terminates when we run out of spec.
%
% Helper macros are provided for the three usual argument types: mandatory,
% optional, and flag.
%
%\StopEventually{}
%\section{Implementation}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{parseargs}[2008/05/12 v0.1alpha1 generic argument parser (ulmi)]

\newtoks\@parsespec
\def\parse@endquark{\parse@endquark}
\newcommand\parse[1]{%
  \@parsespec{#1\parse@endquark}\@parse}

\newcommand\@parse{%
  \edef\p@tmp{\the\@parsespec}%
  \ifx\p@tmp\parse@endquark
    \expandafter\@gobble
  \else
%    \typeout{parsespec remaining: \the\@parsespec}%
    \expandafter\@firstofone
  \fi{%
    \@parsepop
  }%
}
\def\@parsepop{%
  \expandafter\p@rsepop\the\@parsespec\@nil
  \@parsecmd
}
\def\p@rsepop#1#2\@nil{%
  #1%
  \@parsespec{#2}%
}

\newcommand\parseOpt[4]{%
  %\parseOpt{openchar}{closechar}{yes}{no}
%  \typeout{attemping #1#2...}%
  \def\@parsecmd{%
    \@ifnextchar#1{\@@reallyparse}{#4\@parse}
  }%
  \def\@@reallyparse#1##1#2{%
    #3\@parse
  }%
}

\newcommand\parseMand[1]{%
  %\parseMand{code}
  \def\@parsecmd##1{#1\@parse}%
}

\newcommand\parseFlag[3]{%
  %\parseFlag{flagchar}{yes}{no}
  \def\@parsecmd{%
    \@ifnextchar#1{#2\expandafter\@parse\@gobble}{#3\@parse}%
  }%
}
%    \end{macrocode}
%\iffalse
%</parseargs>
%\fi