xparse がオプション引数の行末文字を無視しないようにする

xparse がオプション引数の行末文字を無視しないようにする

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}

ここに画像の説明を入力してください

関連情報