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 „ NewEnviron
from“ 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
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), \detokenize
kö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}
Antwort2
Es scheint, als wäre dies auch eine Situation, in der Folgendes \scantokens
gut 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 \scantokens
werden die Catcodes im Wesentlichen neu zugewiesen.
Weitere Einzelheiten zur Verwendung \scantokens
von @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 …?