是否可以^^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