写入文件时出现扩展的奇怪行为

写入文件时出现扩展的奇怪行为

我想将一些数据写入文件,但我需要事先替换这些数据中的子字符串。由于某种原因,通过宏进行扩展\write不会产生预期的结果。相反,在执行替换的控制序列和其参数之间添加了一个空格,然后停止求值。这是一个 MWE:

\documentclass{article}

\usepackage{xparse}

\usepackage{expl3}

\newwrite\file

\immediate\openout\file=foo.txt

\begin{document}


\ExplSyntaxOn
\cs_generate_variant:Nn \tl_replace_all:Nnn { Nfn }
\NewDocumentCommand{\myreplace}{m}
 {
   \tl_set:Nn \l__maxdd_argument_tl { #1 }

  \tl_replace_all:Nfn \l__maxdd_argument_tl { \c_colon_str } { }
  \tl_use:N \l__maxdd_argument_tl
 }
\tl_new:N \l__maxdd_argument_tl%
\ExplSyntaxOff

\immediate\write\file{\myreplace{bar:bar}}
\immediate\closeout\file

\end{document}

我原本希望看到的barbar\myreplace {bar:bar}

答案1

\write通过纯扩展工作,并且您的\myreplace命令不可扩展(并且不能扩展)。您需要在将标记列表传递到写入阶段之前进行替换。

\documentclass{article}

\usepackage{xparse}
%\usepackage{expl3} % already loaded by xparse

\ExplSyntaxOn

\NewDocumentCommand{\writefile}{smm}
 {% #1 = * if replacement is needed
  % #2 = file name
  % #3 = text to write
  \tl_set:Nn \l__saroupille_writefile_tl { #3 }
  \IfBooleanT{#1}
   {
    \tl_replace_all:NVn \l__saroupille_writefile_tl \c_colon_str { }
   }
  \saroupille_writefile:nV { #2 } \l__saroupille_writefile_tl
 }

\cs_generate_variant:Nn \tl_replace_all:Nnn { NVn }

\iow_new:N \g__saroupille_writefile_iow
\tl_new:N \l__saroupille_writefile_tl

\cs_new_protected:Nn \saroupille_writefile:nn
 {
  \iow_open:Nn \g__saroupille_writefile_iow { #1 }
  \iow_now:Nn \g__saroupille_writefile_iow { #2 }
  \iow_close:N \g__saroupille_writefile_iow
 }
\cs_generate_variant:Nn \saroupille_writefile:nn { nV }

\ExplSyntaxOff

\begin{document}

\writefile{\jobname-colon.txt}{bar:bar}
\writefile*{\jobname-nocolon.txt}{bar:bar}

\input{\jobname-colon.txt}

\input{\jobname-nocolon.txt}

\end{document}

在此处输入图片描述

答案2

expl3正则表达式可以起作用但比您在这里需要的要复杂得多,您可以简单地使用:分隔宏来删除:。

\documentclass{article}

\newwrite\file

\immediate\openout\file=foo.txt

\def\myreplace#1{\xmyrepl#1\xxmyrepl:}
\def\xmyrepl#1:{#1\xmyrepl}
\def\xxmyrepl#1{}

\begin{document}

\immediate\write\file{\myreplace{bar:bar}}
\immediate\closeout\file

\end{document}

相关内容