我跟著這個答案定義一個指令,使其參數中的底線可以保留。
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…嗎?