LyX | alterar a ordem dos argumentos da macro

LyX | alterar a ordem dos argumentos da macro

No LyX, é possível alterar a ordem dos argumentos obrigatórios e de opção de uma macro?

Quero fazer com que o argumento da opção venha depois do argumento obrigatório nesta macro.

Se for possível, como posso fazer isso?

Captura de tela da macro

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 \flipque 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\foouma vez e ele será redefinido \foopara 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}

insira a descrição da imagem aqui

Nunca usei LyX antes, mas consegui inserir meu código no preâmbulo e obter o mesmo efeito.

Observe que isso \flipnão respeita a falta de \longuma macro (ou seja, macros definidas por meio da \deffamília sem \longou 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 etoolboxcorrige macros, mas não pareceu valer a pena fazer isso para esta resposta.

Também seria possível definir \fliptal 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.

informação relacionada