Pasar patrones de argumentos complicados a un nuevo comando

Pasar patrones de argumentos complicados a un nuevo comando

Estoy usando el changespaquete bonito. Que básicamente proporciona tres comandos \added, \deletedy \replaced. Debido a la estructura y al hecho de que requiere argumentos opcionales, creo que es posible simplificar su uso. Seguí la xparsedocumentación del paquete para ver si podía crear un comando que simplificara la llamada.

A continuación se muestra un MWE. Pude crear dos versiones del comando, una deletey otra replacedependiendo de la cantidad de argumentos. Pero rápidamente me quedé sin fuerzas.

En resumen, estas son las asignaciones que me gustaría lograr al definir un nuevo comando \ME:

  • \ME{deleted}mapas para\deleted[id=Me]{deleted}
  • \ME[added]se asigna a \added[id=Me]{added}(o al menos es equivalente a \ME[added]{})
  • \ME[replacing]{replaced}mapas para\replaced[id=Me]{replacing}{replaced}
  • \ME[comment]{deleted}mapas para\deleted[id=Me, remark={comment}]{deleted}
  • \ME[comment][added]mapas a \added[id=Me,remark={comment}]{added}(o equivalente a \ME[comment][added]{})
  • \ME[comment][replacing]{replaced}mapas a \replaced[id=Me, remark={comment}]{replacing}{replaced}.

MWE:

\documentclass{article}
\usepackage{changes}
\usepackage{xparse}

\definechangesauthor[name={MyName},color=blue]{ME}

\DeclareDocumentCommand \ME { o m }{%
  \IfNoValueTF{#1}{
    \deleted[id=ME]{#2}}{
    \replaced[id=ME]{#1}{#2}
}
}


%\newcommand{\ME}[1]{\deleted[id=ME]{#1}} %ok

%\newcommand{\ME}[1][]{\added[id=ME]{#1}} % not working

\begin{document}

\added[id=ME,remark={added}]{added} 

\deleted[id=ME,remark={deleted}]{deleted}

\replaced[id=ME,remark={replaced}]{replacing}{replaced}

\ME{aaa}       % ok
\ME[aaa]{bbb}  % ok
\ME[aaa]{}     % ok

\ME{remark}[aaa]{} 

\end{document}

EDITAR:Resumen, hasta ahora. Gracias a @AxelBall y @ChristianHupfer obtengo esta sintaxis, que es casi ideal (excepto por comentarios puros) con la implementación a continuación:

\ME{addonly}

\ME{add}<deleted>

\ME<deleteonly>

\ME[addonlycommet]{addonly}

\ME[adddeletecomment]{add}<delete>

\ME[deleteonlycomment]<deleteonly>

text\ME[commentonly]

Y por último las variantes estrella, que añaden iden la revisión:

\ME*[deleteonlycomment]<deleteonly>

código:

\NewDocumentCommand{\ME}{sogd<>}{
\IfBooleanTF#1{
\IfNoValueTF{#2}{\IfNoValueTF{#3}{\IfNoValueF{#4}{\deleted[id=ME]{#4}}}{\IfNoValueTF{#4}{\added[id=ME]{#3}}{\replaced[id=ME]{#3}{#4}}}}{\IfNoValueTF{#3}{\IfNoValueTF{#4}{\added[id=ME,remark={#2}]{}}{\deleted[id=ME, remark={#2}]{#4}}}{\IfNoValueTF{#4}{\added[id=ME,remark={#2}]{#3}}{\replaced[id=ME, remark={#2}]{#3}{#4}}}}
}{
\IfNoValueTF{#2}{\IfNoValueTF{#3}{\IfNoValueF{#4}{\deleted{#4}}}{\IfNoValueTF{#4}{\added{#3}}{\replaced{#3}{#4}}}}{\IfNoValueTF{#3}{\IfNoValueTF{#4}{\added[remark={#2}]{}}{\deleted[remark={#2}]{#4}}}{\IfNoValueTF{#4}{\added[remark={#2}]{#3}}{\replaced[remark={#2}]{#3}{#4}}}}
}
}

Respuesta1

Aquí definimos un comando \MEque toma tres argumentos opcionales:

\ME[optional comment]<deleted content>(added content)

Se debe dar uno o ambos o el <deleted>comando no hará nada (pero no se generará ningún error/advertencia).(added)

(EDITADOpara corregir el comportamiento de reemplazo).

\documentclass{standalone}
\usepackage{changes}
\usepackage{xparse}

\definechangesauthor[name={MyName},color=blue]{ME}

\NewDocumentCommand{\ME}{od<>d()}{%
  \IfNoValueTF{#1}{%
    \IfNoValueTF{#2}{%
      \IfNoValueF{#3}{%
        % (#3)
        \added[id=ME]{#3}%
      }%
    }{%
      \IfNoValueTF{#3}{%
        % <#2>
        \deleted[id=ME]{#2}%
      }{% <#2>(#3)
        \replaced[id=ME]{#3}{#2}%
      }%
    }%
  }{%
    \IfNoValueTF{#2}{%
      \IfNoValueF{#3}{%
        % [#1](#3)
        \added[id=ME,remark={#1}]{#3}%
      }%
    }{%
      \IfNoValueTF{#3}{%
        % [#1]<#2>
        \deleted[id=ME, remark={#1}]{#2}%
      }{% [#1]<#2>(#3)
        \replaced[id=ME, remark={#1}]{#3}{#2}%
      }%
    }%
  }%
}

\begin{document}

\begin{tabular}{ll}
\deleted[id=ME]{deleted} 
& \ME<deleted> \\
\added[id=ME]{added}
& \ME(added) \\
\replaced[id=ME]{replacing}{replaced}
& \ME<replaced>(replacing)\\
\deleted[id=ME, remark={comment}]{deleted}
& \ME[comment]<deleted> \\
\added[id=ME,remark={comment}]{added}
& \ME[comment](added)\\
\replaced[id=ME, remark={comment}]{replacing}{replaced}
& \ME[comment]<replaced>(replacing)\\
\end{tabular}
\end{document}

Salida del primer ejemplo de código

En caso de que le preocupe el uso de paréntesis, no lo esté. xparsese adapta perfectamente bien si utiliza paréntesis equilibrados dentro del tercer argumento; si quieres uno desequilibrado, envuélvelo entre llaves: \ME(like {(} this).

Si realmente desea utilizar llaves para el último argumento, puede utilizar el gespecificador:

\NewDocumentCommand{\ME}{od<>g}{...}

EDITAR

Bien, esto debería hacer lo que quieres:

\documentclass[border=12pt]{standalone}
\usepackage{changes}
\usepackage{xparse}

\definechangesauthor[name={MyName},color=blue]{ME}

\NewDocumentCommand{\ME}{ogd<>}{%
  \IfNoValueTF{#1}{%
    \IfNoValueTF{#2}{%
      \IfNoValueF{#3}{%
        % <#3>
        \deleted[id=ME]{#3}%
      }%
    }{%
      \IfNoValueTF{#3}{%
        % {#2}
        \added[id=ME]{#2}%
      }{% {#2}<#3>
        \replaced[id=ME]{#2}{#3}%
      }%
    }%
  }{%
    \IfNoValueTF{#2}{%
      \IfNoValueTF{#3}{%
        % [1]
        \added[id=ME,remark={#1}]{}%
      }{% [#1]<#3>
        \deleted[id=ME, remark={#1}]{#3}%
      }%
    }{%
      \IfNoValueTF{#3}{%
        % [#1]{#2}
        \added[id=ME,remark={#1}]{#2}%
      }{% [#1]{#2}<#3>
        \replaced[id=ME, remark={#1}]{#2}{#3}%
      }%
    }%
  }%
}

\begin{document}

\begin{tabular}{ll}
\verb|\ME<deleted>|
& \ME<deleted> \\
\verb|\ME{added}|
& \ME{added} \\
\verb|\ME{added}<deleted>|
& \ME{added}<deleted>\\
\verb|\ME[comment]|
& \ME[comment]\\
\verb|\ME[comment]<deleted>|
& \ME[comment]<deleted> \\
\verb|\ME[comment]{added}|
& \ME[comment]{added}\\
\verb|\ME[comment]{added}<deleted>|
& \ME[comment]{added}<deleted>\\
\end{tabular}

\end{document}

Producción:

Salida del segundo ejemplo de código

Respuesta2

De hecho, esto utiliza tres argumentos opcionales:

\ME[operation driver]<operation argument>[operation comment]

Se puede omitir cualquiera de ellos, en este caso no pasaría nada.

\documentclass{article}
\usepackage{changes}
\usepackage{xstring}
\usepackage{xparse}

\definechangesauthor[name={MyName},color=blue]{ME}

\DeclareDocumentCommand \MEOrig{ o m }{%
  \IfNoValueTF{#1}{
    \deleted[id=ME]{#2}}{
    \replaced[id=ME]{#1}{#2}
}
}



\DeclareDocumentCommand{\ME}{oD<>{}o}{%
  \IfNoValueTF{#1}{%
    \IfValueTF{#3}{%
      \deleted[id=ME,remark={#3}]{#2}%
    }{%
      \deleted[id=ME]{#2}%
    }%  
  }{%
    \IfStrEq{#1}{added}{%
      \IfValueTF{#2}{%
        \IfValueTF{#3}{%
          \added[id=ME,remark={#3}]{#2}%
        }{%
          \added[id=ME]{#2}%
        }%
      }{%
        \IfValueTF{#3}{%
          \added[id=ME,remark={#3}]{}%
        }{%
          \added[id=ME]{}%
        }%
      }%
    }{% 
      \IfStrEq{#1}{replacing}{%
        \IfValueTF{#3}{%
          \replaced[id=ME,remark={#3}]{replacing}{#2}%
        }{%
          \replaced[id=ME]{replacing}{#2}%
        }%
      }{%
        % Do nothing in here
      }%      
    }% End of IfStrEq{#1}{added}
  }% End of IfNoValueTF{#1}
}







\begin{document}



\added[id=ME,remark={added}]{added} 

\deleted[id=ME,remark={deleted}]{deleted}

\replaced[id=ME,remark={replaced}]{replacing}{replaced}

\ME<aaa>       % ok
\ME[aaa]<bbb>  % ok
\ME[aaa]     % ok

\ME<remark>[aaa]

\end{document}

información relacionada