从输入流中删除一些标记

从输入流中删除一些标记

我需要一个命令来删除后面的所有标记(数字、逗号、空格或换行符),并在遇到其他标记时停止。我可以通过嵌套大量 来实现这一点\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}

在此处输入图片描述

相关内容