我需要一个命令来删除后面的所有标记(数字、逗号、空格或换行符),并在遇到其他标记时停止。我可以通过嵌套大量 来实现这一点\peek_charcode_remove_ignore_spaces:NTF
,但是有没有更优雅的方式来映射(例如在 clist 上)?
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\clist_const:Nn\c_uf_page_clist{1,2,3,4,5,6,7,8,9,0,{,}}
\cs_new:Nn\uf_eatline: {
\peek_charcode_remove_ignore_spaces:NTF 0 { \uf_eatline: }
{
\peek_charcode_remove_ignore_spaces:NTF 1 { \uf_eatline: }
{
\peek_charcode_remove_ignore_spaces:NTF 6 { \uf_eatline: }
{
\peek_charcode_remove_ignore_spaces:NTF , { \uf_eatline: }
{
%and more nesting ...
}
}
}
}
}
\cs_set_eq:NN\eatline\uf_eatline:
\ExplSyntaxOff
\newcommand\see[2]{, \emph{see} #1}
\begin{document}
\begin{itemize}
\item Texta\eatline116,
153
\item Textb\eatline\see{Texta}{162}
\end{itemize}
Wanted output:
\begin{itemize}
\item Texta
\item Textb\see{Texta}{162}
\end{itemize}
\end{document}
答案1
如果您不希望\eatline
在以 结尾的组内被调用,}
并且想要跳过空格,那么您可以抓取下一个标记作为参数,检查它并做出决定。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\eatline}{m}
{
\uf_eatline:n { #1 }
}
\cs_new_protected:Nn \uf_eatline:n
{
\regex_match:nnTF { [0-9,] } { #1 }
{
\uf_eatline:n
}
{ #1 }
}
\ExplSyntaxOff
\newcommand\see[2]{, \emph{see} #1}
\begin{document}
\begin{itemize}
\item Texta\eatline116,
153
\item Textb\eatline\see{Texta}{162}
\end{itemize}
Wanted output:
\begin{itemize}
\item Texta
\item Textb\see{Texta}{162}
\end{itemize}
\end{document}
如果标记不是数字或逗号,则将其重新插入,否则检查另一个标记。
类似的东西{abc}
可以在没有大括号的情况下重新插入,但在这种情况下似乎不是一个问题。
这个问题}
可以在开始时通过一次\peek_catcode:NTF
检查来解决。
答案2
如果您不打算使用大于该值的页码,2^31-1
那么这可能会起作用。
该命令启动一个组,然后将、和的\uf_eatline:
设置为 9,然后使用原始整数赋值来消耗剩余的数字(在此过程中扩展标记),直到找到非数字。最后,使用 将 catcodes 恢复正常。即使函数后面没有数字,并且在egreg 提到的情况下,这应该也能正常工作。\catcode
,
^^M
\afterassignment\endgroup
\eatline
{Whatever\eatline}
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_set_eq:NN \uf_after_assignment:N \tex_afterassignment:D
\int_new:N \l_uf_tmpa_int
\cs_new:Nn \uf_eatline:
{
\group_begin:
\char_set_catcode_ignore:n { `\, }
\char_set_catcode_ignore:n { `\ }
\char_set_catcode_ignore:n { `\^^M }
\tex_endlinechar:D = 32
\uf_after_assignment:N
\group_end:
\l_uf_tmpa_int = 0
}
\cs_set_eq:NN\eatline\uf_eatline:
\ExplSyntaxOff
\newcommand\see[2]{, \emph{see} #1}
\begin{document}
\begin{itemize}
\item Texta\eatline116,
153
\item Textb\eatline\see{Texta}{162}
\end{itemize}
Wanted output:
\begin{itemize}
\item Texta
\item Textb\see{Texta}{162}
\end{itemize}
\end{document}