Responder1
Não recomendo fazer isso porque será confuso para qualquer pessoa que leia seu documento. Também não funcionará para todas as macros, especialmente aquelas que brincam com códigos de categoria antes de lerem seus argumentos. Dito isto, é possível.
Aqui está um código LaTeX que define uma macro \flip
que inverterá os argumentos obrigatórios e opcionais de uma macro definida para ter exatamente um argumento obrigatório e um argumento opcional.
\usepackage{etoolbox}
\makeatletter
\newcommand*\flip[1]{%
\cslet{flip@\string#1}#1%
\long\def#1##1{%
\@ifnextchar[{\@flip{#1}{##1}}{\csuse{flip@\string#1}{##1}}%
}%
}
\long\def\@flip#1#2[#3]{%
\csuse{flip@\string#1}[#3]{#2}%
}
\makeatother
Por exemplo, dada a macro
\newcommand\foo[2][none]{%
\par
Required argument: #2\\
Optional argument: #1%
}
você pode escrever \flip\foo
uma vez e ele será redefinido \foo
para receber um argumento obrigatório seguido por um argumento opcional. Aqui está um documento completo ilustrando isso.
\documentclass{article}
\usepackage{parskip}
\usepackage{etoolbox}
\makeatletter
\newcommand*\flip[1]{%
\cslet{flip@\string#1}#1%
\long\def#1##1{%
\@ifnextchar[{\@flip{#1}{##1}}{\csuse{flip@\string#1}{##1}}%
}%
}
\long\def\@flip#1#2[#3]{%
\csuse{flip@\string#1}[#3]{#2}%
}
\makeatother
\newcommand\foo[2][none]{%
\par
Required argument: #2\\
Optional argument: #1%
}
\begin{document}
Normal use:
\foo{blah}
\foo[option]{asdf}
Now we can flip the arguments:
\flip\foo
\foo{blah}
\foo{asdf}[option]
\end{document}
Nunca usei LyX antes, mas consegui inserir meu código no preâmbulo e obter o mesmo efeito.
Observe que isso \flip
não respeita a falta de \long
uma macro (ou seja, macros definidas por meio da \def
família sem \long
ou definidas por meio de \newcommand*
). É provável que isso leve a erros confusos em alguns casos. É possível lidar com isso da mesma forma que etoolbox
corrige macros, mas não pareceu valer a pena fazer isso para esta resposta.
Também seria possível definir \flip
tal que não redefinisse seu argumento, mas sim tal que \flip\foo{required}[optional]
se expandisse para \foo[optional]{required}
. Algo como (não testado)
\long\def\flip#1#2[#3]{#1[#3]{#2}}
o que transformaria o argumento opcional em obrigatório, mas se você não tiver o argumento opcional, não há razão para usar o \flip
.
Concluindo, é possível fazer isso, mas provavelmente não deveria fazê-lo.