I'll summarize here what I found starting with @egreg's answer. The MWE below is what I could reduce it to, independent of svjour3, newtxtext and microtype, by tediously following the sequence of executed functions. What I end up not understanding is this \MT@get@size from microtype, which looks like this:
\def\MT@get@size{%
...
\ifx\@tempa\relax \else
\begingroup
\def\set@fontsize##1##2##3##4\@nil{\endgroup\def\MT@val{##2}}%
\@tempa\@nil
\fi
...
}
This looks nasty to me: I have no clue why \begingroup/\endgroup and {,} appear interleaved there. (Turns out it is this: Explanations about \begingroup\edef\x{\endgroup)
So in some sense, keyval does not like the \begingroup trick in combination with the \iftrue ... \else\fi, but I have not been able to isolate this any further.
\documentclass{article}
\usepackage{keyval}
\newcommand{\fancysize}{\iftrue\normalsize\else\fi}
\makeatletter
\define@key{foo}{bar}[]{
\begingroup
\def\set@fontsize##1##2##3##4\@nil{\endgroup}
\fancysize
\@nil
}
\setkeys{foo}{bar}
\begin{document}
X
\end{document}
Interestingly, removing \@nil works:
\define@key{foo}{bar}[]{
\begingroup
\def\set@fontsize##1##2##3##4{\endgroup}
\fancysize
}
What are those \@nil for? (Answer: Macro delimiter)
Also, moving \@nil inside the \iftrue...\else\fi works:
\define@key{foo}{bar}[]{
\begingroup
\def\set@fontsize##1##2##3##4\@nil{\endgroup}
\iftrue\normalsize\@nil\else\fi
}
This suggests that in the non-working case, \normalsize\else\fi\@nil becomes ...\set@fontsize...\else\fi\@nil, so \else\fi become parameters to \set@fontsize, where they don't match anything. It is really the combination of the \begingroup\def trick, macro delimiters, and a conditional expression. And all this is independent of much of keyval:
\documentclass{article}
\makeatletter
% similar to svjour3:
\newcommand{\fancysize}{\iftrue\normalsize\else\fi}
% isolated from microtype and keyval
\def\KV@foo@bar@default{
\begingroup
\def\set@fontsize##1##2##3##4\@nil{\endgroup}
\fancysize
\@nil
}
% isolated from keyval
\def\KV@default{
\iffalse\else
\KV@foo@bar@default
\fi
}
\def\KV@split{
\iftrue
\KV@default
\else\fi
}
\KV@foo@bar@default % works!
\KV@default % works!
\KV@split % fails!
\begin{document}
X
\end{document}
I wonder if that gives anyone a clue how to solve this in the general case...
% \documentclass{svjour3}
% \usepackage{newtxtext}
% \usepackage[config=foo]{microtype}
% \DeclareMicrotypeSet{}{size={normalsize}}
% \MT@DeclareSet{}{size={normalsize}}
% \renewcommand\MT@DeclareSet[3][]{\MT@map@clist@c\MT@features{{\MT@declare@sets{##1}{#2}{#3}}}}
% \MT@DeclareSet{}{size={normalsize}}
% \MT@map@clist@c\MT@features{{\MT@declare@sets{#1}{}{size={normalsize}}}}
% \MT@map@clist@c\MT@features{{\MT@declare@sets{#1}{}{size={normalsize}}}}
% \MT@exp@one@n\MT@map@clist@n\MT@features{{\MT@declare@sets{#1}{}{size={normalsize}}}}
% \MT@exp@one@n\MT@map@clist@n\MT@features{{\MT@declare@sets{#1}{}{size={normalsize}}}}
% \expandafter\MT@map@clist@n\expandafter{pr,ex,sp,kn,tr}{{\MT@declare@sets{#1}{}{size={normalsize}}}}
% \def\MT@map@clist@n#1#2{\def\MT@clist@function##1{#2}\MT@map@clist@#1,\@nil,\@nnil}
% \expandafter\MT@map@clist@n\expandafter{pr,ex,sp,kn,tr}{{\MT@declare@sets{#1}{}{size={normalsize}}}}
% \def\MT@clist@function#1{{\MT@declare@sets{#1}{}{size={normalsize}}}}
% \MT@map@clist@ pr,ex,sp,kn,tr,\@nil,\@nnil
% \def\MT@clist@function#1{{\MT@declare@sets{#1}{}{size={normalsize}}}}
% \MT@map@clist@ pr,\@nil,\@nnil
% \def\MT@clist@function#1{{\MT@declare@sets{#1}{}{size={normalsize}}}}
% \MT@clist@function{pr}
% \MT@declare@sets{pr}{}{size={normalsize}}
% \def\MT@declare@sets#1#2#3{\setkeys{MT@#1@set}{#3}}
% \MT@declare@sets{pr}{}{size={normalsize}}
% \setkeys{MT@pr@set}{size={normalsize}}
% \define@key{foo}{size}[]{\MT@map@clist@n{#1}{\def\MT@val{##1}\expandafter\MT@get@range\MT@val--\@nil}}
% \setkeys{foo}{size={normalsize}}
% \define@key{foo}{size}{\MT@map@clist@n{#1}{\def\MT@val{##1}\expandafter\MT@get@range\MT@val--\@nil}}
% \setkeys{foo}{size={normalsize}}
% \define@key{foo}{size}{\def\MT@val{normalsize}\expandafter\MT@get@range\MT@val--\@nil}
% \setkeys{foo}{size={normalsize}}
% \define@key{foo}{bar}{\def\MT@val{normalsize}\expandafter\MT@get@range\MT@val--\@nil}
% \setkeys{foo}{bar=foobar}
% \define@key{foo}{bar}[]{\MT@get@range normalsize--\@nil}
% \setkeys{foo}{bar}
% \def\MT@get@range#1{\def\MT@val{#1}\MT@get@size}
% \define@key{foo}{bar}[]{\MT@get@range{normalsize}}
% \setkeys{foo}{bar}
% \define@key{foo}{bar}[]{\def\MT@val{normalsize}\MT@get@size}
% \setkeys{foo}{bar}
% \define@key{foo}{bar}[]{\MT@let@cn\@tempa{normalsize}\iffalse\else\begingroup\def\set@fontsize##1##2##3##4\@nil{\endgroup\def\MT@val{##2}}\@tempa\@nil\fi}
% \setkeys{foo}{bar}
microtype.cfgis doing\DeclareMicrotypeSet{basicmath}{...}and is probably a by-product of howxkeyvalmanages keys and values. On the other hand, a redefinition of\normalsize(if it's the right thing to do in the first place), should go after packages have been loaded. – egreg Jul 20 '16 at 17:16\renewcommand\normalsize{\iftrue\expandafter\oldnormalsize\else\fi}fixes your first MWE. Likewise,\renewcommand\normalsize{\iffalse\else\expandafter\oldnormalsize\fi}– Steven B. Segletes Jul 21 '17 at 17:46\newcommand{\CommandTwo}{\iftrue\def\next{\CommandOne{1}{2}{3}}\else\def\next{}\fi\next}– Steven B. Segletes Jul 21 '17 at 17:52svjour3maintainers. – bers Jul 28 '17 at 05:24