Unterstriche in Parametern auch in NewEnviron-Umgebungen beibehalten

Unterstriche in Parametern auch in NewEnviron-Umgebungen beibehalten

ich folgtediese Antworteinen Befehl so zu definieren, dass Unterstriche in seinen Parametern beibehalten werden können.

Dies funktioniert jedoch nicht, wenn der Befehl innerhalb einer Umgebung aufgerufen wird, die mit „ NewEnvironfrom“ definiert wurde 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}

Dies ergibt

Bildbeschreibung hier eingeben

Angenommen, ich kann nicht ohne environ(ich versuche tatsächlich seit etwa einer Stunde, es aus meinem eigentlichen Dokument zu entfernen, ohne Erfolg), wie kann ich das beheben?

Antwort1

Die Lösung hängt vom Alphabet ab, das für die Variablen verwendet wird. Wenn es sich um Bezeichner mit Groß- und Kleinbuchstaben, Ziffern, Unterstrichen und einigen anderen harmlosen Symbolen handelt (mit Kategoriecode 12/andere, als Satzzeichen), \detokenizekönnen die Kategoriecodes der Bezeichner auf Token mit Kategoriecode 12 (dasselbe wie Ziffern) normalisiert werden:

\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}

Ergebnis

Antwort2

Es scheint, als wäre dies auch eine Situation, in der Folgendes \scantokensgut passen könnte:

\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}

Das Problem mit Ihrem Original ist \NewEnviron, dass in einer Typumgebung die Token bereits eingelesen wurden und ihre Catcodes bereits festgelegt sind, bevor sie Ihrem Makro zugeführt werden. Durch die Verwendung \scantokenswerden die Catcodes im Wesentlichen neu zugewiesen.

Weitere Einzelheiten zur Verwendung \scantokensvon @egreg finden Sie in einer schönen Erklärung als Antwort auf meine Frage unterKönnte jemand Erweiterung, Catcodes und Scantokens näher erläutern …?

verwandte Informationen