NewEnviron 환경 내에서도 매개변수에 밑줄 유지

NewEnviron 환경 내에서도 매개변수에 밑줄 유지

나는 팔로우했다이 답변매개변수의 밑줄이 유지될 수 있도록 명령을 정의합니다.

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}

이것은 다음과 같이 컴파일됩니다.

여기에 이미지 설명을 입력하세요

없이는 할 수 없다고 말하면 environ(실제로 실제 문서에서 이를 제거하기 위해 약 한 시간 동안 노력했지만 성공하지 못했습니다), 이 문제를 어떻게 해결할 수 있습니까?

답변1

솔루션은 변수에 사용되는 알파벳에 따라 다릅니다. 이것이 대문자와 소문자, 숫자, 밑줄 및 기타 무해한 기호(구두점 문자와 같은 범주 코드 12/기타 포함)가 포함된 식별자인 경우 \detokenize식별자의 범주 코드를 범주 코드 12가 있는 토큰으로 정규화하는 데 사용할 수 있습니다( 숫자와 동일):

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

결과

답변2

\scantokens이것은 또한 잘 들어올 수 있는 상황인 것 같습니다 .

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

원본의 문제점은 \NewEnviron유형 환경 내에서 토큰이 이미 읽혀졌고 해당 catcode가 매크로에 공급되기 전에 이미 설정되어 있다는 것입니다. 를 사용하면 \scantokens기본적으로 catcode가 재할당됩니다.

@egreg 사용에 대한 자세한 내용은 \scantokens내 질문에 대한 좋은 설명이 있습니다.누군가 확장, 캣코드, 스캔토큰을 더 자세히 설명할 수 있을까요?

관련 정보