¿Es posible ejecutar un comando almacenado como texto en una variable?

¿Es posible ejecutar un comando almacenado como texto en una variable?

Tengo algunas expresiones complicadas con muchos comandos anidados con los que es difícil trabajar. Para resolver esto, escribí un analizador usando pgfparser que crea las expresiones por mí. Luego puedo copiar el resultado nuevamente en LaTeX y genera lo que necesito.

Me preguntaba si podría automatizar esto. Puedo almacenar el texto (una secuencia de comandos) en una variable pero luego no puedo encontrar una manera de ejecutar los comandos en la variable

El analizador en sí no es de mucho interés, pero como mwe, esta es una versión simplificada de lo que tengo:

\documentclass{standalone}
\usepackage[T1]{fontenc}
\usepackage{pgf}
\usepgfmodule{parser}

\pgfparserdef{mweparser}{initial}{\meaning [}{\textbackslash overline\{}
\pgfparserdef{mweparser}{initial}{\meaning ]}{\}}
\pgfparserdef{mweparser}{initial}{\meaning A}{A}
\pgfparserdef{mweparser}{initial}{subscript character _}{\_\{\pgfparserswitch{subscript}}
\pgfparserdef{mweparser}{subscript}{\meaning +}{\textbackslash hat\{\pgfparserswitch{edgename}}
\pgfparserdef{mweparser}{subscript}{\meaning -}{\textbackslash check\{\pgfparserswitch{edgename}}
\pgfparserdef{mweparser}{edgename}{\meaning a}{a\}\pgfparserswitch{subscript}}
\pgfparserdef{mweparser}{edgename}{\meaning b}{b\}\pgfparserswitch{subscript}}
\pgfparserdef{mweparser}{subscript}{subscript character _}{\}\pgfparserswitch{initial}}
\pgfparserdef{mweparser}{all}{the character ;}{\pgfparserswitch{final}}

\begin{document}
    \pgfparserparse{mweparser}[A_+a-b-a_[A_+a+b-a_]];%
\end{document}

Esto generará:

\overline{A_{\hat{a}\check{b}\check{a}}\overline{A_{\hat{a}\hat{b}\check{a}}}}

Que es lo que me gustaría ejecutar (en modo matemático). Puedo almacenar este texto en una variable pero no veo cómo puedo ejecutarlo.

Soy nuevo en esto así que pido disculpas si he hecho algo mal.

Respuesta1

Realmente no sé cómo funciona el analizador PGF, pero lo que obtienes con tu código es una cadena que no es lo que quieres: \textbackslashno es una barra invertida sino un comando para imprimir una.

Aquí hay una implementación con l3regex, el analizador de expresiones regulares de LaTeX3; El resultado deseado se ha agregado para compararlo con lo que hacen las macros.

\documentclass[border=3,varwidth]{standalone}
\usepackage[T1]{fontenc}
\usepackage{xparse,l3regex}

\ExplSyntaxOn
\NewDocumentCommand{\term}{m}
 {
  \dquick_term:n { #1 }
 }

\tl_new:N \l__dquick_input_tl

\cs_new_protected:Npn \dquick_term:n #1
 {
  \tl_set:Nn \l__dquick_input_tl { #1 }
  %% subscripts (works so long you don't have nested subscripts)
  \regex_replace_all:nnN { \_(.*?)\_ } { \cD\_\cB\{\1\cE\} } \l__dquick_input_tl
  %% [ becomes \overline\bgroup (nesting is allowed)
  \regex_replace_all:nnN { \[ } { \c{overline}\c{bgroup} } \l__dquick_input_tl
  %% ] becomes \egroup
  \regex_replace_all:nnN { \] } { \c{egroup} } \l__dquick_input_tl
  %% +<char> becomes \hat{<char>}
  \regex_replace_all:nnN { \+(.) } { \c{hat}\cB\{\1\cE\} } \l__dquick_input_tl
  %% -<char> becomes \check{<char>}
  \regex_replace_all:nnN { \-(.) } { \c{check}\cB\{\1\cE\} } \l__dquick_input_tl
  $\tl_use:N \l__dquick_input_tl$
 }
\ExplSyntaxOff

\begin{document}
\term{[G_+a-b-c_[H_+a+a-c_]]}

$\overline{G_{\hat{a}\check{b}\check{c}}\overline{H_{\hat{a}\hat{a}\check{c}}}}$
\end{document}

ingrese la descripción de la imagen aquí


Una versión ligeramente diferente que permite especificar caracteres delimitadores (deben ser diferentes) para macros anidadas, que se muestra aquí con \overline.

\documentclass[border=3,varwidth]{standalone}
\usepackage[T1]{fontenc}
\usepackage{xparse,l3regex}

\ExplSyntaxOn
\NewDocumentCommand{\term}{m}
 {
  \dquick_term:n { #1 }
 }

\tl_new:N \l__dquick_input_tl

\cs_new_protected:Npn \dquick_term:n #1
 {
  \tl_set:Nn \l__dquick_input_tl { #1 }
  %% subscripts (works so long you don't have nested subscripts)
  \regex_replace_all:nnN { \_(.*?)\_ } { \cD\_\cB\{\1\cE\} } \l__dquick_input_tl
  %% brackets can be nested, this requires a slower routine
  \dquick_replace_nested:nnn { \[ } { \] } { overline }
  %% +<char> becomes \hat{<char>}
  \regex_replace_all:nnN { \+(.) } { \c{hat}\cB\{\1\cE\} } \l__dquick_input_tl
  %% -<char> becomes \check{<char>}
  \regex_replace_all:nnN { \-(.) } { \c{check}\cB\{\1\cE\} } \l__dquick_input_tl
  \tl_use:N \l__dquick_input_tl
 }

\cs_new_protected:Npn \dquick_replace_nested:nnn #1 #2 #3
 {% #1 is the left delimiter
  % #2 is the right delimiter
  % #3 is the macro name for replacement
  \regex_match:nVT { #1 ( [^#1#2]*? ) #2 } \l__dquick_input_tl
   {
    \regex_replace_all:nnN { #1 ( [^#1#2]*? ) #2 } { \c{#3}\cB\{\1\cE\} } \l__dquick_input_tl
    \dquick_replace_nested:nnn { #1 } { #2 } { #3 }
   }
 }
\cs_generate_variant:Nn \regex_match:nnT { nV }

\ExplSyntaxOff

\begin{document}
$\term{[G_+a-b-c_[H_+a+a-c_]]}$

$\overline{G_{\hat{a}\check{b}\check{c}}\overline{H_{\hat{a}\hat{a}\check{c}}}}$
\end{document}

información relacionada