Respuesta1
No recomiendo hacer esto porque resultará confuso para cualquiera que lea su documento. Tampoco funcionará para todas las macros, particularmente aquellas que juegan con códigos de categoría antes de leer sus argumentos. Dicho esto, es posible.
Aquí hay algo de código LaTeX que define una macro \flip
que invertirá los argumentos requeridos y opcionales de una macro que está definida para tener exactamente un argumento requerido y un 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 ejemplo, dada la macro
\newcommand\foo[2][none]{%
\par
Required argument: #2\\
Optional argument: #1%
}
puede escribir \flip\foo
una vez y se redefinirá \foo
para tomar un argumento obligatorio seguido de un argumento opcional. Aquí hay un documento completo que ilustra esto.
\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 antes había usado LyX, pero pude insertar mi código en el preámbulo y lograr el mismo efecto.
Tenga en cuenta que \flip
no respeta la falta de \long
en una macro (es decir, macros definidas a través de la \def
familia sin \long
o definidas a través de \newcommand*
). Es probable que esto dé lugar a errores confusos en algunos casos. Es posible lidiar con esto de manera similar a cómo etoolbox
parchear macros, pero no parecía que valiera la pena hacerlo para esta respuesta.
También sería posible definirlo \flip
de manera que no redefiniera su argumento, sino que \flip\foo{required}[optional]
se expandiera a \foo[optional]{required}
. Algo como (no probado)
\long\def\flip#1#2[#3]{#1[#3]{#2}}
lo que convertiría el argumento opcional en uno obligatorio, pero si no tiene el argumento opcional, no hay razón para usar el archivo \flip
.
En conclusión, es posible hacerlo, pero probablemente no deberías hacerlo.