
xparse
선택적 인수를 사용하여 새 환경을 정의하는 데 을 사용하면 O{}
다음 예제 문서에서 볼 수 있듯이 첫 번째 줄 끝 문자가 깨집니다.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Npn \__my_end_of_line: { X }
\NewDocumentEnvironment{mycode}{ !O{} }{
\char_set_catcode_active:N \^^M
\char_set_active_eq:nN {`\^^M} \__my_end_of_line:
}{}
\ExplSyntaxOff
\begin{document}
\begin{mycode}
abc
\end{mycode}
\end{document}
출력
abcX
내가 예상했던 곳
XabcX
이미 있습니다이 질문비슷하지만 활성 문자를 사용하지 않습니다. 또한 해당 질문의 의견은 여기서 도움이 되지 않습니다. 인수 지정자 접두사에 !
작업이 붙지도 않고 최신 버전에서도 작동하지 않습니다 xparse
(제 버전은 입니다 xparse 2019-05-28
).
이 문제를 해결할 수 있는 방법이 있습니까?
편집하다:내 사용 사례는 처음에 일부 선택적 설정이 포함된 특별한 축어적 환경을 갖는 것입니다. 문제는 첫 번째 줄의 끝을 찾을 때까지 미리 읽어야 한다는 것입니다/첫 번째 줄은 ^^M
해당 줄에 있는 내용을 모두 삭제합니다(보통 비어 있음). 선택적 인수가 있으면 제대로 작동하지만 선택적 인수가 없으면 코드의 첫 번째 실제 줄은 삭제될 줄로 간주되어 원하지 않습니다.
답변1
요청하신대로 빠른 모형을 답변으로 드렸습니다. 선택적 인수의 존재를 확인하기 전에 먼저 범주 코드를 변경한 다음 인수 가져오기를 위해 다시 전환하고 실제 환경에 대한 catcode를 재설정해야 합니다.
다음 예에서는 LaTeX2e에서 수행되는 것처럼 선택적 인수에 대해 매우 간단한 작업을 수행하지만 대괄호 균형 조정이 없기 때문에 O{}
인수 보다 열등합니다. xparse
를 수행하여 이를 피할 수 있지만 \NewDocumentCommand \__mycode_parse_arg:w { !O{} } { ... }
코드 \NewDocumentCommand
수준 매크로(따라서 이름)에는 사용하면 안 됩니다.
\__mycode_end_of_line:
나는 그것이 작동하고 있음을 보여주기 위해 의 정의를 변경하도록 선택적 인수를 설정했습니다 .
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Npn \__mycode_end_of_line: { X }
\cs_new_protected:Npn \__mycode_real_begin:
{
\__mycode_catcode_setup:
\char_set_active_eq:nN { `\^^M } \__mycode_end_of_line:
}
\cs_new_protected:Npn \__mycode_parse_arg:w [ #1 ]
{
% do whatever with the optional argument
\cs_set_protected:Npn \__mycode_end_of_line: { #1 }
\__mycode_real_begin:
}
\cs_new_protected:Npn \__mycode_catcode_setup:
{
\char_set_catcode_active:N \^^M
}
\NewDocumentEnvironment { mycode } {}
{
\group_begin:
\__mycode_catcode_setup:
\peek_meaning:NTF [
{
\group_end:
\__mycode_parse_arg:w
}
{
\group_end:
\__mycode_real_begin:
}
}
{}
\ExplSyntaxOff
\begin{document}
\begin{mycode}
abc
\end{mycode}
\begin{mycode}[Y]
abc
\end{mycode}
\end{document}