如何停止将 ^^M 转换为空格?

如何停止将 ^^M 转换为空格?

是否可以^^M在 token 列表中显示?现在它只是转换为空格,但我需要它在 token 中可见。这是代码:

\documentclass{article}
\usepackage{iexec}
\usepackage{environ}
\newtoks\tempnotetoks
\NewEnviron{note}{%
  \catcode`\\=12%
  \tempnotetoks=\expandafter{\BODY}%
  \iexec{echo '\the\tempnotetoks'}%
}
\begin{document}
\begin{note}
One \foo
  Two
\end{note}
\end{document}

日志内容如下:

iexec: [echo 'One \foo Two' > iexec.tmp]

然而,我想要这样的东西:

iexec: [echo 'One \space \foo \eol \space \space Two' > iexec.tmp]

我希望行尾和空格都成为标记。

答案1

您不需要通过令牌寄存器来抑制 e-tex 的扩展,您\unexpanded也不需要使用包来用当前的 latex 抓取环境体。

因为您正在抓取主体,所以定义内的 catcode 更改没有效果,但您可以在抓取主体之前更改钩子中的 catcode。

\show在这里使用而不是 shell escape,

换行符被转换为活动的 cntrl-M,也就是\let\obeyedline在这里展示如何定义,虽然它在这里显示为未扩展的控制 M,但扩展被抑制(它是一个单独的 ascii 13 字符,它只是显示^^M在日志输出中)

\documentclass{article}


\NewDocumentEnvironment{note}{b}{%
  \edef\qqq{echo '\unexpanded{#1}'}%
  \show\qqq
}{}
\begin{document}
\begin{note}
One \foo
  Two
\end{note}

\AddToHook{env/note/before}{\def\obeyedline{[newline]}\obeylines\obeyspaces}
\begin{note}
One \foo
  Two
\end{note}
\end{document}

生产

> \qqq=macro:
->echo 'One \foo Two'.
\environment note code ...panded {#1}'}\show \qqq 
                                                  
l.12 \end
         {note}
? 
> \qqq=macro:
->echo '^^MOne \foo ^^M  Two^^M'.
\environment note code ...panded {#1}'}\show \qqq 
                                                  
l.18 \end
         {note}
?

\obeylines\obeyspaces在第二次调用中可以看到效果。



为了获得更完整的“逐字书写”,请查看环境代码,filecontents但简单版本是

\documentclass{article}

\newwrite\nfile
\immediate\openout\nfile=\jobname.txt

\NewDocumentEnvironment{note}{b}{%
  \immediate\write\nfile{\detokenize{#1}}%
}{}

\AddToHook{env/note/before}{%
\newlinechar=\endlinechar
\obeylines\obeyspaces}

\begin{document}

\begin{note}
One \foo
  Two
\end{note}

\end{document}

这使得.txt文件


One \foo 
  Two

相关内容