I have seen packages using
\def\afterelse#1\else#2\fi{\fi#1}
which TeX seems happy to accept. But on taking the first branch, isn't TeX expecting \else instead of \fi? That is, isn't the following the correct syntax for the first fork? This too is accepted by TeX.
\def\afterelse#1\else#2\fi{\else#1}
EDIT
Thanks to Egreg. Tracing \ifs shows what is happening.
\def\loggingallstuff{%
\tracinggroups\@ne\tracingifs\@ne\loggingall\tracingassigns\@ne
}
\def\afterelse#1\else#2\fi{\fi#1}
{\loggingallstuff
%\edef\x{\iftrue\afterelse T\else F\fi}
\edef\x{\iftrue T\else F\fi}
% \edef\x{\iffalse T\else F\fi}
}
% \iftrue
{\edef}
{\iftrue: (level 1) entered on line 23}
{true}
{\else: \iftrue (level 1) entered on line 23}
{\fi: \iftrue (level 1) entered on line 23}
{changing \x=undefined}
{into \x=macro:->T}
% \iffalse:
{\edef}
{\iffalse: (level 1) entered on line 24}
{false}
{\else: \iffalse (level 1) entered on line 24}
{\fi: \iffalse (level 1) entered on line 24}
{changing \x=undefined}
{into \x=macro:->F}
Here is one case I find interesting:
\documentclass{article}
\usepackage{pgfkeys}
\makeatletter
\def\pgfkeysafterfi#1\fi{\fi#1}
%\def\pgfkeysafterelsei#1\else#2\fi{\fi#1}
\def\pgfkeysafterelsei#1\else#2\fi{\else#1} % wrong but gives no error.
\def\pgfkeysifkeydef#1#2#3{%
\ifcsname pgfk@#1/.@cmd\endcsname
\pgfkeysafterelsei{#2}\else\pgfkeysafterfi{#3}\fi
}
\pgfkeys{%
/handlers/.if definable/.code 2 args={
\pgfkeysifkeydef{\pgfkeyscurrentpath}{%
\@latexerr{Oops, key '\pgfkeyscurrentpath' already exists}
{You aren't in trouble here!}%
}{%
\pgfkeys{\pgfkeyscurrentpath/.default=#1,\pgfkeyscurrentpath/.code=#2}%
}%
}%
}
\pgfkeys{
/fam/.is family,/fam/.cd,
keya/.if definable=\relax\@empty,
keya/.if definable=\@empty{\def\x##1{##1*#1}},
}
\makeatother
\begin{document}
x
\end{document}
\iftrue\else\or\fiis legal and writes{\or: \iftrue (level 1) ...}to the log when tracing ifs. – Bruno Le Floch Aug 25 '12 at 7:57\iffalse\def\x{T}\else\def\x{F}\or\figivesextra \or. – Ahmed Musa Aug 28 '12 at 2:15\def\foo#1{\ifx?#1abc\else def\fi}(meant to giveabcwhen#1is?anddefotherwise). Giving it?\elseas an argument will produce no output. I've had somewhat similar situations withinl3fp. – Bruno Le Floch Aug 28 '12 at 11:10