即使在 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類型環境中,令牌已被讀入,並且它們的目錄代碼在輸入巨集之前已被設定。透過使用\scantokens,目錄代碼基本上被重新分配。

有關使用\scantokens@egreg 的更多詳細信息,在回答我的問題時有一個很好的解釋:有人可以進一步闡明擴充功能、catcode 和 scantokens…嗎?

相關內容