使 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}

哪個輸出

abcX

我期望的地方

XabcX

已經有這個問題類似,但不使用活動字元。此外,該問題中的評論在這裡沒有幫助。參數說明符前綴既不能!工作,也不能在較新的xparse版本中工作(我的版本是xparse 2019-05-28)。

有辦法解決這個問題嗎?


編輯:我的用例是擁有一個特殊的類似逐字記錄的環境,並在開始時進行一些可選設定。問題是我需要提前閱讀,直到找到第一行的末尾/第一行^^M以丟棄該行上的任何內容(通常是空的)。如果存在可選參數,則此方法可以正常工作,但如果沒有可選參數,則第一行實際程式碼將被視為要丟棄的行,這是不需要的。

答案1

根據要求,我的快速模型作為答案。在檢查可選參數是否存在之前,您需要先更改類別代碼,然後將其切換回參數抓取並重置實際環境的類別代碼。

下面的範例對可選參數進行了非常簡單的抓取,就像在 LaTeX2e 中所做的那樣,但這不如O{}from 的參數,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}

在此輸入影像描述

相關內容