선택적 인수가 제대로 작동하지 않는 그대로의 환경

선택적 인수가 제대로 작동하지 않는 그대로의 환경

[선택적 인수를 실제로 사용하려는 위치를 표시하기 위해 편집됨]

이 질문에 대한 답변은 다음에서 찾을 수 있습니다.축어적 콘텐츠가 있는 환경에 선택적 인수를 전달하는 방법은 무엇입니까?, 하지만 그 답변을 내 문제에 적용하는 데 어려움을 겪고 있습니다. 중복된 것으로 판단되면 해당 쿼리를 삭제하겠습니다.

선택적 인수(아래 MWE의 vb)를 사용하는 축어적 환경을 활용하는 경우 선택적 인수가 지정되지 않은 경우 환경의 첫 번째 토큰이 환경 외부에서 실행되는 경우가 있습니다.

\documentclass{article}
\usepackage{verbatim}
\parskip 1ex\parindent 0em

\makeatletter
\newenvironment{va}{%
  \def\verbatim@processline{%
    {\setbox0=\hbox{\the\verbatim@line}%
    \hsize=\wd0 \the\verbatim@line\par}}%
  \setbox0=\vbox\bgroup \verbatim
}
{%
  \endverbatim
  \unskip\setbox0=\lastbox %
  \egroup
  \usebox0
}

\newenvironment{vb}[1][]{%
  \def\verbatim@processline{%
    {\setbox0=\hbox{\the\verbatim@line}%
    \hsize=\wd0 \the\verbatim@line\par}}%
  \setbox0=\vbox\bgroup #1 \verbatim
}
{%
  \endverbatim
  \unskip\setbox0=\lastbox %
  \egroup
  \usebox0
}

\makeatother
\begin{document}

I created two environments based on \verb|boxedverbatim| environment.
Environment \verb|va| takes no arguments.  Environment \verb|vb| is
identical but takes an optional argument (which is not actually used for
anything in this MWE). In all the following cases, no optional argument
is actually passed to the \verb|vb| environment

Starting either environment with a letter works:

\begin{va}I will set \def\x{1}\end{va}

\begin{vb}I will set \def\x{1}\end{vb}

But if I start the environments with a command like \verb|\Huge|, the
\verb|vb| environment executes that command outside the environment, even
though it was not in brackets:

\begin{va}\Huge I will set \def\x{1}\end{va}

\begin{vb}\Huge I will set \def\x{1}\end{vb}

If I start the verbatim with a \verb|\def|, the \verb|vb|
environment breaks

\begin{va}\def\x{1}\end{va}

%\begin{vb}\def\x{1}\end{vb}

\end{document}

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

답변1

모든 축어 명령의 경우 인수를 구문 분석하기 전에 catcode 체계를 전환해야 합니다. 문자가 토큰화되면 문자로 설정된 catcode 값은 생성된 토큰에 영향을 주지 않고 파일 입력에서 토큰이 생성되는 방식만 결정하므로 아무런 효과가 없습니다.

~ 안에

\begin{vb}\Huge

\vb다음을 본다토큰그것이 인지 확인하기 위해 [. TeX는 다음 토큰을 생성하기 위해 파일을 읽어야 하므로 cs 토큰을 모두 읽고 \Huge생성합니다. 그 후에는 모든 catcode 설정이 파일에서 읽은 문자에만 영향을 줍니다. 그들은 에 영향을 미치지 않습니다 Huge.

catcode를 설정한 후 인수를 구문 분석하면 됩니다.

\newcommand\innervb[1][]{}

\newenvironment{vb}{%
  \def\verbatim@processline{%
    {\setbox0=\hbox{\the\verbatim@line}%
    \hsize=\wd0 \the\verbatim@line\par}}%
  \setbox0=\vbox\bgroup \verbatim\innervb
}
{%
  \endverbatim
  \unskip\setbox0=\lastbox %
  \egroup
  \usebox0
}

관련 정보