
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}
出力
アブX
私が期待するところ
ザブX
すでにあるこの質問は似ていますが、アクティブ文字を使用しません。また、その質問のコメントはここでは役に立ちません。引数指定子の前に を付けても機能せず、!
新しいバージョンでも機能しませんxparse
(私のバージョンは ですxparse 2019-05-28
)。
この問題を回避する方法はありますか?
編集:私の使用例は、最初にオプションのセットアップがある特別な verbatim のような環境を持つことです。問題は、最初の行の終わり/最初の^^M
行にあるものをすべて破棄するために、その行の終わりまで先読みする必要があることです (通常は空です)。これは、オプションの引数がある場合は問題なく機能しますが、オプションの引数がない場合、実際のコードの最初の行が破棄される行と見なされ、望ましくありません。
答え1
ご要望に応じて、回答として簡単なモックアップを作成しました。オプションの引数が存在するかどうかを確認する前に、まずカテゴリ コードを変更し、次に引数の取得用に切り替えて、実際の環境に合わせて catcodes をリセットする必要があります。
次の例では、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}