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 NewEnviron
from 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
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), \detokenize
se 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}
Respuesta2
Parece que esta también es una situación en la que \scantokens
podrí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 \NewEnviron
entorno 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 \scantokens
de @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…?