Mantener guiones bajos en los parámetros incluso dentro de entornos NewEnviron

Mantener guiones bajos en los parámetros incluso dentro de entornos NewEnviron

Seguíesta respuestapara definir un comando de modo que se puedan mantener los guiones bajos en su parámetro.

Sin embargo, esto no funciona si el comando se llama dentro de un entorno definido con NewEnvironfrom environ:

\documentclass[a4paper]{scrreprt}
\newcommand{\cmd}{\begingroup
  \catcode`_=12 \cmdint}
\newcommand{\cmdint}[1]{%
  \texttt{#1}%
  \endgroup
}

\newenvironment{wrap}{}{}
\usepackage{environ}
\NewEnviron{wrap2}{\BODY}

\begin{document}
\cmd{some_test}

\begin{wrap}
  \cmd{some_test}
\end{wrap}

\begin{wrap2}
  \cmd{some_test}
\end{wrap2}
\end{document}

Esto se compila a

ingrese la descripción de la imagen aquí

Digamos que no puedo prescindir de él environ(de hecho, he estado luchando durante aproximadamente una hora para deshacerme de él en mi documento real, sin éxito), ¿cómo puedo solucionar este problema?

Respuesta1

La solución depende del alfabeto utilizado para las variables. Si se trata de identificadores con letras mayúsculas y minúsculas, dígitos, guiones bajos y algunos otros símbolos inofensivos (con código de categoría 12/otros, como caracteres de puntuación), \detokenizese pueden utilizar para normalizar los códigos de categoría del identificador al token con código de categoría 12 ( igual que los dígitos):

\documentclass[a4paper]{scrreprt}

\newcommand*{\cmd}[1]{\texttt{\detokenize{#1}}}

\newenvironment{wrap}{}{}
\usepackage{environ}
\NewEnviron{wrap2}{\BODY}

\begin{document}
\cmd{some_test}

\begin{wrap}
  \cmd{some_test}
\end{wrap}

\begin{wrap2}
  \cmd{some_test}
\end{wrap2}
\end{document}

Resultado

Respuesta2

Parece que esta también es una situación en la que \scantokenspodría entrar muy bien:

\documentclass[a4paper]{scrreprt}
\newcommand{\cmd}{\begingroup
  \catcode`_=12 \cmdint}
\newcommand{\cmdint}[1]{%
  \texttt{\scantokens{#1\noexpand}}%
  \endgroup
}

\newenvironment{wrap}{}{}
\usepackage{environ}
\NewEnviron{wrap2}{\BODY}

\begin{document}
\cmd{some_test}

\begin{wrap}
  \cmd{some_test}
\end{wrap}

\begin{wrap2}
  \cmd{some_test}
\end{wrap2}
\end{document}

El problema con su original es que dentro de un \NewEnvironentorno de tipo, los tokens ya se han leído y sus códigos cat ya están configurados antes de que lleguen a su macro. Al usar \scantokens, los catcodes esencialmente se reasignan.

Para obtener más detalles sobre el uso \scantokensde @egreg, tiene una buena explicación en respuesta a mi pregunta en¿Alguien podría aclarar más la expansión, los catcodes y los scantokens…?

información relacionada