blob: 5b849e38c72cfc4a23303269be3158e3413512fa (
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
|
% rcsid = @(#)$Id: conditionals.sty,v 1.4 2002/01/17 22:38:45 christopher Exp $
%==========Conditionals by Donald Arseneau <asnd@triumf.ca>===========
% (as of 2002/01/17)
% \if\blank{ } --- checks if parameter is blank (Spaces count as blank)
% \if\given{ } --- checks if parameter is not blank: like \if\blank{}...\else
% \if\nil{ } --- checks if parameter is null (spaces are NOT null)
%
{\catcode`\!=8 % funny catcode so ! will be a delimiter
\catcode`\Q=3 % funny catcode so Q will be a delimiter
\long\gdef\given#1{88\fi\Ifbl@nk#1QQQ\empty!}
\long\gdef\blank#1{88\fi\Ifbl@nk#1QQ..!}% if null or spaces
\long\gdef\nil#1{\IfN@Ught#1* {#1}!}% if null
\long\gdef\IfN@Ught#1 #2!{\blank{#2}}
\long\gdef\Ifbl@nk#1#2Q#3!{\ifx#3}% same as above
}
\endinput
%=====================================================================
% COMMENTARY: Donald Arseneau's commentary on these macros.
%=====================================================================
% There are many ways to check if a field is blank. The clearest is:
%
% \long\def\@tempa{#1}\ifx\@tempa\@empty ... \else ... \fi
%
% (use \empty for plain TeX)
%
% There are a few deficiencies with this approach: it is not "expandable"
% so it can't be executed in an \edef or a \write; it redefines some
% command (\@tempa here), and it is unsafe to put the first part in a
% macro because of the unbalanced \fi. Below are my versions which are
% expandable and safe. There are % two versions for the syntax:
% \ifnull{#1}\then... and \if\nil{#1}...
% [I hear the second syntax comes from DEK]. Choose your favorite.
%
%========================================================================
% \ifblank --- checks if parameter is blank (Spaces count as blank)
% \ifgiven --- checks if parameter is not blank: like \ifblank...\else
% \ifnull --- checks if parameter is null (spaces are NOT null)
% use \ifgiven{#1}\then ... \else ... \fi etc
\let\then\iftrue
{\catcode`\!=8 % funny catcode so ! will be a delimiter
\catcode`\Q=3 % funny catcode so Q will be a delimiter
\long\gdef\ifgiven#1\then{\Ifbl@nk#1QQQ\empty!}% negative of \ifblank
\long\gdef\ifblank#1\then{\Ifbl@nk#1QQ..!}% if null or spaces
\long\gdef\Ifbl@nk#1#2Q#3!{\ifx#3}
\long\gdef\ifnull#1\then{\IfN@LL#1* {#1}!}% if null
\long\gdef\IfN@LL#1 #2!{\ifblank{#2}\then}
}
%
%---------------------------------------------------------------------
% Other version: use \if\given{ }, \if\blank{ }, \if\nil{ }
% (There is no \then).
%
{\catcode`\!=8 % funny catcode so ! will be a delimiter
\catcode`\Q=3 % funny catcode so Q will be a delimiter
\long\gdef\given#1{88\fi\Ifbl@nk#1QQQ\empty!}
\long\gdef\blank#1{88\fi\Ifbl@nk#1QQ..!}% if null or spaces
\long\gdef\nil#1{\IfN@Ught#1* {#1}!}% if null
\long\gdef\IfN@Ught#1 #2!{\blank{#2}}
\long\gdef\Ifbl@nk#1#2Q#3!{\ifx#3}% same as above
}
%---------------------------------------------------------------------
%
% One note of caution: Even though these macros can be nested
% because they give balanced \if - \fi constructs (\if or \then),
% nesting is still a danger if the tested parameter text contains
% an unbalanced \if or \fi. As a general rule, ill-defined parameter
% text should not be skipped over by \if.
%
% The special delimiter above is a funny Q character having the category
% 3, usually associated with $. If there is some strange application
% where Q might have catcode 3, then a better delimiter would be needed.
% The following paranoid definitions use QQ with *different* categories:
% Q(4)Q(3) as the delimiter.
%
{\catcode`\!=8 % funny catcode so ! will be a delimiter
\catcode`\Q=3 % funny catcode so Q will be a delimiter
\catcode`\R=4 % another funny catcode for Q !
\uccode`\R=`\Q
\uppercase{\long\gdef\given#1{11\fi\Ifbl@nk#1RQ11RQ12RQ!}}
\uppercase{\long\gdef\blank#1{11\fi\Ifbl@nk#1RQ12RQ11RQ!}}% if null or spaces
\long\gdef\nil#1{\IfN@Ught#1* {#1}!}% if null
\long\gdef\IfN@Ught#1 #2!{\blank{#2}}
\uppercase{\long\gdef\Ifbl@nk#1#2RQ#3RQ#4!{\ifx#3}}% same as above
}
|