定义一个宏将操作应用于\\

2021-02-03 21:17

分隔的文本我希望定义这样一个命令(比如说\test)将操作(比如说\action)应用于\\分隔的文本,例如\test{a\\B\\C}将变成\action{a}\\\ action{B}\\\ action{C}

解答动态

  • \etoolbox中的DeclareListParser就是为此而设计的,它允许您定义一个带有自定义列表分隔符的列表解析器。(编辑:修复了一个缺点,感谢cgnieder!)
    \
    \
    \\文献资料收集{文章}\\资料收集{{文章}\\元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元元{{{{^ A\\B\\C}\更新命令{\action}[1]{\emph{1}!}%\test{A\\B\\C}\end{document}

    • 有一种基于TeX p的经典(可能是最简单的)方法基本体:
      \def\test#1{\testA#1\\\end\\}\def\testA#1\\{\ifx\end#1\empty\else\action{1}\expandafter\testA\fi}\def\action#1{参数为:#1\par}\test{A\\B\\C} 如果需要在操作之间插入一些内容,例如\actionbetween,则宏稍微复杂一些,但完全可以扩展太:
      \def\test#1{\testA#1\\\ end\\\}\def\testA#1\\\ 2\\{\ifx\end#1\empty\else\action{1}\ifx\end#2\empty\else\actionbetween\fi\afterfi{\testA#2\\}\fi}\def\afterfi#1#2\fi#1}\def\action{参数为#1\par}\def\actionbetween{\string\\}\test{A\\B\\C} \documentclass{arlticle}\usepackage{listofitems}\newcommand\action[1]{%\setsepchar{\\\}%\readlist\myparse{1}%\foreachitem\z\in\myparse[]{%\expandafter\theaction\expandafter{\z}\myparsep[\zcnt]}%}\newcommand\theaction{\textit}\begin{document}\action{A\\B\\C pluore}\renewcommand\theaction{\textsc}\action{A\\B\\C plus more}\end{document}
      要使其更通用,还可以将其设置为指定分隔符。注意,在第二个例子中,分隔符标记不受小型大写操作的约束。
      \documentclass{arlticle}\usepackage{listofitems}\newcommand\action[1]{%\readlist\myparse{{1}%\foreachitem\z\in\myparse[]{%\expandafter\theaction\expandafter{\z}\myparseep[\zcnt]%}\setsepchar{\\}\newcommand\theaction{\textit}\begin{document}\action{A\\B\\C pluore}\renewcommand\theaction{\textsc}\setsepchar{(Hi-Mom)\\}\action{A(Hi-Mom)\\B(Hi-Mom)\\C plus more}\end{document}

      • 基于expl3.
        ,有一个相当通用的方法来满足您的需要。
        输入按指定的分隔符进行拆分(并修剪项目周围的空格);每个项目按模板的指定进行“修饰”,其中当前项用#1表示;最后,“装饰项”是用它们之间指定的分隔符(任何有效代码)输出的。
        请注意,如果在另一个命令的定义中使用了\actonlist,则template参数应具有##1。
        \documentclass{article}\ExplSyntaxOn\NewDocumentCommand{\actonlist}{m+m}{%#1=输入分隔符%#2=template%#3=输出separator%#4=列表\jinwen_动作列表:nnnn{1}{2}{3}{4}}\seq_新:N\金文演员名单_新:N\金文演员名单_受保护:Nn\金文_动作列表:nnnn{\序列集_拆分:Nnn\列在{1}{4}\列中_地图:NNn\我是金文演员,我是金文演员,我是金文演员,我是金文演员,我是金文演员\序号_用途:Nn\人民大学(UUUUUJinwen)目前的调查结果是:企业联盟(UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUnlist{,}{\textbf{##1}}{(这里是par)\par}{#1}%}\testcomma{a,B,C}\end{document} 您可以从“herea par”中看到,输出分隔符只在项之间使用。如果您还需要在最后使用它,只需将它添加到\test的定义中,即
        \newcommand{\test}[1]{%\actonlist{\\}{\emph{##1}}{(这里是par)\par}{1}(这里是par)\par}

        • End

        免责声明:

        本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。