LyX | cambiar el orden de los argumentos de la macro

LyX | cambiar el orden de los argumentos de la macro

En LyX, ¿es posible cambiar el orden de los argumentos requeridos y de opción de una macro?

Quiero que el argumento de opción venga después del argumento requerido en esta macro.

Si es posible, ¿cómo puedo hacerlo?

Captura de pantalla de la macro

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 \flipque 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\foouna vez y se redefinirá \foopara 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}

ingrese la descripción de la imagen aquí

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 \flipno respeta la falta de \longen una macro (es decir, macros definidas a través de la \deffamilia sin \longo 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 etoolboxparchear macros, pero no parecía que valiera la pena hacerlo para esta respuesta.

También sería posible definirlo \flipde 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.

información relacionada