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